ATS 全称 App Transport Security,是 iOS 9 引入的一套安全机制,默认行为会强制保证所有的网络请求都使用 HTTPS。相信这个大家都有所了解。 在 iOS 10 中苹果对 ATS 的安全机制更加进步了一层,咱们来聊聊吧。
ATS 简介
如果你在 iOS 9 以上平台编译项目后,你会发现无论你使用 NSURLSession 请求接口数据,或者使用 WebView 打开网页,只要不是 HTTPS 协议都会失败。造成这个现象的原因就是 iOS 9 引入的 ATS 机制。
当然,苹果在引入这个特性的时候,也会考虑到开发者的过渡问题,所以还为我们留了一个开关,只需要在 Info.plist 中加上这个节点即可关闭 ATS 的默认行为:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
其中 NSAppTransportSecurity 是 ATS 设置项的根节点, NSAllowsArbitraryLoads 代表是否允许访问任意资源。 我们只需要将这个属性设置为 true, 就可以关闭 ATS 的默认拦截行为,继续使用 HTTP 了。
iOS 10 中的变化
iOS 10 依然延续了 ATS 机制。并且把它加强了。 从苹果官方目前发布出来的消息上看, 在 2017 年一月份开始,就不再允许开发者打开 NSAllowsArbitraryLoads 设置了。
也就是说,这种将 ATS 全局关闭的能力不给我们了。 可见苹果这次的决心。
那么,我们不能全局关闭 ATS 是否就意味着我们必须强制使用 HTTPS 呢? 下面咱们继续讨论。
ATS 除了提供一个 NSAllowsArbitraryLoads 属性,其实还有另外的属性。 可以设置 NSExceptionDomains 属性来将需要排除强制验证的域名写进来。 也就是说我如果我们的 app 只访问我们自己的服务器, 我们可以将我们服务器的域名添加进来,依然可以继续使用 HTTP。但我们不能像之前那样简单粗暴的直接把所有的请求都通过。这样就更加精确,其实对真正的用户来说,这其实是一个好事。尽管他们或许感知不到,但这样确实可以极大的减少用户的安全风险。