歡迎加QQ群討論:157672725
最近升級到XCode7之后發(fā)現(xiàn)工程需要針對iOS9做一些適配,如下幾點是我項目中遇到的適配問題,僅供大家參考如有問題歡迎加Q群157672725討論:
- 網(wǎng)絡適配ATS問題
- Bitcode導致的編譯問題
- 狀態(tài)欄樣式問題
- 白名單問題
網(wǎng)絡適配ATS問題
App Transport Security(ATS)是Apple為提高系統(tǒng)及應用安全性而在iOS 9和OS X EI Capitan中引入的新特性。一旦開啟ATS后,應用所有的網(wǎng)絡請求將會自動轉換為HTPPS傳輸(HTTP形式的傳輸將會失?。?。
解決辦法:
1.在Info.plist中添加NSAppTransportSecurity,并添加item設置NSAllowsArbitraryLoads為YES,表示支持所有HTTP請求。
源碼形式:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2.添加白名單
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow insecure HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
3.改變服務器(改用HTTPS),需要注意一下幾點
3.1Transport Layer Security協(xié)議版本要求TLS1.2以上
3.2服務的Ciphers配置要求支持Forward Secrecy
3.3證書簽名算法符合ATS要求等
目前我選擇第1種方法
理由:服務器和第三方的框架使用的API大部分是HTTP形式的,服務器修改成HTTPS需要申請證書之類的,相對比較耗時,所以可以先考慮使用第一種做法。
Bitcode導致的編譯問題
開啟Bitcode編譯后,可以使得開發(fā)者上傳App時只需上傳Intermediate Representation(中間件),而非最終的可執(zhí)行二進制文件。在用戶下載App之前,AppStore會自動編譯中間件,產生設備所需的執(zhí)行文件供用戶下載安裝。
Xcode 7 會開啟 Bitcode,如果項目中第三方庫不包含bitcode,將會導致編譯失敗。
解決辦法:
1.更新第三方庫使包含 Bitcode
2.關閉Bitcode
在Build Settings 中搜索bitcode 【記得選中ALL】將ENABLE_BITCODE 設置為NO
目前我選擇了第2種方法
理由:代碼中的第三方庫中的.a文件不是bitcode的會導致編譯出錯,故目前選擇第2種,等待第三方庫的更新。
狀態(tài)欄樣式問題
如果你使用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];的形式來設置狀態(tài)欄樣式,則運行的時候會出現(xiàn)以下警告。
<Error>: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
<Error>: CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
<Error>: CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
原因:在info.plist里面設置了View controller-based status bar appearance為NO,默認為YES,該種方式兼容iOS6、iOS7、iOS8但是到了iOS9會報警告。
解決辦法:
1.將View controller-based status bar appearance設置為YES
2.去除以下方式改變狀態(tài)欄
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
3.使用新的改變狀態(tài)欄方法
在自定義控制器里面添加如下方法:
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
4.clean 或者刪除應用程序重新運行,驗證結果。
白名單問題
運行程序的時候出現(xiàn)類似以下的警告,表示你沒有添加白名單
error: "This app is not allowed to query for scheme mqqopensdkapiV2"
解決辦法:這里我推薦友盟的教程http://dev.umeng.com/social/ios/ios9