本文于 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。相信大家都已经对这个非常熟悉了。

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

现在 (2016-11-28),这方面的相关规定和几个事实如下:

  1. 默认情况下你的 app 可以访问加密足够强 (TLS v1.2 以上,AES-128 和 SHA-2 以及 ECDHC 等) 的 HTTPS 内容。这对所有的网络请求都有效,包括 NSURLSession,通过 AVFoundation 访问的流媒体,UIWebView 以及 WKWebView 等。
  2. 你依然可以添加 NSAllowsArbitraryLoads 为 YES 来全面禁用 ATS,不过如果你这么做的话,需要在提交 app 时进行说明,为什么需要访问非 HTTPS 内容。一般来说,可能简单粗暴地开启这个选项,而又无法找到正当理由的 app 会难以通过审核。
  3. 相比于使用 NSAllowsArbitraryLoads 将全部 HTTP 内容开放,选择使用 NSExceptionDomains 来针对特定的域名,通过设定该域名下的 NSExceptionAllowsInsecureHTTPLoads 来开放 HTTP 应该要相对容易过审核。“需要访问的域名是第三方服务器,他们没有进行 HTTPS 对应”会是审核时的一个可选理由,但是这应该只需要针对特定域名,而非全面开放。如果访问的是自己的服务器的话,可能这个理由会无法通过。
  4. 对于网页浏览和视频播放的行为,iOS 10 中新加入了 NSAllowsArbitraryLoadsInWebContent 和 NSAllowsArbitraryLoadsForMedia 键。通过将它们设置为 YES,可以让你的 app 中的 UIWebViewWKWebView 或者使用 AVFoundation 播放的在线视频不受 ATS 的限制。虽然依然需要在审核时进行说明,但这也应该是绝大多数使用了相关特性的 app 的首选。坏消息是这个键在 iOS 9 中并不会起作用。

总结一下就是以下两点:

  1. 对于 API 请求,基本上是必须使用 HTTPS 的,特别是如果你们自己可以管理服务器的话。可能需要后端的同学尽快升级到 HTTPS 。如果使用的是第三方的 API,而他们没有提供 HTTPS 支持的话,需要在 NSExceptionDomains 中进行添加。
  2. 如果你的 app 只支持 iOS 10,并且有用户可以自由输入网址进行浏览的功能,或者是在线视频音频播放功能的话,只加入 NSAllowsArbitraryLoadsInWebContent 或/和 NSAllowsArbitraryLoadsForMedia,并且将组件换成 UIWebView 或 WKWebView,以及 AVFoundation 中的 player 就可以了。如果你还需要支持 iOS 9,并且需要访问网页和视频的话,可能只能去开启 NSAllowsArbitraryLoads 然后提交时进行说明,并且看 Apple 审核员的脸色决定让不让通过了。除了 WKWebKit 以外,另外一个访问网页的选择是使用 SFSafariViewController。因为其实 SFSafariViewController 就是一个独立于 app 的 Safari 进程,所以它完全不受 ATS 的限制。
  3. 如果你需要使用内网,可以设置 NSAllowsLocalNetworking,而不必担心 SSL 连接的问题。

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

ATS 设定 使用的组件 iOS 9 HTTP iOS 10 HTTP 备注
NSAllowsArbitraryLoads: NO WebView 默认行为
  URLSession  
NSAllowsArbitraryLoads: YES WebView 彻底禁用 ATS
  URLSession 审核时需要说明理由
NSAllowsArbitraryLoads: NO & NSAllowsArbitraryLoadsInWebContent: YES WebView 只对网页内容禁用 ATS
  URLSession 保证 API 的安全性
NSAllowsArbitraryLoads: NO & NSAllowsArbitraryLoadsInWebContent: NO WebView  
  URLSession  
NSAllowsArbitraryLoads: YES & NSAllowsArbitraryLoadsInWebContent: NO WebView 对于 iOS 10,NSAllowsArbitraryLoadsInWebContent 存在时忽略 NSAllowsArbitraryLoads 的设置
  URLSession iOS 9 将继续使用 NSAllowsArbitraryLoads
