App Transport Security 相关

一、给站长的版本:

 

苹果将在 2017 年 1 月 1 日起,要求所有提交的 app 都支持 App Transport Security 配置(以下简称 ATS),具体影响到 app 所有网络连接,包括图片、API、流媒体等,以及在 WebView 中打开的网页。

因为使用「上线了」搭建的网站,暂时都不支持 HTTPS 配置。如果你将上线了网站页面内嵌在你自己开发的 iOS app 中展示,会存在无法正常访问的现象,要求你的 iOS app 针对这部分内容有特殊的配置,并重新提交一个新版本到 Apple App Store 审核具体配置方法参见第三部分。

值得注意的是,ATS 只会影响「app 发起的网络请求」,所以你的网站在 Safari 浏览器里的正常访问是不会受到影响的。在第三方 app,诸如「微信」「QQ」等可以传播、打开你的网页,则需要由第三方在他们的应用中进行配置。但一般来说,微信等较大第三方应用中访问你的上线了网站,都不会受到 ATS 的影响。

 

二、给程序员的版本:

 

苹果将在 2017 年 1 月 1 日起,要求所有提交的 app 都支持 App Transport Security 配置(以下简称 ATS),默认要求你所有的连接都经过加密( TLS v1.2 以上、AES-128 和 SHA-2 以及 ECDHC 等的 HTTPS),具体影响到 app 所有网络连接,包括图片、API、流媒体等,以及在 UIWebView/WKWebView 中打开的网页。

因为使用「上线了」搭建的网站,暂时都不支持 HTTPS 配置。如果你将上线了网站页面内嵌在你自己开发的 iOS app 中展示,会存在无法正常访问的现象,要求你的 iOS app 针对这部分内容有特殊的配置,并重新提交一个新版本到 Apple App Store 审核。具体配置方法参见第三部分。

值得注意的是,ATS 只会影响「app 发起的网络请求」,所以你的网站在 Safari 浏览器里的正常访问是不会收到影响的。在第三方 app,诸如「微信」「QQ」等可以传播、打开你的网页的,需要由第三方在他们的应用中进行配置。但一般来说,微信等较大第三方应用中访问你的上线了网站,都不会受到 ATS 的影响。

 

三、具体配置方法

 

在应用的 info.plist 文件中,添加 NSAppTransportSecurity 这个 key,这个 key 的 value 有三种写法,请针对自己的情况三选一。

1、使用 NSExceptionDomains 具体设置非 HTTPS 的域,域名除了上线了网站的域名,还要包括网站中外链的一切不是 HTTPS 的域名,比如图片地址、视频地址等:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>【你的上线了网站域名】</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>

2、使用 NSAllowsArbitraryLoadsInWebContent 绕过 UIWebView/WKWebView 中对安全内容的验证,带来的风险是 WebView 中可以访问任何没有通过 HTTPS 加密的内容,请自行考量其安全性,及承担带来的风险。

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

3、使用 NSAllowsArbitraryLoads 绕过 app 中一切对安全内容的验证,带来的风险是整个 app 所有的网络请求都可以不通过 HTTPS 加密。另外,苹果对采用这个设置的 app 的审核,原则上不过审,需要有特别的解释。请自行考量其安全性,及承担带来的风险。

<key>NSAppTransportSecurity</key> 
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>

 

 

参考连接:

1、苹果文档: https://developer.apple.com/library/prerelease/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW60

2、StackOverflow 提问: http://stackoverflow.com/questions/30731785/how-do-i-load-an-http-url-with-app-transport-security-enabled-in-ios-9

3、OneVCat 针对 ATS 的博客文章: https://onevcat.com/2016/06/ios-10-ats/

还有其它问题?提交请求