2017 ios适配ATS
iOS10 从2017年1月1日起苹果不允许我们通过这个方法跳过ATS,也就是说强制我们用HTTPS,如果不这样的话提交App可能会被拒绝。但是我们可以通过NSExceptionDomains来针对特定的域名开放HTTP可以容易通过审核。)
以前我们是这样做的
<key>NSAppTransportSecurity</key>
<dict> <key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2017年1月1日以后这个方法被禁止掉了
一、使用默认的ATS设置要满足:
1、https 要基于TLS 1.2或以上版本。
2、证书的加密的算法要至少要SHA256的算法,用至少是2048位的RSA的key 或至少是256位的Elliptic-Curve(ECC)的key所产生的证书
3、加密算法也是有限制,就是ATS中的ForwardSecrecy(超前的密码保护算法)配置项,需要在以下列表中,详见:苹果文档。
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHATLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHATLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
如果不符合上述3各要求,请求接口会报错:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
解决办法
1.开启https 这个很简单, 搞服务器的都可以搞定
2.我们需要一个SSL证书,自建证书达不到苹果要求,老板又不肯花钱,只能找找免费证书了.
阿里云免费证书 ,有效期1年,1年后要不要付费,谁知道1年后会怎样,目前还是通过审核要紧.
https://common-buy.aliyun.com/?commodityCode=cas#/buy
3.按照阿里云设置域名
4.部署到服务器上,有点要注意,要求服务器同事设置客户端免证书校验,这样我们方便,客户端不用设置证书了.
5.发现阿里云免费证书TLS 1.0 苹果要求TLS 1.2或以上版本,做以下设置
<key>NSAppTransportSecurity</key>
<dict> <key>NSExceptionDomains</key> <dict>
<key>xxxx.com</key>
<dict>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
大功告成!!