NSAllowsArbitraryLoads: YES & NSAllowsArbitraryLoadsInWebContent: YES WebView 对于 iOS 10,NSAllowsArbitraryLoadsInWebContent 存在时忽略 NSAllowsArbitraryLoads 的设置
  URLSession iOS 9 将继续使用 NSAllowsArbitraryLoads

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

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

  1. NSAppTransportSecurity : Dictionary {
  2. NSAllowsArbitraryLoads : Boolean
  3. NSAllowsArbitraryLoadsForMedia : Boolean
  4. NSAllowsArbitraryLoadsInWebContent : Boolean
  5. NSAllowsLocalNetworking : Boolean
  6. NSExceptionDomains : Dictionary {
  7. <domain-name-string> : Dictionary {
  8. NSIncludesSubdomains : Boolean
  9. NSExceptionAllowsInsecureHTTPLoads : Boolean
  10. NSExceptionMinimumTLSVersion : String
  11. NSExceptionRequiresForwardSecrecy : Boolean // Default value is YES
  12. NSRequiresCertificateTransparency : Boolean
  13. }
  14. }
  15. }

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

关于 iOS 10 中 ATS / HTTPS /2017 问题的更多相关文章

  1. 关于 iOS 10 中 ATS 的问题

    本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新. WWDC 15 提出的 ATS (App Transport Security) 是 ...

  2. iOS 10 适配 ATS(app支持https通过App Store审核)

    iOS 10 适配 ATS 一. HTTPS 其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据 ...

  3. iOS 10 适配 ATS

    一. HTTPS 其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的 ...

  4. iOS 10 中引入了 Message 框架

    WWDC 2016 上最重磅的消息之一就是在 iOS 10 中引入了 Message 框架.开发者现在可以为苹果内置的 Messages 应用开发扩展啦.通过开发一个应用扩展,你可以让用户跟应用在 M ...

  5. 使用 Swift 在 iOS 10 中集成 Siri —— SiriKit 教程

    下载 Xcode 8,配置 iOS 10 和 Swift 3 (可选)通过命令行编译 除 非你想使用命令行编译,使用 Swift 3.0 的工具链并不需要对项目做任何改变.如果你想的话,打开 Xcod ...

  6. iOS 10中如何搭建一个语音转文字框架

    在2016WWDC大会上,Apple公司介绍了一个很好的语音识别的API,那就是Speech framework.事实上,这个Speech Kit就是Siri用来做语音识别的框架.如今已经有一些可用的 ...

  7. 分割视图控制器(UISplitViewController) 改_masterColumnWidth 导致在 IOS 10中出现闪退

    默认UISplitViewController的Master和Detail的宽度是固定的,可以通过下面的方式来改变 [splitViewController setValue:[NSNumber nu ...

  8. iOS 10 开发问题总结

    兼容iOS 10 资料整理笔记   1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大 ...

  9. 兼容iOS 10 资料整理笔记

    原文链接:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化 ...

随机推荐

  1. php进程的SIGBUS故障

    某个子站是php写的,访问的时候nginx时不时会冒出现502错误,高峰时更频繁,检查php-fpm的日志发现大量的 child exited on signal 7 (SIGBUS),并且和acce ...

  2. Web Application Project is configured to use IIS. Unable to access the IIS metabase.(配置为使用IIS Web应用程序xxxx项目。无法访问IIS元数据库。)

    这几天重装系统,装了win10,居然用vs2013打开项目出现下面这个提示错误,搞了很久才知道原因: Even though I am an administrator on the machine, ...

  3. C标准头文件<assert.h>

    <assert.h>定义了两个用来调试程序的宏: assert和NDEBUG,assert用来判断表达式是否为真,如果为真继续执行,如果为假,向stderr输出一条错误消息,并调用< ...

  4. BI Project Managerment

    Design doc is the meta data of the code. The project management plan is crucial to your project sinc ...

  5. Cinder 调试 - cinder service 状态为 down

    1. 问题 我们经常会发现某个cinder service 的状态为 down.比如下面例子中 controller 上的 cinder-scheduler 和 block1 节点上 cinder-v ...

  6. uva 725 division(水题)——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABVMAAAOHCAIAAAClwESxAAAgAElEQVR4nOydybGturJFcQEPfgQu4A

  7. LeetCode题解-----First Missing Positive

    Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0]  ...

  8. 三维网格形变算法(Laplacian-Based Deformation)

    网格上顶点的Laplace坐标(均匀权重)定义为:,其中di为顶点vi的1环邻域顶点数. 网格Laplace坐标可以用矩阵形式表示:△=LV,其中,那么根据网格的Laplace坐标通过求解稀疏线性方程 ...

  9. Spring MVC Spring MyBatis 整合 - 快速上手

    我个人比较喜欢写注释,在工作中对注释的重要性看的也比较高,所以大部分文字都在注释中,代码外的文字会写的偏少,关键能懂就行 先看一下整合后的工程目录(单工程,多工程以后会采用maven) 5个packa ...

  10. UICollectionView使用

    本文原文 原文转自 1.1. Collection View 全家福: UICollectionView, UITableView, NSCollectionView n   不直接等效于NSColl ...