美文网首页
iOS9适配注意事项

iOS9适配注意事项

作者: 祥子_HelloWorld | 来源:发表于2019-08-05 17:33 被阅读0次

    iOS9新变化

    iOS9网络适配_改用更安全的HTTPS

    iOS9把所有的http请求都改为https了:iOS9系统发送的网络请求将统一使用TLS 1.2 SSL。采用TLS 1.2 协议,目的是 强制增强数据访问安全,而且 系统 Foundation 框架下的相关网络请求,将不再默认使用 Http 等不安全的网络协议,而默认采用 TLS 1.2。服务器因此需要更新,以解析相关数据。如不更新,可通过在 Info.plist 中声明,倒退回不安全的网络请求。

    先看一下这个公式:
    HTTP+SSL/TLS+TCP = HTTPS



    目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。但是,主流浏览器都已经实现了TLS 1.2的支持。Apple让你的HTTP采用SSL/TLS协议,就是让你从HTTP转到HTTPS。

    TLS 1.2 协议 强制增强数据访问安全 系统 Foundation 框架下的相关网络请求,将不再默认使用 Http 等不安全的网络协议,而默认采用 TLS 1.2。服务器因此需要更新,以解析相关数据。如不更新,可通过在 Info.plist 中声明,倒退回不安全的网络请求。

    • 方案一:立即让公司的服务端升级使用TLS 1.2
    • 方案二:虽Apple不建议,但可通过在 Info.plist 中声明,倒退回不安全的网络请求依然能让App访问指定http,甚至任意的http

    Info.plist 配置中的XML源码如下所示:



    上面是比较严谨的做法,指定了能访问哪些特定的HTTP。当然也有暴力的做法: 彻底倒退回不安全的HTTP网络请求,能任意进行HTTP请求,比如你在开发一款浏览器App,或者你想偷懒,或者后台想偷懒,或者公司不给你升级服务器。。。


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

    Demo:GitHub地址

    【iOS9在定位的问题上,有一个坏消息一个好消息】坏消息:如果不适配iOS9,就不能偷偷在后台定位(不带蓝条,见图)!好消息:将允许出现这种场景:同一App中的多个location manager:一些只能在前台定位,另一些可在后台定位,并可随时开启或者关闭特定location manager的后台定位。
    如果没有请求后台定位的权限,也是可以在后台定位的,不过会带蓝条:


    image.png

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

    // 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 配置如下:



    对应的 Info.plist 的XML源码是:


    Bitcode(通俗解释:在线版安卓ART模式)

    未来Watch应用须包含Bitcode,iOS不强制,但Xcode7默认会开启Bitcode。
    如何适配?

    方法一:更新library使包含Bitcode,否则会出现以下中的警告;

    (null): URGENT: all bitcode will be dropped because '/Users/myname/Library/Mobile Documents/com~apple~CloudDocs/foldername/appname/GoogleMobileAds.framework/GoogleMobileAds(GADSlot+AdEvents.o)' was built without bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. Note: This will be an error in the future.
    

    方法二:关闭Bitcode,方法见下图


    企业级分发

    iOS9之前,企业级分发十分方便:点击App出现“信任按钮”,但iOS9及之后都要去

    • 设置 - 通用 - 描述文件 - 点击描述文件(弹框点击信任)
    URL scheme

    在iOS9中,如果使用URL scheme必须在"Info.plist"中将你要在外部调用的URL scheme列为白名单,否则不能使用。key叫做LSApplicationQueriesSchemes ,键值内容是

    LSApplicationQueriesSchemes urlscheme urlscheme2 urlscheme3 urlscheme4
    
    iPad适配Slide Over 和 Split View

    【iPad适配Slide Over 和 Split View】 若想适配multi tasking特性,唯一的建议:弃纯代码,改用storyboard、xib,纵观苹果WWDC所有Demo均是如此:

    1. Mysteries of Auto Layout, Part 1
    2. What's New in Storyboards
    3. Implementing UI Designs in Interface Builder
    4. Getting Started with Multitasking on iPad in iOS 9
    5. Optimizing Your App for Multitasking on iPad in iOS

    iOS9具体适配方法

    1. NSAppTransportSecurity

    iOS9让所有的HTTP默认使用了HTTPS,原来的HTTP协议传输都改成TLS1.2协议进行传输。直接造成的情况就是App发请求的时候弹出网络无法连接。解决办法就是在项目的info.plist 文件里加上如下节点:
    NSAppTransportSecurity - NSAllowsArbitraryLoads
    这个子节点的意思是:是否允许任性的加载?! 设为YES的话就将禁用了AppTransportSecurity转而使用用户自定义的设置,这个问题就解决了。


    2. 用Xcode7提交审核遇到 ITMS-90535 错误

    删除相关的Info.plist即可,一般是不小心打包进去的。比如ShareSDK里附带的TencentOpenApi_IOS_Bundle.bundle/Info.plist,(特别注意:如果这种情况下删掉了CFBundleExecutable但是app无法安装了,真机上也跑不起来了,这个问题你肯定是删了自己项目的Info plist里面的Key)如下图:



    3. 提交到itunes Connect时报错---“1 本地化存在错误。”
    如图

    问题分析:你的app某些必须填的信息没有填,把没有填的补充完整就好了(注意:以前默认是只有一个版本的,当我在升级Xcode7和适配iOS9以后,这里弹出两个版本,而且默认是繁体,于是我又加了个简体版本,忘记一些必须填的信息没有填,所以报这个错误)如图吧:


    4. iOS9字体微变后对文字稍微变大,对有些写死的label会出现"..."的情况

    iOS8中,字体是Helvetica,中文的字体有点类似于“华文细黑”。只是苹果手机自带渲染,所以看上去可能比普通的华文细黑要美观。iOS9中,中文系统字体变为了专为中国设计的“苹方” 有点类似于一种word字体“幼圆”。字体有轻微的加粗效果,并且最关键的是字体间隙变大了!
    所以很多原本写死了width的label可能会出现“...”的情况。

    为了在界面显示上不出错,就算是固定长度的文字也还是建议使用sizetofit 或者ios向上取整 ceilf() 或者提前计算

    CGSize size = [title sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14.0f]}];
    CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
    
    5. Bitcode

    bitcode的理解应该是把程序编译成的一种过渡代码,然后苹果再把这个过渡代码编译成可执行的程序。bitcode也允许苹果在后期重新优化我们程序的二进制文件,有类似于App瘦身的思想。

    用了xcode7的编译器编译之前没问题的项目可能会出现下列报错。

    XXXX’ does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
    

    问题的原因是:某些第三方库还不支持bitcode。要不然是等待库的开发者升级了此项功能我们更新库,要不就是把这个bitcode禁用。

    禁用的方法就是找到如下配置,选为NO.(iOS中bitcode是默认YES,watchOS中bitcodes是不让改的必须YES。)

    如图:


    6. iOS9对ShareSDK的影响

    在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据。对ShareSDK来说,具体表现可能是,无法授权、分享、获取用户信息等。
    还可能造成我们的编辑界面里传http之类的网络图片的时候,我们的编辑界面不会显示图片截图,解决的办法或者全面关闭https,允许使用http请求;或者把图片的域添加;又或者选择使用https的图片

    解决办法:
    设置域。可以简单理解成,把不支持https协议的接口设置成http的接口。

    • 在项目的info.plist中添加一个Key:NSAppTransportSecurity,类型为字典类型。
    • 然后给它添加一个NSExceptionDomains,类型为字典类型;
    • 把需要的支持的域添加給NSExceptionDomains。其中域作为Key,类型为字典类型。
    • 每个域下面需要设置3个属性:NSIncludesSubdomains、NSExceptionRequiresForwardSecrecy、NSExceptionAllowsInsecureHTTPLoads。均为Boolean类型,值分别为YES、NO、YES。


    添加Scheme白名单:
    问题描述:在iOS 9下涉及到平台客户端跳转,系统会自动到项目info.plist下检测是否设置平台Scheme。对于需要配置的平台,如果没有配置,就无法正常跳转平台客户端。因此要支持客户端的分享和授权等,需要配置Scheme名单。

    具体方法:

    • 在项目的info.plist中添加一LSApplicationQueriesSchemes,类型为Array。
    • 然后给它添加一个需要支持的项目,类型为字符串类型;


    bitcode

    大部分社交平台SDK不支持bitcode。
    问题描述:iOS 9新建项目默认需要支持bitcode,而不支持bitcode的SDK会导致无法编译运行。
    解决方案:

    • 暂时关闭对bitcode的支持(建议),方法如下图
    • 移除不支持bitcode的平台SDK。


    参考:https://github.com/ChenYilong/iOS9AdaptationTips
    http://wiki.mob.com/ios9-对sharesdk的影响(适配ios-9必读)/
    http://www.cnblogs.com/dsxniubility/p/4821184.html

    相关文章

      网友评论

          本文标题:iOS9适配注意事项

          本文链接:https://www.haomeiwen.com/subject/rfrpdctx.html