关于 iOS 10 中 ATS 的问题

关于 iOS 10 中 ATS 的问题

本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新。

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-11-28),这方面的相关规定和几个事实如下:

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

你依然可以添加NSAllowsArbitraryLoads为YES来全面禁用 ATS,不过如果你这么做的话,需要在提交 app 时进行说明,为什么需要访问非 HTTPS 内容。一般来说,可能简单粗暴地开启这个选项,而又无法找到正当理由的 app 会难以通过审核。

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

对于网页浏览和视频播放的行为,iOS 10 中新加入了NSAllowsArbitraryLoadsInWebContent和NSAllowsArbitraryLoadsForMedia键。通过将它们设置为YES,可以让你的 app 中的UIWebView、WKWebView或者使用AVFoundation播放的在线视频不受 ATS 的限制。虽然依然需要在审核时进行说明,但这也应该是绝大多数使用了相关特性的 app 的首选。坏消息是这个键在 iOS 9 中并不会起作用。

总结一下就是以下两点:

对于 API 请求,基本上是必须使用 HTTPS 的,特别是如果你们自己可以管理服务器的话。可能需要后端的同学尽快升级到 HTTPS (不过话说虽然是用 Let's Encrypt 的,我一个个人博客都启用 HTTPS 了,作为 API 的用户服务器,还不开 HTTPS 真有点说不过去)。如果使用的是第三方的 API,而他们没有提供 HTTPS 支持的话,需要在NSExceptionDomains中进行添加。

如果你的 app 只支持 iOS 10,并且有用户可以自由输入网址进行浏览的功能,或者是在线视频音频播放功能的话,只加入NSAllowsArbitraryLoadsInWebContent或/和NSAllowsArbitraryLoadsForMedia,并且将组件换成UIWebView或WKWebView,以及AVFoundation中的 player 就可以了。如果你还需要支持 iOS 9,并且需要访问网页和视频的话,可能只能去开启NSAllowsArbitraryLoads然后提交时进行说明,并且看 Apple 审核员的脸色决定让不让通过了。除了WKWebKit以外,另外一个访问网页的选择是使用SFSafariViewController。因为其实SFSafariViewController就是一个独立于 app 的 Safari 进程,所以它完全不受 ATS 的限制。

如果你需要使用内网,可以设置NSAllowsLocalNetworking,而不必担心 SSL 连接的问题。

另外,当NSAllowsArbitraryLoads和NSAllowsArbitraryLoadsInWebContent或NSAllowsArbitraryLoadsForMedia同时存在时,根据系统不同,表现的行为也会不一样。简单说,iOS 9 只看NSAllowsArbitraryLoads,而 iOS 10 会优先看InWebContent和ForMedia的部分。在 iOS 10 中,要是后两者存在的话,在相关部分就会忽略掉NSAllowsArbitraryLoads;如果不存在,则遵循NSAllowsArbitraryLoads的设定。说起来可能有点复杂,我在这里总结了一下根据NSAppTransportSecurity中设定条件不同,所对应的系统版本和请求组件的行为的不同,可以作为你设置这个字典时的参考 (表中使用了NSAllowsArbitraryLoadsInWebContent作为例子,NSAllowsArbitraryLoadsForMedia也同理):

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

NSAllowsArbitraryLoads: NOWebView❌❌默认行为

URLSession❌❌

NSAllowsArbitraryLoads: YESWebView✅✅彻底禁用 ATS

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

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

URLSession❌❌保证 API 的安全性

NSAllowsArbitraryLoads: NO & NSAllowsArbitraryLoadsInWebContent: NOWebView❌❌

URLSession❌❌

NSAllowsArbitraryLoads: YES & NSAllowsArbitraryLoadsInWebContent: NOWebView✅❌对于 iOS 10,NSAllowsArbitraryLoadsInWebContent 存在时忽略 NSAllowsArbitraryLoads 的设置

URLSession✅❌iOS 9 将继续使用 NSAllowsArbitraryLoads

NSAllowsArbitraryLoads: YES & NSAllowsArbitraryLoadsInWebContent: YESWebView✅✅对于 iOS 10,NSAllowsArbitraryLoadsInWebContent 存在时忽略 NSAllowsArbitraryLoads 的设置

URLSession✅❌iOS 9 将继续使用 NSAllowsArbitraryLoads

该列表是根据 Apple prerelease 的文档中关于NSAppTransportSecurity和NSAllowsArbitraryLoadsInWebContent部分的描述作出的。如果您发现这个行为发生了变化,或者上面的列表存在问题,欢迎留言,我会进行更正。

作为参考,这里将有效的NSAppTransportSecurity字典结构也一并附上:

NSAppTransportSecurity : Dictionary {    NSAllowsArbitraryLoads :BooleanNSAllowsArbitraryLoadsForMedia :BooleanNSAllowsArbitraryLoadsInWebContent :BooleanNSAllowsLocalNetworking :BooleanNSExceptionDomains : Dictionary {: Dictionary {            NSIncludesSubdomains : Boolean            NSExceptionAllowsInsecureHTTPLoads : Boolean            NSExceptionMinimumTLSVersion : String            NSExceptionRequiresForwardSecrecy : Boolean  // Default value is YES            NSRequiresCertificateTransparency : Boolean        }    }}

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

以此文章来加入Toptal移动应用自由职业者群组

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容