适配 iOS 9 所需要做的一些事情

App Transport Security

iOS 9 和 OS X Captian 带来了一个新的安全特性,也就是 App Transport Security,加强了应用中所谓网络连接的安全性。下面是 ATS 默认的安全要求:

  • The server must support at least Transport Layer Security (TLS) protocol version 1.2.
  • Connection ciphers are limited to those that provide forward secrecy (see the list of ciphers below.)
  • Certificates must be signed using a SHA256 or better signature hash algorithm, with either a 2048 bit or greater RSA key or a 256 bit or greater Elliptic-Curve (ECC) key. Invalid certificates result in a hard failure and no connection.

如果你的应用中使用到的网络链接 (比如请求服务器的 API)不符合以上要求,请求就会失败。那如何检测你的应用是否符合 ATS 的默认要求呢?可以在终端运行 nscurl --verbose --ats-diagnostics + url, 比如 nscurl --verbose --ats-diagnostics http://www.baidu.com, 可以看到第一条数据显示:

Default ATS Secure Connection  
---
ATS Default Connection  
ATS Dictionary:  
{
}
2015-09-13 13:08:37.117 nscurl[2290:248743] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)  
Result : FAIL  
Error : Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrust 0x7fc159e16e60 [0x7fff786a1890]>, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=(  
    "<SecCertificate 0x7fc159e15a60 [0x7fff786a1890]>",
    "<SecCertificate 0x7fc159e164a0 [0x7fff786a1890]>",
    "<SecCertificate 0x7fc159e167e0 [0x7fff786a1890]>"
), NSUnderlyingError=0x7fc159e26170 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrust 0x7fc159e16e60 [0x7fff786a1890]>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=(
    "<SecCertificate 0x7fc159e15a60 [0x7fff786a1890]>",
    "<SecCertificate 0x7fc159e164a0 [0x7fff786a1890]>",
    "<SecCertificate 0x7fc159e167e0 [0x7fff786a1890]>"
)}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://www.baidu.com/, NSErrorFailingURLStringKey=https://www.baidu.com/, NSErrorClientCertificateStateKey=0}
---

这说明 www.baidu.com 是不符合 ATS 的默认要求的,在 iOS 9 中如果你用一个 NSURLSession 去请求 www.baidu.com, 可以得到一堆错误信息以及返回一个为 nil 的 data.

当然,现在绝大多数的网站和 API 服务都不符合 ATS 的默认要求,可以用以下方法禁用掉 ATS, 打开应用的 Info.plist (用源码的形式打开), 加入一个 entry:

    <key>NSAppTransportSecurity</key>
    <dict>
        <!--Include to allow all connections (DANGER)-->
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

这样就搞定了, 不过从长远来看,还是应该让服务器升级去满足 ATS 的安全要求

App Thining

今年的 WWDC 大会上我们都看到苹果发布了一个应用瘦身的技术:App thining, 这项技术引入了一个叫 Bitcode compile的概念,开启 Bitcode 编译后,可以使得开发者上传 App 时只需上传 Intermediate Representation(中间件),而非最终的可执行二进制文件。 在用户下载 App 之前,AppStore 会自动编译中间件,产生设备所需的执行文件供用户下载安装。

值得注意的是,如果你的应用开启了 Bitcode 编译,那么你的应用所依赖的第三方库都需要开启 Bitcode 重新编译。所以如果你的应用使用到了 AliPay SDK, 微信 SDK 这些已经编译成 .a 静态库的东西,就需要暂时把 Bitcode 编译关闭,因为这些 SDK 暂时还没有为 App Thining 重新编译。

其他

下面是目前碰到的一些小问题,会不断更新

  1. 现在使用 Autolayout 的时候,left/right 和 leading/trailing 不能混合使用,如果混合使用了就会直接奔溃。我认为这是 Autolayout 一个非常好的更新,有效防止了有些同学写出 v1.left.equalsTo(v2.mas_leading) 这样的代码
comments powered by Disqus