iOS10新特性及Xcode8兼容适配资料整理

iOS10新特性及Xcode8兼容适配资料整理

兼容iOS10资料整理

一、证书管理

  • Xcode8打开工程后,比较明显的就是下图了,这个是苹果的新特性,可以帮助我们自动管理证书。建议勾选这个Automatically manage signing:

1

  •  
  1. Xcode未设置开发者账号情况:

2

  • Xcode的偏好设置中,添加苹果账号即可。
  1. 设备机器未添加进开发者的Device的情况:

3

  •  

    3、正常情况下的截图:

4

二、Notification(通知)

 iOS10中将通知相关的API都统一到了UserNotifications.framework框架中,在此基础上很多用户定义的通知,并且可以捕捉到各个通知状态的回调。以前通知的概念是:大家想接受的提前做好准备,然后一下全两分发,没收到也不管了,也不关心发送者,现在的用户通知做成了类似于网络请求,先发一个request得到response的流程,还封装了error,可以在各个状态的方法中做一些额外的操作,并且能获得一些字段,比如发送者之类的.这个功能的头文件是:#import <UserNotifications/UserNotifications.h>
主要有以下文件:

5

相关资料:https://onevcat.com/2016/08/notification/

三、ATS的问题

    WWDC 15 提出的 ATS (App Transport Security) 是 Apple 在推进网络通讯安全的一个重要方式。iOS9 中默认非HTTPS的协议是被禁止的,当然,因为这样的推进影响面非常广,作为缓冲,解决方案是我们可以在info.plist文件中添加AppTransportSecuritySettings字典,将NSAllowsArbitraryLoads设置为YES来禁用ATS。

不过iOS10从2017年1月1日起苹果不允许我们通过这个方法跳过ATS,也就是说强制我们使用HTTPS,苹果App Store中的所有App都必须启用 App Transport Security(ATS)安全功能。如果不这样的话提交APP可能会被拒绝。

App Transport Security(应用程序安全传输),简称 ATS,是苹果在 iOS 9 中首次推出的一项隐私安全保护功能,启用ATS后,它会屏蔽明文HTTP资源加载,强制App通过HTTPS连接网络服务,通过传输加密保障用户数据安全。ATS要求服务器必须支持传输层安全(TLS)协议1.2以上版本;证书必须使用SHA256或更高的哈希算法签名;必须使用2048位以上RSA密钥或256位以上ECC算法等等,不满足条件的证书,ATS都会拒绝连接。强制开启ATS体现了苹果一贯的隐私保护态度。
开发者需要HTTPS证书,可以到沃通CA申请,沃通CA还推出了免费的https证书,兼容苹果所有设备。

这方面的相关规定和几个事实如下:

  1. 默认情况下你的app要可以访问加密足够强的HTTPS内容。这对所有的网络请求都有效,包括NSURLSession,UIWebView以及WKWebView等。
  2. 你依然可以添加NSAllowsArbitraryLoads为YES来禁用ATS,不过如果这样做的话,需要在提交app时进行说明,为什么需要访问非HTTPS内容,一般来说,可能类似浏览器类的app比较容易通过。
  3. 相比于使用NSAllowsArbitraryLoads将全部HTTP内容开放,选择使用NSExceptionDomains来针对特定的域名开放HTTP应该相对更容易过审核。
  4.  
  5. NSExceptionDomains设置白名单的方式来针对特定的域名开放HTTP内容来通过审核。可以简单理解成,把不支持https协议的接口设置成http的接口。
  6.  

    1)在项目info.plist中添加一个Key:App Transport Security Settings,类型为

       Dictionary;

  •    )在其内添加一个Key: Exception Domains,类型为Dictionary;

    3)在Exception Domains内添加要支持的域,其中域作为Key,类型为Dictionary;

  • )每个域下面需要设置3个属性:类型为Boolean; 

       NSIncludesSubdomains  YES

      NSExceptionRequiresForwardSecrecy  NO

       NSExceptionAllowsInsecureHTTPLoads  YES

6

  •    HTTP,也是需要设置的图片的域。
  1. 对于网页浏览和视频播放的行为,iOS10中新加入了NSAllowsArbitraryLoadsInWebContent键。通过将它设置为YES,可以让你的app中的WKWebView和使用AVFoundation播放的在线视频不受ATS的限制。
  2.      API 请求,基本上是必须使用 HTTPS 的,特别是如果自己可以管理服务器的话。可能需要后端尽快升级到 HTTPS。

四、iOS10 隐私权限的配置

    iOS10开始对隐私权限的数据保护更加严格,如果不设置会直接   崩溃。简单的说就是访问用户数据前都需要先在info.plist文件中声明,添加对应的key-value。这些用户数据包括:

7

iOS10之前,只需要获取位置时添加配置,现在更严格了,比如调用相册权限,也需要在info.plist中配置privacy.

这些key的名字Xcode 8中已经自动补全。添加一个属性后,输入Privacy后会出现自动提示:

8

后面填的string会在弹出用户允许时展示在描述里,如果空着提交AppStore时会拒绝。列举几个:

9

五、Xcode8屏蔽杂乱无章的logs

10

    更新Xcode8之后,新建立工程,都会打印一些无意义的乱七八糟的log输出,这应该是Xcode8的问题,解决方法是设置OS_ACTIVITY_MODE:disable

11

六、UIStatusBar方法过期

12

    在iOS10中,如果还使用以前设置UIStatusBar类型或者控制隐藏还是显示的方法,会报警告,方法过期,需要进行适配,要想修改UIStatusBar的样式或者状态使用下图所示的属性或者方法:

