适配iOS9

适配iOS9

前言:2015年9月8日,苹果宣布iOS 9操作系统的正式版在太平洋时间9月16日正式推出,北京时间9月17日凌晨1点推送。新的iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放。iOS9加入了更多的新功能,包括更加智能的Siri,新加入的省电模式。iOS9为开发者提供5000个全新的API等。而对于开发者来说,首当其冲的则是iOS9的适配问题。下面小结一下ios9适配问题:

https 和 http 网络:

  • 在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据。如果你的项目用的是http协议,而不做处理的话,那绝对是要崩溃的。
  • 解决方案1:暂时退回http协议。具体做法为:在项目的info.plist中添加一个Key:NSAppTransportSecurity,类型为字典类型。然后给它添加一个Key:NSAllowsArbitraryLoads,类型为Boolean类型,值为YES; 解决方案2:设置域。可以简单理解成,把不支持https协议的接口设置成http的接口。
    具体方法:
    1)、在项目的info.plist中添加一个Key:NSAppTransportSecurity,类型为字典类型。

    2)、然后给它添加一个NSExceptionDomains,类型为字典类型;

    3)、把需要的支持的域添加給NSExceptionDomains。其中域作为Key,类型为字典类型。

    4)、每个域下面需要设置3个属性:NSIncludesSubdomains、

    NSExceptionRequiresForwardSecrecy、NSExceptionAllowsInsecureHTTPLoads。均为

    Boolean类型,值分别为YES、NO、YES。

  • 详情:为了强制增强数据访问安全, iOS9 默认会把 所有的http请求 所有从NSURLConnection 、 CFURL 、 NSURLSession发出的 HTTP 请求,都改为 HTTPS 请求:iOS9.x-SDK编译时,默认会让所有从NSURLConnection 、 CFURL 、 NSURLSession发出的 HTTP 请求统一采用TLS 1.2 协议。因为 AFNetworking 现在的版本底层使用了 NSURLConnection ,众多App将被影响(基于iOS8.x-SDK的App不受影响)。服务器因此需要更新,以解析相关数据。如不更新,可通过在 Info.plist 中声明,倒退回不安全的网络请求。而这一做法,官方文档称为ATS,全称为App Transport Security,是iOS9的一个新特性。

Bitcode:

  • iOS 9新建项目默认需要支持bitcode,而不支持bitcode的SDK会导致无法编译运行。
  • 解决方案1:暂时关闭对bitcode的支持 解决方案2:移除不支持bitcode的平台SDK。
  • 详情:未来, Watch 应用必须包含 bitcode ,iOS不强制,Mac OS不支持。

    bitcode 是被编译程序的一种中间形式的代码。包含 bitcode 配置的程序将会在 App Store 上被编译和链接。 bitcode 允许苹果在后期重新优化我们程序的二进制文件,而不需要我们重新提交一个新的版本到 App Store 上。当我们提交程序到 App Store上时, Xcode 会将程序编译为一个中间表现形式( bitcode )。然后 App store 会再将这个 bitcode 编译为可执行的64位或32位程序。
    App Thinning 官方文档解释如下:

    The App Store and operating system optimize the installation of iOS and watchOS apps by tailoring app delivery to the capabilities of the user’s particular device, with minimal footprint. This optimization, called app thinning, lets you create apps that use the most device features, occupy minimum disk space, and accommodate future updates that can be applied by Apple. Faster downloads and more space for other apps and content provides a better user experience.
    开发者都知道,当前 iOS App 的编译打包方式是把适配兼容多个设备的执行文件及资源文件合并一个文件,上传和下载的文件则包含了所有的这些文件,导致占用较多的存储空间。
    
    App Thinning是一个关于节省iOS设备存储空间的功能,它可以让iOS设备在安装、更新及运行App等场景中仅下载所需的资源,减少App的占用空间,从而节省设备的存储空间。
    
    根据Apple官方文档的介绍,App Thinning主要有三个机制:
    
    Slicing
    
    开发者把App安装包上传到AppStore后,Apple服务会自动对安装包切割为不同的应用变体(App variant),当用户下载安装包时,系统会根据设备型号下载安装对应的单个应用变体。
    
    On-Demand Resources
    
    ORD(随需资源)是指开发者对资源添加标签上传后,系统会根据App运行的情况,动态下载并加载所需资源,而在存储空间不足时,自动删除这类资源。
    
    Bitcode 开启Bitcode编译后,可以使得开发者上传App时只需上传Intermediate Representation(中间件),而非最终的可执行二进制文件。 在用户下载App之前,AppStore会自动编译中间件,产生设备所需的执行文件供用户下载安装。
    
    (喵大(@onevcat)在其博客 《开发者所需要知道的 iOS 9 SDK 新特性》 中也描述了iOS 9中苹果在App瘦身中所做的一些改进,大家可以转场到那去研读一下。)
    
    其中,Bitcode的机制可以支持动态的进行App Slicing,而对于Apple未来进行硬件升级的措施,此机制可以保证在开发者不重新发布版本的情况下而兼容新的设备。
    
    Bitcode 是一种中间代码,那它是什么格式的呢? LLVM 官方文档有介绍这种文件的格式: LLVM Bitcode File Format 。
    
    如果你的应用也准备启用 Bitcode 编译机制,就需要注意以下几点:
    
    Xcode 7默认开启 Bitcode ,如果应用开启 Bitcode,那么其集成的其他第三方库也需要是 Bitcode 编译的包才能真正进行 Bitcode 编译
    开启 Bitcode 编译后,编译产生的 .app 体积会变大(中间代码,不是用户下载的包),且 .dSYM 文件不能用来崩溃日志的符号化(用户下载的包是 Apple 服务重新编译产生的,有产生新的符号文件)
    通过 Archive 方式上传 AppStore 的包,可以在Xcode的Organizer工具中下载对应安装包的新的符号文件
    

