1. 程式人生 > >iOS9 新特性

iOS9 新特性

https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html#//apple_ref/doc/uid/TP40016198-DontLinkElementID_1

ios9的開源學習 https://github.com/shinobicontrols/iOS9-day-by-day

一、iOS9問題彙總   

http://www.infoq.com/cn/articles/wechat-ios9-adaptation 

1. 編譯問題(Bitcode)

 編譯不過,有個錯誤提示大致是

 You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE)

 如果我們用到的第三方庫編譯時還沒啟用Bitcode,主工程就會編譯不過。

 最簡單的解決辦法是先把Bitcode關掉:把Build settings - Build Options - Enable Bitcode 改為NO。Bitcode是蘋果App Thinning的機制之一.

2、HTTP請求失敗

網路請求失敗,可能因為iOS9預設不支援HTTP請求,需要改用更安全的HTTPS(預設用TLS 1.2)。

用HTTP比HTTPS更適合,而且把服務端升級到TLS 1.2也不是一時半會能夠搞定的。

簡單的解決方案就是在info.plist裡面增加以下配置:

<key>NSAppTransportSecurity

</key>

<dict>

<key>NSAllowsArbitraryLoads</key>

<true/>

</dict>

3、canOpenUrl限制

canOpenUrl可以用來判斷使用者是否安裝了某個APP。也許是出於使用者隱私的考慮,iOS9上對canOpenUrl做了限制,最多隻能對50個scheme做判斷。

如果是用Xcode7編譯,需要在plist裡面宣告這些scheme,沒有宣告的會直接返回NO:

<key>LSApplicationQueriesSchemes</key>

<array

>

<string>weixin</string>

<string>wechat</string>

</array>

如果是用Xcode6編譯,系統會在使用者手機上記住APP每次呼叫canOpenUrl的scheme,如果累計達到50種,剩下的其它呼叫,也會直接返回NO。所以在iOS9beta剛出來的時候,有些使用者無法從微信跳轉到第三方app,就是因為已經達到了限制數量,系統直接返回NO,程式以為使用者沒有安裝該APP,就沒有去跳轉。

解決辦法是加白名單,並且儘量減少不必要的canOpenUrl呼叫,以免超過50個名額的限制。

例如,openUrl函式是不受限制的(在iOS9的某beta版上,openUrl也受同樣限制,但跟蘋果溝通後確認是iOS的bug,後面的版本也已經更正過來了),所以對於

if(canOpenUrl(scheme)) thenopenUrl(scheme);

else xxx;

這種只需要改寫成

if(!openUrl(scheme)) then xxx;

就不用佔用白名單了。

4、systemName

[[UIDevice currentDevice] systemName] 返回的iPhone OS 

5、preferredLanguages

[NSLocale preferredLanguages]會返回使用者的首選語言。在之前的版本,系統用"zh-Hans"來表示簡體中文,這個常量在iOS9.0beta上也是如此。然而到了iOS9.0正式版,蘋果突然在後面加了國家碼字尾,變成了"zh-Hans-CN"。但是,對於臺灣繁體中文,卻沒有變化,依然是"zh-TW"。

這個變動導致部分使用者升級到iOS9,微信語言變成了英文。這是因為程式在使用者首選語言中沒匹配到簡體中文的選項。

目前我們解決辦法是改用字首匹配。

6、API更新

iOS9照例淘汰了一些舊介面,其中有一些舊介面雖然還能用,但或多或少都會有些問題:

  • 6.1 AddressBookUI.framework在iOS9上已經被淘汰,需要改用ContactsUI.framework
  • 舊介面還能夠讀取通訊錄,但是新增資訊到通訊錄時,系統介面會卡住。
  • 6.2 UIAlertView需要改成UIAlertController
  • 舊介面還能夠使用,只是在有鍵盤的情況下彈UIAlertView,可能會有鍵盤閃現等體驗問題。
  • 6.3 UIPopoverController需要改用普通的UIViewController,設定modalPresentationStyle=UIModalPresentationPopover,然後present出來
  • 舊介面也能夠使用,但在iPad分屏下會有問題。

7、windowLevel問題

