关于 iOS 10 中 ATS 的问题

WWDC 15 提出的 ATS (App Transport Security) 是 Apple 在推进网络通讯安全的一个重要方式。在 iOS 9 和 OS X 10.11 中,默认情况下非 HTTPS 的网络访问是被禁止的。当然,因为这样的推进影响面非常广,作为缓冲,我们可以在 Info.plist 中添加NSAppTransportSecurity字典并且将NSAllowsArbitraryLoads设置为YES来禁用 ATS。相信大家都已经对这个非常熟悉了,因为我自己也维护了一些网络相关的框架,所以我还自己准备了一个小脚本来快速关闭 ATS。

不过,WWDC 16 中,Apple 表示将继续在 iOS 10 和 macOS 10.12 里收紧对普通 HTTP 的访问限制。从 2017 年 1 月 1 日起,所有的新提交 app 默认是不允许使用NSAllowsArbitraryLoads来绕过 ATS 限制的,也就是说,我们最好保证 app 的所有网络请求都是 HTTPS 加密的,否则可能会在应用审核时遇到麻烦。

本文写作的时间点 (2016 年 6 月 17 日),这方面的相关规定和几个事实如下。但是似乎 Apple 安全部门对现在的情况也有些内部冲突,所以不排除在正式版中发生改变的可能性。我也会对此继续关注,并在需要的时候对本文进行更新。如果您发现了下面所述和事实不符的话,也欢迎留言提出,我会进行修正。

默认情况下你的 app 可以访问加密足够强 (TLSv1.2 以上,AES-128 和 SHA-2 以及 ECDHC 等) 的 HTTPS 内容。这对所有的网络请求都有效,包括NSURLSession,UIWebView以及WKWebView等。

你依然可以添加NSAllowsArbitraryLoads为YES来禁用 ATS,不过如果你这么做的话,需要在提交 app 时进行说明,为什么需要访问非 HTTPS 内容。一般来说,可能类似浏览器类的 app 比较容易能通过。

相比于使用NSAllowsArbitraryLoads将全部 HTTP 内容开放,选择使用NSExceptionDomains来针对特定的域名开放 HTTP 应该要相对容易过审核。“需要访问的域名是第三方服务器,他们没有进行 HTTPS 对应”会是审核时的一个可选理由,但是这应该只需要针对特定域名,而非全面开放。如果访问的是自己的服务器的话,可能这个理由会无法通过。

对于网页浏览和视频播放的行为,iOS 10 中新加入了NSAllowsArbitraryLoadsInWebContent键。通过将它设置为YES,可以让你的 app 中的WKWebView和使用AVFoundation播放的在线视频不受 ATS 的限制。这也应该是绝大多数使用了相关特性的 app 的选择。但是坏消息是这个键在 iOS 9 中并不会起作用。