URL Scheme 白名单:

  • 在iOS 9下涉及到平台客户端跳转,系统会自动到项目info.plist下检测是否设置平台Scheme。对于需要配置的平台,如果没有配置白名单(白名单上限是50个:),就无法正常跳转平台客户端。因此要支持客户端的分享和授权等,需要配置Scheme名单。
  • 具体方法:

    1)、在项目的info.plist中添加一LSApplicationQueriesSchemes,类型为Array。

    2)、然后给它添加一个需要支持的项目,类型为字符串类型;

  • 详情:苹果为什么要这么做?在 iOS9 之前,你可以使用 canOpenURL: 监测用户手机里到底装没装微信,装没装微博。但是也有一些别有用心的 App ,这些 App 有一张常用 App 的 URL scheme,然后他们会多次调用canOpenURL: 遍历该表,来监测用户手机都装了什么 App ,比如这个用户装了叫“大姨妈”的App,你就可以知道这个用户是女性,你就可以只推给这个用户女性用品的广告。这是侵犯用户隐私的行为。
    这也许就是原因。

StatusBarStyle问题:

  • 如果你升级到Xcode7,编译的时候是不是会出现这样的警告呢:

    <Error>: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace,    please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
    <Error>: CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace,  please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
    <Error>: CGContextRestoreGState: invalid context 0x0. If you want to see the    backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
    
  • 原因是iOS9下有了新的设置状态栏的方法。具体解决方案:在 Info.plist 文件中做如下修改:
    将 View controller-based status bar appearance 删除(默认为 YES),或设置为YES:
    很显然我们现在不用这个方法了:[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];怎么搞呢?认真的童鞋会找到controller里有新的方法:
    - (UIStatusBarStyle)preferredStatusBarStyle;
    - (UIViewController *)childViewControllerForStatusBarStyle;
    - (void)setNeedsStatusBarAppearanceUpdate
    如果你想设置状态栏为白色,那么你只需在controller里重写:

    -(UIStatusBarStyle)preferredStatusBarStyle
    {
        return UIStatusBarStyleLightContent;
    }
    

    记得要 clean 下或者删除应用程序重新运行

    然而,我们的项目往往是navigationcontroller构成的,但是上面的三个新方法却是viewcontroller的方法,所以你必须这样

        - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
    }
    

    我们也可以用类别来实现:navigationcontroller没有preferredStatusBarStyle方法,那么就用类别给navigationcontroller加一下罗。

    .h文件:
    
    
    #import <UIKit/UIKit.h>
    
    @interface UINavigationController (StatusBarStyle)
    
    @end
    
    
    .m文件:
    
    
    #import "UINavigationController+StatusBarStyle.h"
    
    @implementation UINavigationController (StatusBarStyle)
    
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        return UIStatusBarStyleLightContent;
    }
    
    @end
    

