iOS 10 与 ATS - 更加安全的机制

swift 发布于 2017年11月20日
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。但我们不能像之前那样简单粗暴的直接把所有的请求都通过。这样就更加精确,其实对真正的用户来说,这其实是一个好事。尽管他们或许感知不到,但这样确实可以极大的减少用户的安全风险。

NSExceptionDomains 的设置方法如下, 比如我们要将 swiftcafe.io 这个域名排除在 ATS 验证之外,就可以这样:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>swiftcafe.io</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

上面说的是在我们已经确定 App 所访问的数据范围的情况下的处理方法。 但还有一种情况, 如果我们开发的是类似浏览器的 App。这样用户需要输入任意的地址,那怎么办呢? 我们不可能把所有的域名都写到 NSExceptionDomains 里面。

这就可以使用 iOS 10 对 ATS 提供的一个新属性 NSAllowsArbitraryLoadsInWebContent。 顾名思义了,就是只允许加载任意类型的 web 内容。这样我们的 WKWebView 就可以加载任何类型的页面了。

使用 NSAllowsArbitraryLoadsInWebContent 的例子:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>
结尾

总之 iOS 10 之后,对于 ATS 的安全保护会更加加强。也能看出苹果对于尽可能的去掉 HTTP 不安全性的决心。所以大家如果在提交新 App 的时候,需要注意一下这个特性,并及时作出相应的调整。


如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~

本站文章均为原创内容,如需转载请注明出处,谢谢。
关注微信公众号
发现更多精彩
swift-cafe