記錄對iOS10的適配工作? ????

iOS10正式版開始推送,趕著ddl做的iOS10適配工作也算是完成了,這里記錄下iOS10適配中做的工作。

僅是適配,不包括利用iOS10新特性做的新功能。做的工作有這樣幾個方面:

  • Swift轉換
  • Today extension UI適配
  • entitlements文件增加aps
  • info.plist增加權限字段
  • UITableView生命周期適配
  • pbxproj文件適配證書部分
  • IDFA可被用戶禁用

現在依次來介紹一下


Swift轉換



使用Xcode8 beta打開項目后,Xcode8會提示轉換項目中的Swift代碼。

按照Xcode的提示,轉換至Swift 2.3就ok了。轉換過程中,Xcode會自動更新pbxproj中紀錄的Swift版本。

這部分比較順利,沒有遇到什么坑。


Today extension UI適配



iOS10對today extension做了一些調整,主要體現在:

  • 視覺調整,背景色變淺,去除了左側margin
  • 支持“展開”和“收起”操作,展開和收起兩種狀態分別有最高高度限制
視覺調整



用Xcode8構建的app,可以看到today extension的背景色,由深灰色變成了淺灰色,左側的margin也取消了。

支持展開和收起操作



iOS10中,today extension支持展開/收起操作,收起時視圖高度固定,展開時視圖高度可變。

iOS10中,NCWidgetProviding協議新增了一個回調:

// If implemented, called when the active display mode changes.
// The widget may wish to change its preferredContentSize to better accommodate the new display mode.
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize NS_AVAILABLE_IOS(10_0);

用戶點擊展開/收起后,這個方法會調用。注釋中建議在這個方法中設置today extension的preferredContentSize。

展開和收起模式下高度的限制可以通過

- (CGSize)widgetMaximumSizeForDisplayMode:(NCWidgetDisplayMode)displayMode

方法獲得。

有人討論說,收起模式下調整高度無效( How to resize the height of widget in iOS 10? ),個人理解NCWidgetDisplayMode的注釋中,已經表示了收起模式下的視圖高度是固定的:

typedef NS_ENUM(NSInteger, NCWidgetDisplayMode) {
    NCWidgetDisplayModeCompact, // Fixed height
    NCWidgetDisplayModeExpanded, // Variable height
} NS_ENUM_AVAILABLE_IOS(10_0);

展開模式下,不同機型/橫豎屏,視圖的最高高度限制也都是不同的。比如iPhone SE下測試,豎屏最大高度為396,iPhone 6s下測試,豎屏最大高度為528。


entitlements文件增加aps



升級到Xcode8后,發現構建的包,在注冊remote notification的,獲取device token的時候失敗了,錯誤信息為:

no valid 'aps-environment' 
entitlement string found for application

原來在Xcode7中,push notifications開關只有一個步驟:將push notifications加入到app id。

但是Xcode8中,打開push notifications開關有兩個步驟:
多了一步寫entitlements文件的步驟

所以,用Xcode8打開工程后,應該重新打開一次push notification開關,之后entitlements文件中會多出兩行:

<key>aps-environment</key>
<string>development</string>

有了這兩行之后,才可以正常注冊device token。

但是為什么這個值是development呢?難道正式上線前不需要改為production么?

神奇的是,如果用

codesign --display --entitlements :- ./myApp.app

命令,可以看到app文件內的entitlement。如果用production證書簽名,可以看到:

<key>aps-environment</key>
<string>production</string>

可能是蘋果在簽名過程中,會自動更新aps-environment字段?

網上發現的一個關于這個問題的討論
和蘋果的一個replyXcode 8 Beta: aps-environment entitlement is missing


Info.plist增加權限字段



使用Xcode8構建的app,在使用相冊等權限時會崩潰。錯誤信息為:

This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

官方文檔中解釋:

Important: To protect user privacy, an iOS app linked on or after iOS 10.0, and which accesses the user’s photo library, must statically declare the intent to do so. Include the NSPhotoLibraryUsageDescription key in your app’s Info.plist file and provide a purpose string for this key. If your app attempts to access the user’s photo library without a corresponding purpose string, your app exits.

必須在Info.plist文件中增加NSPhotoLibraryUsageDescription鍵,并且填入合適的描述文本

還有很多其他的權限,如相機等,也需要在Info.plist文件中聲明,具體可參考官方文檔。

有一個坑就是,如果string的值為空,這行權限的聲明就會無效,遇到的時候還是崩潰:

<key>NSPhotoLibraryUsageDescription</key>
<string></string>

UITableView、UICollectionView生命周期適配



這章WWDC介紹了UITableViewUICollectionView的生命周期在iOS10中發生了改變。

在iOS9及之前,一個UICollectionViewCell被重用的過程是這樣的:

  • 一個cell即將出現的屏幕上
  • prepareForReuse
  • cellForItemAtIndexPath
  • willDisplayCell
  • ……
  • 一個cell完全離開屏幕
  • didEndDisplayCell
  • 進入reuse queue

但在iOS10中,一個UICollectionViewCell被重用的過程變成了這樣:

  • 一個cell還沒出現在屏幕上
  • prepareForReuse
  • cellForItemAtIndexPath
  • 一個cell即將出現的屏幕上
  • ……
  • 一個cell完全離開屏幕
  • didEndDisplayCell
  • 一段時間后再進入reuse queue

所以,iOS10后,cellForItemAtIndexPath被調用時,并不表示這個cell即將要出現在了屏幕上。還是得老老實實使用willDisplayCelldidEndDisplayCell方法。


pbxproj文件適配證書部分



Xcode8支持自動管理配置文件,按照文檔,只需要勾選Automatically manage signing,并配置Code Signing Identity為iOS Developer,Provisioning Profile為Automatic就可以了。

官方文檔在這里:
How do I configure my Xcode project to use automatic provisioning?


IDFA可被用戶禁用



iOS10中,用戶可以在設置-隱私-廣告-限制廣告追蹤中禁止app讀取IDFA,這時app讀取到的IDFA就是一串0。

官方文檔中這樣說:

In iOS 10.0 and later, the value of advertisingIdentifier is all zeroes when the user has limited ad tracking.

無法讀取IDFA的問題,看來暫時難以解決,求支招(╥﹏╥)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容