作者:劉新林
轉載請標明出處:http://blog.csdn.net/loving_ios/article/details/78573630
1、訪問相簿許可權 NSPhotoLibraryAddUsageDescription
有的文章中提及iOS 11將訪問相簿許可權的NSPhotoLibraryUsageDescription改成了NSPhotoLibraryAddUsageDescription。實際並非如此通過官方API 解釋iOS 10新增的訪問相簿許可權是infoplist檔案需要添加NSPhotoLibraryUsageDescription,但在iOS 11中系統預設訪問相簿許可權是開啟的,不添加NSPhotoLibraryAddUsageDescription也是沒問題的,但是如果儲存圖片時就會crash,所以iOS 11新增的NSPhotoLibraryAddUsageDescription只是在儲存照片時添加即可。
2、訪問位置許可權 NSLocationAlwaysAndWhenInUseUsageDescription
iOS 11以下版本訪問位置許可權需要添加NSLocationAlwaysUsageDescription(始終允許),NSLocationWhenInUseUsageDescription(使用時),但在iOS 11中就會發現無法訪問位置,其實iOS 11新增NSLocationAlwaysAndWhenInUseUsageDescription,而之前的NSLocationAlwaysUsageDescription降為NSLocationWhenInUseUsageDescription,所以適配iOS 11需要添加新key NSLocationAlwaysAndWhenInUseUsageDescription,但之前的也不要刪掉,為了適配iOS 11以下版本。
3、Xcode9控制台列印線程警告
Xcode9,iOS 11運行程式控制台列印一堆類似於Main Thread Checker: UI API called on a background thread: -[UIApplication statusBarOrientation]的線程警告,造成的原因是本該在主線程執行的代碼放在了子線程中。
解決方案:在scheme裡面關掉主線程監測(不提倡)
出現列印問題最好的方法是把出問題的代碼放在主線程裡邊即可 ,例如我發現項目中shareSDK 內部有狀態列設定在子線程 。查看其最新SDK已適配iOS 11,所以升級shareSDK已解決問題,關於其他的代碼根據警告同理修改即可。
4、初始化UIBarButtonItem與iOS11以下版本區別
用initWithCustomView:初始化BarButtonItem時在iOS 11可以直接用不指定frame的控制項初始化,顯示是沒問題的,而在以下版本需要指定frame例如UILabel可以用sizeToFit,添加titleView 時的控制項同樣的原理,iOS 11可以不指定大小,直接顯示。而在小於iOS 11的系統是不顯示的(當然指定大小iOS 11也是沒問題的,所以適配版本最好是代碼完善,適配各種情況)。這與iOS 11修改NavigationBar的圖層有關係。