首先,ATS的技术行为不会有任何变化(除了新增两个字段NSAllowsArbitraryLoadsInWebContent和NSRequiresCertificateTransparency,也就是更细分权限)。从技术角度来看,ATS在iOS10中和iOS9中的表现完全一致。
那么到底是什么变化了呢?我们会收紧审核政策,即对于开发者添加的ATS例外(即HTTP接口),要求提供一个“合理的解释”。之所以要增加这么一个“麻烦”,是为了避免开发者们都无脑地全局关闭ATS,使得ATS偏离其初衷,形同虚设。开发者将无法再无脑地全局关闭ATS,并且添加例外时需要提供合理的解释。如此看来,苹果是想以这样的形式教育和促进HTTPS的普及,但也没有激进到一刀切的地步。一句话总结:你仍然可以在2017年之后使用HTTP接口,但需要在ATS中添加例外,同时审核时多少说两句理由。更重要的是,你要知道这个政策会越来越紧。躲得过初一,躲不过十五。早点开始考虑向HTTPS迁移吧!针对 Info.plist
iOS 10 在之前版本中,app都在 Info.plist 中添加 NSAppTransportSecurity
字典并且将 NSAllowsArbitraryLoads 设置为YES来禁用 ATS。iOS 10中又添加了 NSAllowsArbitraryLoadsInWebContent 字典,这会对迁移方案产生什么影响呢?根据苹果要求,app 已经不能再使用之前的方式来禁用 ATS,也就意味着 NSAllowsArbitraryLoads 只能设置为 NO,否则就需要在审核时说明 app 不支持ATS的原因。业内大神王巍已经总结了一幅非常直观的ATS对HTTP影响图表,如下:1、NSAllowsArbitraryLoads 设置为 YES 似乎可以解决问题,但这不符合苹果ATS要求。3、NSAllowsArbitraryLoads ,NSAllowsArbitraryLoadsInWebContent 都设置为 NO,HTTP全部不可用。
4、NSAllowsArbitraryLoads 设置为 YES,NSAllowsArbitraryLoadsInWebContent 设置为 NO,HTTP只支持iOS 9但不符合ATS要求,而且iOS 10下的 WKWebview也不可用。
5、NSAllowsArbitraryLoads ,NSAllowsArbitraryLoadsInWebContent 都设置为 YES,HTTP只有 WKWebView 支持。
综合苹果要求,与实际产品业务需求,选择使用 NSAllowsArbitraryLoads 设置为 NO (避免审核风险),NSAllowsArbitraryLoadsInWebContent 设置为 YES(允许链接HTTP),设置HTTP域名访问白名单,使用WKWebView作为Web容器的技术方案。
针对NSURLSession API
只需将网络库更新至最新版的AFNetworking,即可完美支持HTTP、HTTPS的API请求。
针对Web容器
使用 WKWebView 替换 UIWebView,业务对接采用Web与Native交互协议来解决兼容问题。iOS 10 中 WKWebView 完美支持HTTP、HTTPS的链接浏览(包括在线视频播放)。
针对网络图片下载库SDWebImage
测试环境下将会使用自签名的SLL证书,需要修改一些代码才能支持,生产环境下使用商业签名证书无需做修改。
针对第三方HTTP链接
可以设置 NSExceptionDomains 属性来将需要排除强制验证的域名写进来。 也就是说我如果我们的 app 只访问我们自己的服务器, 我们可以将我们服务器的域名添加进来,依然可以继续使用 HTTP。但我们不能像之前那样简单粗暴的直接把所有的请求都通过。NSExceptionDomains 的设置方法如下, 比如我们要将 campus.chinahr.com 这个域名排除在 ATS 验证之外,就可以这样:
不过苹果建议如果要提供浏览器类的服务,请使用SFSafariViewController(UI不可定制),优于WKWebView,后者更适用于对用户访问web内容更有把控的情况。