當鍵盤已經彈起的時候,再顯示我們自己寫的確認視窗等window,會發現window被鍵盤擋住了

這是因為iOS9下系統鍵盤的windowLevel是很高的,達到10^7。而且進一步發現,這個值是系統允許的最大值。如果把某個window的windowLevel改成比10^7大的值,系統只會設為10^7。

解決這個問題有兩種方法:

一個是把我們自己window的level調大,同樣設為10^7,因為比系統鍵盤晚出現,所以還是能夠把系統鍵盤蓋住。這種方法的缺點是使得window的層次結構不好管理,且依賴於系統鍵盤的level。而且window上也無法再顯示UIAlertView等系統視窗了。

另一種方法是在顯示window時先呼叫[mainWindow endEditing:YES],把主window的鍵盤收起來,然後再顯示window。這種方法的缺點是,有些場景下使用者是正在輸入的,收起鍵盤對使用者的體驗不好。

兩種方法各有優缺點,可以根據使用場景來選擇。

8. 啟動crash(window.rootViewController問題)

crash資訊為:

Application windows are expected to have a root view controller at the end of application launch

原因是啟動完的時候,如果現有的window沒有rootViewController,就會crash。

解決辦法就是按要求設定rootViewController。

注:啟動完後再生成的window,可以不設rootViewController,但還是建議以後所有window都要設。

二、iPad分屏

1、如何啟用iPad分屏

a. 用Xcode7 iOS9 SDK編譯

b. 用Launch StoryBoard做啟動介面

c. 支援所有的旋轉方向

如果通過supportedInterfaceOrientations等函式來限制某些介面在iPad上不能轉屏,在啟用分屏後,限制將失效。

如果不支援分屏,需要設定: General - Deployment Info中勾選Requires full screen

2、如何適配iPad分屏

分屏和轉屏本質上都是改變了螢幕的尺寸。正常來說,如果介面適配了iPad轉屏(不管是用哪種方式,例如AutoLayout,或者AutoResizing,或者是在viewDidLayoutSubviews裡面重新排版),那在iPad分屏下也能夠正常顯示。

如果介面在不同尺寸的螢幕下有不同的排版設計,官方的建議是根據系統回撥在Regular模式和Compact模式之間切換。微信因為是使用了配置檔案來處理不同裝置的排版差異的,所以根據自己的實際情況,採用以下原則:在320螢幕下按照iPhone5的排版;438螢幕下按照iPhone6的排版,其它分屏下按照iPad的排版。

3、分屏後的幾個問題

a  分屏後,APP當前螢幕的大小不能再用[UIScreen mainScreen].bound來獲取(整個裝置的螢幕大小)。

解決辦法是,啟動時初始化window,不需要initWithFrame,直接用init就可以了。系統知道當前螢幕的大小,會幫我們正確地設定frame。然後取這個frame就能拿到實際螢幕大小了。

b  如果使用willRotateToInterfaceOrientation等轉屏回撥來處理螢幕尺寸變化。從iOS8開始,系統新增了viewWillTransitionToSize:withTransitionCoordinator回撥來代替它。新的回撥可以用來處理轉屏和分屏引起的螢幕尺寸變化。

c  分屏狀態下,視訊錄製不可用。如果用到了視訊錄製功能,建議像系統一樣,在分屏時給使用者提示一下。

d  避免hardcode。要注意iPad的螢幕不再是1024*768,而且在執行中螢幕的尺寸是會隨時變化的(分屏或轉屏時),所以如果以前有些程式碼做了hardcode,會導致分屏後有bug。

三、過期的API

a  Media Player 過期,使用AVKit代替

b  Address Book and Address Book UI frameworks 過期,使用 Contacts and Contacts UI frameworks代替


四、新的API

a  UIKit中的UIStackView,組合檢視

b  UIKit中的 NSDataAsset

 --- --- --- 9.3  新特性  --- ------

1、Night Shift  夜間模式

   支援螢幕色溫的調節

2、更多3D Touch手勢支援

3、備忘錄支援Touch ID/密碼

4、全新的CarPlay和 Apple Music

5、

Night Shift

  現在你可以通過控制中心中的快捷開關或設定來開啟該功能,它能夠對螢幕色溫進行調節,