总结一下就是,对于 API 请求,基本上是必须使用 HTTPS 的,特别是如果你们自己可以管理服务器的话。可能需要后端的同学尽快升级到 HTTPS (不过话说虽然是用 Let's Encrypt 的,我一个个人博客都启用 HTTPS 了,作为 API 的用户服务器,还不开 HTTPS 真有点说不过去)。如果你的 app 只支持 iOS 10,并且有用户可以自由输入网址进行浏览的功能,或者是在线视频音频播放功能的话,简单地加入NSAllowsArbitraryLoadsInWebContent,并且将组件换成WKWebKit或者AVFoundation就可以了。如果你还需要支持 iOS 9,并且需要访问网页和视频的话,可能只能去开启NSAllowsArbitraryLoads然后提交时进行说明,并且看 Apple 审核员的脸色决定让不让通过了。除了WKWebKit以外,另外一个访问网页的选择是使用SFSafariViewController。因为其实SFSafariViewController就是一个独立于 app 的 Safari 进程,所以它完全不受 ATS 的限制。

另外,当NSAllowsArbitraryLoads和NSAllowsArbitraryLoadsInWebContent同时存在时,根据系统不同,表现的行为也会不一样。简单说,iOS 9 只看NSAllowsArbitraryLoads,而 iOS 10 会先看NSAllowsArbitraryLoadsInWebContent。在 iOS 10 中,要是NSAllowsArbitraryLoadsInWebContent存在的话,就忽略掉NSAllowsArbitraryLoads,如果它不存在,则遵循NSAllowsArbitraryLoads的设定。说起来可能有点复杂,我在这里总结了一下根据NSAppTransportSecurity中设定条件不同,所对应的系统版本和请求组件的行为的不同,可以作为你设置这个字典时的参考。

ATS 设定使用的组件iOS 9 HTTPiOS 10 HTTP备注

NSAllowsArbitraryLoads: NOUIWebView❌❌

WKWebView❌❌默认行为

URLSession❌❌

NSAllowsArbitraryLoads: YESUIWebView✅✅禁用 ATS

WKWebView✅✅审核时需要说明理由

URLSession✅✅

NSAllowsArbitraryLoads: NO & NSAllowsArbitraryLoadsInWebContent: YESUIWebView❌❌只对网页内容禁用 ATS

WKWebView❌✅对于大多数 app 的推荐做法,

URLSession❌❌保证安全性

NSAllowsArbitraryLoads: NO & NSAllowsArbitraryLoadsInWebContent: NOUIWebView❌❌

WKWebView❌❌

URLSession❌❌

NSAllowsArbitraryLoads: YES & NSAllowsArbitraryLoadsInWebContent: NOUIWebView✅❌对于 iOS 10,

WKWebView✅❌NSAllowsArbitraryLoadsInWebContent 存在时忽略 NSAllowsArbitraryLoads 的设置

URLSession✅❌iOS 9 将继续使用 NSAllowsArbitraryLoads

NSAllowsArbitraryLoads: YES & NSAllowsArbitraryLoadsInWebContent: YESUIWebView✅❌对于 iOS 10,

WKWebView✅✅NSAllowsArbitraryLoadsInWebContent 存在时忽略 NSAllowsArbitraryLoads 的设置

URLSession✅❌iOS 9 将继续使用 NSAllowsArbitraryLoads

该列表是根据 Apple prerelease 的文档中关于NSAppTransportSecurity和NSAllowsArbitraryLoadsInWebContent部分的描述作出的。现在 (2016.06.17) 的 iOS 10 beta 和 Xcode 8 beta 版本中NSAllowsArbitraryLoadsInWebContent似乎还不能正确工作。在现在的 beta 版中,似乎只要存在NSAllowsArbitraryLoadsInWebContent,不论其设置如何,WKWebView都不能加载。如果这个行为发生了变化,或者上面的列表存在问题,欢迎留言,我会进行更正。

关于UIWebView是否也可以在NSAllowsArbitraryLoadsInWebContent为YES时访问 HTTP,Apple 内部似乎也在争论,但是个人认为是时候淘汰UIWebView了。如果没有特殊的什么需求的话,尽早将UIWebView全部换为WkWebView会是明智的选择。

不得不说,Apple 使用自己现在的强势地位,在推动技术进步上的做的努力是有目共睹的。不论是前几天强制支持 IPv6,还是现在的 HTTPS,其实都不是很容易就能作出的决定。而为用户构建一个更安全的使用环境,可能不仅是 Apple 单方面可以做的,也是需要开发者来配合的一件事情。尽快适配更进步和安全的使用方式,会是一件双赢的事情。

转自https://onevcat.com/2016/06/ios-10-ats/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏24K纯开源

Premiere&After Effects的实时预览插件开发

一、介绍         Adobe Premiere和After Effects在影视编辑、渲染领域已经得到广泛应用。全景视频在相应工具拼接好后也可以导入Pr...

26390
来自专栏数据和云

知己知彼-关于Oracle安全比特币勒索问题揭秘和防范

风险从来都不是臆想和草木皆兵,就在你不经意的时刻,可能风险就突然降临到我们的身边。 近期,国内很多用户的 Oracle 数据库,突然遭遇到莫名其妙的攻击事件,...

35950
来自专栏cmazxiaoma的架构师之路

蛋疼的ElasticSearch(四)之基本用法、高级查询

ElasticSearch系列文章: 1.蛋疼的ElasticSearch(一)之安装ElasticSearch 2.蛋疼的ElasticSearch(二)...

10340
来自专栏腾讯Bugly的专栏

黑科技:程序员如何打造属于自己的分体键盘

前言 作为一名程序员,键盘在手,天下我有啊,不整个高大上的键盘怎么提升B 格。之前一直想买个机械键盘,听说机械键盘敲代码时格外舒爽,实在是提升效率与 B 格的神...

39850
来自专栏小文博客

良心压缩软件Bandizip——无广告超精简

10.6K50
来自专栏精讲JAVA

订单系统中并发问题和锁机制的探讨

问题由来 假设在一个订单系统中(以火车票订单系统为例),用户A,用户B都要预定从成都到北京的火车票,A、B在不同的售票窗口均同时查询到了某车厢卧铺中、下铺位有空...

454110
来自专栏铭毅天下

抢先 | 支持sql的Elasticsearch6.3全景概览

像操作Mysql一样使用Elasticsearch,缩减DSL的学习成本,更多人爱上ES的特性。

25540
来自专栏图像识别与深度学习

《Android》Lesson24-综合项目实战

24380
来自专栏张善友的专栏

SQL Express - Client Synchronization Sample

Synchronization Services for ADO.NET 是微软推出的同步框架( Microsoft Synchronization Frame...

23190
来自专栏web编程技术分享

sql实现简单自增长

32760

扫码关注云+社区

领取腾讯云代金券