本文主要是說一些iOS9适配中出現的坑,如果隻是要單純的了解iOS9新特性可以看瞄神的開發者所需要知道的 iOS 9 SDK 新特性。9月17日淩晨,蘋果給使用者推送了iOS9正式版,随着有使用者陸續更新iOS9,也就逐漸的衍生出了一系列的問題,筆者也在趕忙為自己維護的App做适配,本文寫的一些坑基本都是親身體驗了。
一、NSAppTransportSecurity
iOS9讓所有的HTTP預設使用了HTTPS,原來的HTTP協定傳輸都改成TLS1.2協定進行傳輸。直接造成的情況就是App發請求的時候彈出網絡無法連接配接。解決辦法就是在項目的info.plist 檔案裡加上如下節點:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iMwATOiRTZxE2NlVWY1YjZ3kTZxImY5gjNmNWMmhjY38CX3AzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL2M3Lc9CX6MHc0RHaiojIsJye.png)
NSAppTransportSecurity - NSAllowsArbitraryLoads
這個子節點的意思是:是否允許任性的加載?! 設為YES的話就将禁用了AppTransportSecurity轉而使用使用者自定義的設定,這個問題就解決了。
上面說是蘋果限制了HTTP協定,但是也并不是說所有的HTTPS都能完美适配iOS9了。
舉個栗子,從app内起webView加載https的網頁。建立個項目寫幾行起網頁的代碼
1 2 3 4 5 6 7 8 9 10 11 12 | |
中間的url就是我們想要加載的https位址,用https://baidu.com/ 和 https://github.com/ 分别試一下,結果不同
github的網頁能打開,百度的網頁打不開,下面列印了一行log
|
原因是蘋果的官方資料說首先必須要基于TLS 1.2版本協定。然後證書的加密的算法還需要達到SHA256或者更高位的RSA密鑰或ECC密鑰,如果不符合,請求将被中斷并傳回nil.
在浏覽器中是可以直接檢視這個網站的加密算法的,先點綠鎖再點證書資訊。
從右邊兩張圖可以看出,github帶RSA加密的SHA-256符合蘋果的要求,是以才可以展示。
針對百度的情況可以在info.plist中配置如下,如果網站引用的比較多應該是需要針對每個網站進行配置。
NSAppTransportSecurity,NSExceptionDomains,NSIncludesSubdomains,NSExceptionRequiresForwardSecrecy,NSExceptionAllowInsecureHTTPLoads 寫在下面便于複制。
其中的ForwardSecrecy了解為超前的密碼保護算法,在官方資料裡有寫,一共是11種。配置完畢百度可以通路。
二、Bitcode
bitcode的了解應該是把程式編譯成的一種過渡代碼,然後蘋果再把這個過渡代碼編譯成可執行的程式。bitcode也允許蘋果在後期重新優化我們程式的二進制檔案,有類似于App瘦身的思想。
用了xcode7的編譯器編譯之前沒問題的項目可能會出現下列報錯。
|
問題的原因是:某些第三方庫還不支援bitcode。要不然是等待庫的開發者更新了此項功能我們更新庫,要不就是把這個bitcode禁用。
禁用的方法就是找到如下配置,選為NO.(iOS中bitcode是預設YES,watchOS中bitcodes是不讓改的必須YES。)
三、設定信任
這一條隻和企業級應用或inhose 有關,和AppStore管道的應用無關。
在iOS8隻是彈出一個窗問你是否需要讓手機信任這個應用,但是在iOS9卻直接禁止,如果真的想信任需要自己去手動開啟。類似于Mac系統從未知開發者處下載下傳的dmg直接打不開,然後要到系統偏好設定的安全性與隐私手動打開。 下圖展示左邊iOS8,右邊iOS9
使用者需要去 設定---》通用---》描述檔案 裡面自行添加信任。
這種問題的處理方法也就兩種:1.提前周知暫時不要更新iOS9 2.大多是公司員工使用的企業級應用,群發一個指導郵件。
四、字型
iOS8中,字型是Helvetica,中文的字型有點類似于“華文細黑”。隻是蘋果手機自帶渲染,是以看上去可能比普通的華文細黑要美觀。iOS9中,中文系統字型變為了專為中國設計的“蘋方” 有點類似于一種word字型“幼圓”。字型有輕微的加粗效果,并且最關鍵的是字型間隙變大了!
是以很多原本寫死了width的label可能會出現“...”的情況。
iOS8
iOS9 蛋疼
上面這兩張圖也可以直覺的看出同一個界面,同一個label的變化。
是以為了在界面顯示上不出錯,就算是固定長度的文字也還是建議使用sizetofit 或者ios向上取整 ceilf() 或者提前計算
|
五、URL scheme
URL scheme一般使用的場景是應用程式有分享或跳其他平台授權的功能,分享或授權後再跳回來。
在iOS8并沒有做過多限制,但是iOS9需要将你要在外部調用的URL scheme列為白名單,才可以完成跳轉
如果iOS9沒做适配 會報如下錯誤
|
具體的解決方案也是要在info.plist中設定 LSApplicationQueriesSchemes 類型為數組,下面添加所有你用到的scheme
六、statusbar
這個還好隻是報一個警告,如果就是不管他,也不會出現問題。
|
以前我們為了能夠實時的控制頂部statusbar的樣式,可能會在喜歡使用
|
但是這麼做之前需要将 info.plist 裡面加上View controller-based status bar appearance BOOL值設為NO,就是把控制器控制狀态欄的權限給禁了,用UIApplication來控制。但是這種做法在iOS9不建議使用了,建議我們使用吧那個BOOL值設為YES,然後用控制器的方法來管理狀态欄比如。
|
點進頭檔案可以驗證剛才說法:
|
七、didFinishLaunchingWithOptions
如果運作的時候報下列錯誤,那就是你的didFinishLaunchingWithOptions寫的不對了
|
iOS9不允許在didFinishLaunchingWithOptions結束了之後還沒有設定window的rootViewController。 也許是xcode7的編譯器本身就不支援。
解決的方法當然就是先初始化個值,之後再指派替換掉
|
八、tableView
|