iOS10正式版開始推送脖岛,趕著ddl做的iOS10適配工作也算是完成了,這里記錄下iOS10適配中做的工作怎栽。
僅是適配,不包括利用iOS10新特性做的新功能宿饱。做的工作有這樣幾個方面:
- Swift轉(zhuǎn)換
- Today extension UI適配
- entitlements文件增加aps
- info.plist增加權(quán)限字段
- UITableView生命周期適配
- pbxproj文件適配證書部分
- IDFA可被用戶禁用
現(xiàn)在依次來介紹一下
Swift轉(zhuǎn)換
使用Xcode8 beta打開項目后熏瞄,Xcode8會提示轉(zhuǎn)換項目中的Swift代碼。
按照Xcode的提示谬以,轉(zhuǎn)換至Swift 2.3就ok了强饮。轉(zhuǎn)換過程中,Xcode會自動更新pbxproj中紀錄的Swift版本为黎。
這部分比較順利邮丰,沒有遇到什么坑。
Today extension UI適配
iOS10對today extension做了一些調(diào)整铭乾,主要體現(xiàn)在:
- 視覺調(diào)整剪廉,背景色變淺,去除了左側(cè)margin
- 支持“展開”和“收起”操作炕檩,展開和收起兩種狀態(tài)分別有最高高度限制
視覺調(diào)整
用Xcode8構(gòu)建的app斗蒋,可以看到today extension的背景色,由深灰色變成了淺灰色,左側(cè)的margin也取消了泉沾。
支持展開和收起操作
iOS10中捞蚂,today extension支持展開/收起操作,收起時視圖高度固定跷究,展開時視圖高度可變姓迅。
iOS10中,NCWidgetProviding
協(xié)議新增了一個回調(diào):
// 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);
用戶點擊展開/收起后俊马,這個方法會調(diào)用队贱。注釋中建議在這個方法中設(shè)置today extension的preferredContentSize
。
展開和收起模式下高度的限制可以通過
- (CGSize)widgetMaximumSizeForDisplayMode:(NCWidgetDisplayMode)displayMode
方法獲得潭袱。
有人討論說柱嫌,收起模式下調(diào)整高度無效( How to resize the height of widget in iOS 10? ),個人理解NCWidgetDisplayMode
的注釋中,已經(jīng)表示了收起模式下的視圖高度是固定的:
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后抑片,發(fā)現(xiàn)構(gòu)建的包,在注冊remote notification的杨赤,獲取device token的時候失敗了敞斋,錯誤信息為:
no valid 'aps-environment'
entitlement string found for application
原來在Xcode7中,push notifications開關(guān)只有一個步驟:將push notifications加入到app id疾牲。
但是Xcode8中植捎,打開push notifications開關(guān)有兩個步驟:
多了一步寫entitlements文件的步驟
所以,用Xcode8打開工程后阳柔,應(yīng)該重新打開一次push notification開關(guān)焰枢,之后entitlements文件中會多出兩行:
<key>aps-environment</key>
<string>development</string>
有了這兩行之后,才可以正常注冊device token舌剂。
但是為什么這個值是development呢济锄?難道正式上線前不需要改為production么?
神奇的是霍转,如果用
codesign --display --entitlements :- ./myApp.app
命令荐绝,可以看到app文件內(nèi)的entitlement。如果用production證書簽名谴忧,可以看到:
<key>aps-environment</key>
<string>production</string>
可能是蘋果在簽名過程中很泊,會自動更新aps-environment
字段角虫?
網(wǎng)上發(fā)現(xiàn)的一個關(guān)于這個問題的討論
和蘋果的一個replyXcode 8 Beta: aps-environment entitlement is missing
Info.plist增加權(quán)限字段
使用Xcode8構(gòu)建的app,在使用相冊等權(quán)限時會崩潰委造。錯誤信息為:
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鍵戳鹅,并且填入合適的描述文本
還有很多其他的權(quán)限,如相機等昏兆,也需要在Info.plist文件中聲明枫虏,具體可參考官方文檔。
有一個坑就是爬虱,如果string的值為空隶债,這行權(quán)限的聲明就會無效,遇到的時候還是崩潰:
<key>NSPhotoLibraryUsageDescription</key>
<string></string>
UITableView跑筝、UICollectionView生命周期適配
這章WWDC介紹了UITableView
和UICollectionView
的生命周期在iOS10中發(fā)生了改變死讹。
在iOS9及之前,一個UICollectionViewCell
被重用的過程是這樣的:
- 一個cell即將出現(xiàn)的屏幕上
- prepareForReuse
- cellForItemAtIndexPath
- willDisplayCell
- ……
- 一個cell完全離開屏幕
- didEndDisplayCell
- 進入reuse queue
但在iOS10中曲梗,一個UICollectionViewCell被重用的過程變成了這樣:
- 一個cell還沒出現(xiàn)在屏幕上
- prepareForReuse
- cellForItemAtIndexPath
- 一個cell即將出現(xiàn)的屏幕上
- ……
- 一個cell完全離開屏幕
- didEndDisplayCell
- 一段時間后再進入reuse queue
所以赞警,iOS10后,cellForItemAtIndexPath
被調(diào)用時虏两,并不表示這個cell即將要出現(xiàn)在了屏幕上愧旦。還是得老老實實使用willDisplayCell
和didEndDisplayCell
方法。
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中,用戶可以在設(shè)置-隱私-廣告-限制廣告追蹤中禁止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的問題,看來暫時難以解決售滤,求支招(╥﹏╥)