13

七、UICollectionViewCell的优化

    随着开发者对UICollectionView的信赖,项目中用到的地方比较多,但还是存在一些问题,比如卡顿、加载慢等。iOS10对UICollectionView进一步的优化:

iOS 10 之前UICollectionViewCell的生命周期是这样的:

  • 1.用户滑动屏幕,屏幕外有一个cell准备加载进来,把cell从reusr队列拿出来,然后调用prepareForReuse方法,在这个方法里面,可以重置cell的状态,加载新的数据;
  • 2.继续滑动,就会调用cellForItemAtIndexPath方法,在这个方法里面给cell赋值模型,然后返回给系统;
  • 3.当cell马上进去屏幕的时候,就会调用willDisplayCell方法,在这个方法里面我们还可以修改cell,为进入屏幕做最后的准备工作;
  • 4.执行完willDisplayCell方法后,cell就进去屏幕了.当cell完全离开屏幕以后,会调用didEndDisplayingCell方法.

iOS 10 UICollectionViewCell的生命周期是这样的:

  • 1.用户滑动屏幕,屏幕外有一个cell准备加载进来,把cell从reusr队列拿出来,然后调用prepareForReuse方法,在这里当cell还没有进去屏幕的时候,就已经提前调用这个方法了,对比之前的区别是之前是cell的上边缘马上进去屏幕的时候就会调用该方法,而iOS 10 提前到cell还在屏幕外面的时候就调用;
  • 2.在cellForItemAtIndexPath中创建cell,填充数据,刷新状态等操作,相比于之前也提前了;
  • 3.用户继续滑动的话,当cell马上就需要显示的时候我们再调用willDisplayCell方法,原则就是:何时需要显示,何时再去调用willDisplayCell方法;
  • 4.当cell完全离开屏幕以后,会调用didEndDisplayingCell方法,跟之前一样,cell会进入重用队列.
    在iOS 10 之前,cell只能从重用队列里面取出,再走一遍生命周期,并调用cellForItemAtIndexPath创建或者生成一个cell.
    在iOS 10 中,系统会把cell保存一段时间,也就是说当用户把cell滑出屏幕以后,如果又滑动回来,cell不用再走一遍生命周期了,只需要调用willDisplayCell方法就可以重新出现在屏幕中了.
    iOS 10 中,系统是一个一个加载cell的,以前是一行一行加载的,这样就可以提升很多性能.
  • iOS 10 新增加的Pre-Fetching预加载

这个是为了降低UICollectionViewCell在加载的时候所花费的时间,在 iOS 10 中,除了数据源协议和代理协议外,新增加了一个UICollectionViewDataSourcePrefetching协议,这个协议里面定义了两个方法:

– (void)collectionView:(UICollectionView *)collectionView prefetchItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths NS_AVAILABLE_IOS(10_0);  -(void)collectionView:(UICollectionView *)collectionView cancelPrefetchingForItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths  NS_AVAILABLE_IOS(10_0);

在ColletionView prefetchItemsAt indexPaths这个方法是异步预加载数据的,当中的indexPaths数组是有序的,就是item接收数据的顺序;
CollectionView cancelPrefetcingForItemsAt indexPaths这个方法是可选的,可以用来处理在滑动中取消或者降低提前加载数据的优先级.
注意:这个协议并不能代替之前读取数据的方法,仅仅是辅助加载数据.
Pre-Fetching预加载对UITableViewCell同样适用.

八、iOS10 UIColor新增方法

    官方文档中说:大多数core开头的图形框架和AVFoundation都提高了对扩展像素和宽色 域色彩空间的支持.通过图形堆栈扩展这种方式比以往支持广色域的显示设备更加容易。现在对UIKit扩展可以在sRGB的色彩空间下工作,性能更好,也可 以在更广泛的色域来搭配sRGB颜色.如果你的项目中是通过低级别的api自己实现图形处理的,建议使用sRGB,也就是说在项目中使用了RGB转化颜色 的建议转换为使用sRGB,在UIColor类中新增了两个api:

- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
 + (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);

因为之前我们都是用RGB来设置颜色,在iOS10官方建议我们使用sRGB,因为它性能更好,色彩更丰富。

九、UITextField

    在iOS 10 中,UITextField新增了textContentType字段,是UITextContentType类型,它是一个枚举,作用是可以指定输入框的类型,以便系统可以分析出用户的语义.是电话类型就建议一些电话,是地址类型就建议一些地址.可以在#import <UIKit/UITextInputTraits.h>文件中,查看textContentType字段,有以下可以选择的类型:

15

十、UIRefreshControl的使用

16

    在iOS10中,UIScrollView新增了refreshControl属性,只要继承了UIScrollView那么就支持刷新功能:

17

十一、iOS10判断系统版本正确方法

    判断系统版本使我们经常用到的,尤其是现在都有可能需要适配iOS10,那么问题就出现了:

18

substringToIndex:1在iOS 10 会被检测成 iOS 1了,所有判断系统版本最好还是用后面的两种方法。建议大家使用最后一中方法!

十二、Xcode8插件不能用的问题

    参考:http://t.cn/RcSHhSz

十三、iOS10 项目中有的文字显示不全问题

    用Xcode8和Xcode7.3分别测试如图:

19

20

创建一个Label然后让它自适应大小,字体大小都是17最后输出的宽度是不一样的,经过测试,英文字母没有问题,只有汉字有问题。目前只有一个一个修改控件解决这个问题,暂时没有其他好办法来解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值