.dSYM 文件引起的警告

  • 这是 debug 编译时导出符号文件出现的告警。新建的Xcode7工程是不会有这样的警告的。
  • 解决方案 :
    这里写图片描述

directory not found for option问题

  • Xcode7上你也许会碰到下面这个警告:

  • 原因是:Xcode7将framworks位置改变了。
  • 解决方案:

    点击项目,选择 Targets->xxxTests
    选择build setting ,找到 Frameworks Search Path 或者 Library Search Paths
    删除
    (SDKROOT)/Developer/Library/Frameworks使 (PLATFORM_DIR)/Developer/Library/Frameworks替换

    这里写图片描述

ipad的多任务 multi tasking

  • 大神说要想适配iPad的多任务,唯一的建议是:弃纯代码,改用storyboard、xib。。然而大神说得轻巧,我的整个工程完完全全的纯代码,不是说改就改的。。但是,当我打包的时候,错误就来了:

    ERROR ITMS-90475: "Invalid Bundle. iPad Multitasking support requires launch story board in bundle 'xxxx'."
    ERROR ITMS-90474: "Invalid Bundle. iPad Multitasking support requires these orientations: 'UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown,UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight'. Found 'UIInterfaceOrientationPortrait' in bundle 'xxxx'."
    

    既然这样了,想了想,我的项目里没有用到分屏显示呀,那就暂且关掉多任务罗:
    这里写图片描述

iOS9 下使用 Masonry 会引起崩溃的一种情况

  • 纯代码的项目,我们很喜欢用Masonry来进行适配。我们在使用时候一直将 leading 与 left 划为等号,这样做在 iOS8(及以前)上是正常的,但在 iOS9 上这样的观念可能会引起崩溃,比如:

     make.left.equalTo(self.mas_leading).offset(15);
    
    应该为:
     make.left.equalTo(self.mas_left).offset(15);
    
     同理 mas_training 也需要改为right
    

iOS9新特性-更灵活的后台定位

  • 【iOS9在定位的问题上,有一个坏消息一个好消息】坏消息:如果不适配iOS9,就不能偷偷在后台定位!好消息:将允许出现这种场景:同一App中的多个location manager:一些只能在前台定位,另一些可在后台定位,并可随时开启或者关闭特定location manager的后台定位。

  • 如何偷偷在后台定位:请求后台定位权限:

     // 1. 实例化定位管理器
    _locationManager = [[CLLocationManager alloc] init];
    // 2. 设置代理
    _locationManager.delegate = self;
    // 3. 定位精度
    [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    // 4.请求用户权限:分为:⓵只在前台开启定位⓶在后台也可定位,
    //注意:建议只请求⓵和⓶中的一个,如果两个权限都需要,只请求⓶即可,
    //⓵⓶这样的顺序,将导致bug:第一次启动程序后,系统将只请求⓵的权限,⓶的权限系统不会请求,只会在下一次启动应用时请求⓶
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
        //[_locationManager requestWhenInUseAuthorization];//⓵只在前台开启定位
        [_locationManager requestAlwaysAuthorization];//⓶在后台也可定位
    }
    // 5.iOS9新特性:将允许出现这种场景:同一app中多个location manager:一些只能在前台定位,另一些可在后台定位(并可随时禁止其后台定位)。
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
        _locationManager.allowsBackgroundLocationUpdates = YES;
    }
    // 6. 更新用户位置
    [_locationManager startUpdatingLocation];
    
  • 但是如果照着这种方式尝试,而没有配置Info.plist,100%你的程序会崩溃掉,并报错:

    *** Assertion failure in -[CLLocationManager setAllowsBackgroundLocationUpdates:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/CoreLocationFramework_Sim/CoreLocation-1808.1.5/Framework/CoreLocation/CLLocationManager.m:593
    

    要将 Info.plist 配置如下: enter image description here

    这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值