iOS9之后我们需要关注的事情

jopen 9年前


iOS9
</div>

应用隐私控制-外部调用

iOS9增加了隐私控制,自己的应用如果需要调用其它应用,需要在工程的info.plist中添加一个key为LSApplicationQueriesSchemes的数组值,里面包含需要添加白名单的string类型的scheme。即使用URL scheme将其加入白名单。如项目中使用了qq,微信等分享登录功能,需要添加的值为:

mqqopensdkapiV2    mqqOpensdkSSoLogin    mqq    mqzoneopensdkapiV2    mqzoneopensdkapi19    mqzoneopensdkapi    mqzoneopensdk    mqzone    weixin    wechat ...

示例
</div>

如果不添加该项,使用canOpenURL:判断应用是否安装时会报错。

canOpenURL: failed for URL: "mqqopensdkapiV2://qqapp" - error: "This app is not allowed to query for scheme mqqopensdkapiV2”

bitcode

bitcode是被编译程序的一种中间形式的代码。包含bitcode配置的程序将会在App store上被编译和链接。bitcode允许苹果在后期重新优化我们程序的二进制文件,而不需要我们重新提交一个新的版本到App store上。

Xcode7 默认开启了bitcode,如果App使用的第三方类库不支持bitcode会提示错误,只需要在”Build Settings”->”Enable Bitcode”选项中关闭bitcode即可。

开启Bitcode编译后,编译产生的文件体积会变大 (因为是中间代码,不是用户下载的包),且dSYM文件不能用来崩溃日志的符号化 (用户下载的包是Apple服务重新编译产生的,有产生新的符号文件)。通过Archive方式上传AppStore的包,可以在 Xcode的Organizer工具中下载对应安装包的新的符号文件。

改用更安全的HTTPS

如果在Xcode 9之前使用的时http请求,那么在XCode 9上编译的App是不能联网的。iOS9把所有的http请求都改为https了:iOS9系统发送的网络请求将统一使用TLS 1.2 SSL。采用TLS 1.2 协议,目的是 强制增强数据访问安全,而且 系统 Foundation 框架下的相关网络请求,将不再默认使用 Http 等不安全的网络协议,而默认采用 TLS 1.2。

修改方法是要么使服务器支持https访问,要么关闭https的使用。第一种方法对于个人开发者来说代价还是比较大的,第二种方法:在工程的Info.plist文件里添加NSAppTransportSecurity字典类型的,添加一个元素:key为NSAllowsArbitraryLoads,值为YES。

什么是SSL/TLS

HTTP+SSL/TLS+TCP = HTTPS
TLS 是 SSL 新的别称。SSL 3.0版本之后的迭代版本被重新命名为TLS 1.0。

SSL/TLS协议解决的问题

1.所有信息都是加密传播,第三方无法窃听。
2.具有校验机制,一旦被篡改,通信双方会立刻发现。
3.配备身份证书,防止身份被冒充。

iOS9中新增App Transport Security(简称ATS)特性, 主要使原来请求的时候用到的HTTP,都转向TLS1.2协议进行传输。这也意味着所有的HTTP协议都强制使用了HTTPS协议进行传输。

在Info.plist新增一段用于控制ATS的配置:


控制ATS的配置
</div>

这段配置中的NSAppTransportSecurity是ATS配置的根节点,配置了节点表示告诉系统要走自定义的ATS设置。而NSAllowsAritraryLoads节点则是控制是否禁用ATS特性,设置YES就是禁用ATS功能。

其实ATS并不单单针对HTTP进行了限制,而是对HTTPS也有一定的要求,如果你希望自己所有的域名,除了一些已知并不会使用ATS之外的,所有通信都使用ATS。这种情况下你可以指定一些不使用ATS的特殊情况,而其余的情况使用ATS。对于这种场景,可以使用NSExceptionDomains来标识使用ATS默认设置的域。
以QQdemo为例:


QQdemo
</div>

其中NSIncludesSubdomains设置为YES表示子级域名都使用相同设置。NSExceptionRequiresForwardSecrecy为NO由于不支持ForwardSecrecy,因此屏蔽掉改功能。最后NSExceptionAllowInsecureHTTPLoads设置为YES,则表示允许访问没有证书或者是自签名、过期、主机名不匹配的证书引发的错误的域名(这里检查过QQ的证书貌似没有什么问题,但是还是需要设置此项才允许访问)。这是比较严谨的做法,指定了能访问哪些特定的HTTP。

forward secrecy

中文可叫做前向保密。perfect forward secrecy,叫做完全前向保密,要求一个密钥只能访问由它所保护的数据;用来产生密钥的元素一次一换,不能再产生其他的密钥;一个密钥被破解,并不影响其他密钥的安全性。

支持Forward Secrecy的加密方式

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384  TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256  TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384  TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA  TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256  TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA  TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384  TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256  TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384  TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256  TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

来自: http://www.jianshu.com/p/bd5dcb604cb6