iOS经典讲解之适配iOS 11那些事-持续更新...

作者:刘新林

转载请标明出处:http://blog.****.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里面关掉主线程监测(不提倡)

iOS经典讲解之适配iOS 11那些事-持续更新...

出现打印问题最好的方法是把出问题的代码放在主线程里边即可 ,例如我发现项目中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的图层有关系。