今天手抖,点了 Xcode 的更新提示,更新完后发现 APP 果然跑不起来了,报错截图:

IMAGE

由于目前采用的还是 webview 的方案,所以必不可少的要加载一些 web 资源,直观的看上去,是这些资源由于某些原因导致加载失败,所以 APP 白屏了。

赶紧搜索了一番,发现是 iOS9 新引入的 App Transport Security 的原因,它要求 APP 访问的网络必须是 https 协议,想来应该是为了应对这次的 XcodeGoast 事件吧。

但是开发阶段再去搞个 https 的域不太现实啊,并且如果 APP 引用了一些第三方的网络资源呢。想来肯定是可以设置白名单的吧。

应对方案有两种:

  1. 干脆把这个限制去掉,允许加载所有资源(这真是浪费了苹果的苦心),给 info.plist 文件添加如下配置:
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true>
</dict>
  1. 设置 http 白名单,这种方法虽然麻烦,但个人觉得比较靠谱,允许加载的资源更可控。给 info.plist 添加如下配置:
<!--以放行 baidu.com 和 qq.com 两个域下的资源为例:-->
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>baidu.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
        <key>qq.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

还有另外一个坑,原来的分享功能,在 iOS9 下也无法正常跳转了。这是因为新增了跳转规则,在跳转到其他客户端时,要首先检测项目的 info.plist 文件有没有配置要跳转平台的白名单,如果没有配置,则将不能正常跳转。想来这也是为了防止 APP 被篡改代码后随便跳转到其他客户端,增加 APP 的安全性做的措施吧。

以下是常用几大平台的白名单配置:

<key>LSApplicationQueriesSchemes</key>
<array>
	<string>sinaweibo</string>
	<string>sinaweibosso</string>
	<string>TencentWeibo</string>
	<string>tencentweiboSdkv2</string>
	<string>wechat</string>
	<string>weixin</string>
	<string>mqzoneopensdk</string>
	<string>mqzoneopensdkapi</string>
	<string>mqzoneopensdkapi19</string>
	<string>mqzoneopensdkapiV2</string>
	<string>mqqOpensdkSSoLogin</string>
	<string>mqqopensdkapiV2</string>
	<string>mqqopensdkapiV3</string>
	<string>wtloginmqq2</string>
	<string>mqqapi</string>
	<string>mqqwpa</string>
	<string>mqzone</string>
	<string>mqq</string>
</array>

至此,APP 基本又恢复正常了。