iOS 10适配知识点

1.证书问题

  • 打开xcode8.0时编译运行时出现下面问题:
11970779-bdd08c08dd8feaef

这个问题刚开始估计大家都会碰到也是第一个要解决的问题
这个问题就是一个证书的设置问题,下面看两张图
正常我们会在BuildeSettings中设置证书:

12970779-6d1b2c037938269c
 
但是在xcode8.0中我们看到下面的新特性:
 
13970779-069b9dd59072ebd4
相信大家都能看到在Genreal下面会有Siging,没错这就是新特性,为了方便用户来管理,大家可以选择Automatically manage signing。需要输入开发者账号!如果没有账号也没关系,在下面也可以选择Debug、Realease、inHouse模式下对应的证书也可以!
  • 但是 但是 但是 如果你的证书如果是通配符类型的,但是你的app包含了比如推送、apple pay、他会报错提示你未报含xx.id的manteid等等。所以你要生成针对你app的bundleid对应的证书!

2.隐私数据访问问题

问题出现

  • 现在app能运行了,当我打开相机时突然又crash了,好吧,坑还不少,崩溃日志如下:

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.

崩溃原因

  • 上面崩溃意思试图访问安全隐私数据,但是又没有相应的描述,你必须要包含在info.plist里包含一个键值 NSPhotoLibraryUsageDescription对应的描述。
  • 其实上面是iOS10,苹果加强了对隐私数据的保护,要对隐私数据权限做一个适配
    iOS10调用相机,访问通讯录,访问相册等都要在info.plist中加入权限访问描述,不然之前你们的项目涉及到这些权限的地方就会直接crash掉。

解决办法

  • 只需要在info.plist添加NSContactsUsageDescription的key, value自己随意填写就可以,这里列举出对应的key(Source Code模式下):
– 隐私数据对应KEY值
相册 NSPhotoLibraryUsageDescription
相机 NSCameraUsageDescription
麦克风 NSMicrophoneUsageDescription
位置 NSLocationUsageDescription
在使用期间访问位置 NSLocationWhenInUseUsageDescription
始终访问位置 NSLocationAlwaysUsageDescription
日历 NSCalendarsUsageDescription
提醒事项 NSRemindersUsageDescription
运动与健身 NSMotionUsageDescription
健康更新 NSHealthUpdateUsageDescription
健康分享 NSHealthShareUsageDescription
蓝牙 NSBluetoothPeripheralUsageDescription
媒体资料库 NSAppleMusicUsageDescription

跳转到app内的隐私数据设置页面

  • 我们知道用户没开启,肯定要提醒用户去设置开启的吧,所以我们要跳转到app的隐私数据界面。如何调用呢,我定义一个宏方便调用:

UIKIT_EXTERN NSString *const UIApplicationOpenSettingsURLString NS_AVAILABLE_IOS(8_0);
这个是iOS8.0以后的方法

我们直接调用下面代码就可以了

看到评论说跳到蓝牙有什么办法,我补充一下:

14970779-b064d4055a52a281
 
15970779-079c5bbd69723d74

iOS 10 干掉了所有系统设置的 URL Scheme,这意味着你再也不可能直接跳转到系统设置页面(比如 WiFi、蜂窝数据、定位等)。

iOS 10中如下跳到系统的设置方法已经不生效了(如果看到解决办法再补充,如果你有解决办法请赐教留下你宝贵的评论…..感谢):

3.系统版本判断方法失效

  • 我们之前的系统版本方法如下
  • 当系统版本到iOS10.0的时候 9.0和10.0比较的话是降序而不是升序,这样会导致iOS10.0是最早的版本,这样后面要走的iOS10的方法可能都不会走而出现问题
  • 下面这样也不行它会永远返回NO,substringToIndex:1在iOS 10 会被检测成 iOS 1了,
  • 正确的打开方式应该是:

4.UIColor问题

  • 官方文档中说:大多数core开头的图形框架和AVFoundation都提高了对扩展像素和宽色域色彩空间的支持.通过图形堆栈扩展这种方式比以往支持广色域的显示设备更加容易。现在对UIKit扩展可以在sRGB的色彩空间下工作,性能更好,也可以在更广泛的色域来搭配sRGB颜色.如果你的项目中是通过低级别的api自己实现图形处理的,建议使用sRGB,也就是说在项目中使用了RGB转化颜色的建议转换为使用sRGB,在UIColor类中新增了两个api:

我用新老方法测试两个方法在RGB相同的数值在表现上的区别看下图:

16970779-6b9eae57d3db7ca6

17970779-73b16887df075435

 
 
  • 可以看出下面的颜色(sRGB方法)比上面的颜色(RGB方法)颜色更深更明显。

5.真彩色的显示

  • 真彩色的显示会根据光感应器来自动的调节达到特定环境下显示与性能的平衡效果,如果需要这个功能的话,可以在info.plist里配置(在Source Code模式下):

它有五种取值,分别是:

  • 如果你的项目是游戏类的,就选择UIWhitePointAdaptivityStyleStandard这个模式,五种模式的显示效果是从上往下递减,也就是说如果你的项目是图片处理类的,你选择的是阅读模式,给选择太好的效果会影响性能.

6.字体变化

  • 苹果的默认字体会随着iOS系统版本的不同而不同,iOS10中字体变大了。导致了原来的显示有问题,会造成…的出现。暂时没有好的解决办法,需要自己在一个个适配一下!

7.插件取消

  • Xcode8取消了三方插件的功能,好多教程破解可以继续使用,但是可能app上线可能会被拒。我们最喜爱的VVDocumenter-Xcode也不能使用了,下面是作者的感谢
    18970779-03464751f7f5a4b0

    看来大神都是谦虚的啊(啥时候能成为大神。我还是洗洗睡吧,梦里啥都有^_^

  • 上面也提到了我们可以继续使用注释,快捷键(⌥ Option + ⌘ Command + / )

8.UIStatusBar的问题

  • 在iOS10中,如果还使用以前设置UIStatusBar类型或者控制隐藏还是显示的方法,会报警告,方法过期,如下图:
19970779-665271622c13eb6e

警告中提到从iOS9.0开始就弃用这两个方法了,需要用

-[UIViewController preferredStatusBarstyle]

-[UIViewController preferredStatusBarHidden]来替换使用,那我们来看看新的替换方法。

  • 新技能见下面
  • 上面这个新方法在UIViewController.h文件中,这说明什么?当然说明这是viewController的属性和方法了,只需要在viewController里调用修改即可
  • UIStatusBarStyle 和 prefersStatusBarHidden这两个属性是readonly readonly readonly也就是说我们如果调用下面 肯定是报错的:
  • 正确的打开方式在viewController重写我们还没用的新的方法

9.UITextField(好像作用并不大)

  • 在iOS 10 中,UITextField新增了textContentType字段,是UITextContentType类型,它是一个枚举,作用是可以指定输入框的类型,以便系统可以分析出用户的语义.是电话类型就建议一些电话,是地址类型就建议一些地址.可以在#import 文件中,查看textContentType字段,有以下可以选择的类型:

10.UICollectionViewCell的的优化

  • 在iOS 10 之前,UICollectionView上面如果有大量cell,当用户活动很快的时候,整个UICollectionView的卡顿会很明显,为什么会造成这样的问题,这里涉及到了iOS 系统的重用机制,当cell准备加载进屏幕的时候,整个cell都已经加载完成,等待在屏幕外面了,也就是整整一行cell都已经加载完毕,这就是造成卡顿的主要原因,专业术语叫做:掉帧.
    要想让用户感觉不到卡顿,我们的app必须帧率达到60帧/秒,也就是说每帧16毫秒要刷新一次.
  • iOS 10 之前UICollectionViewCell的生命周期是这样的:
    1. 用户滑动屏幕,屏幕外有一个cell准备加载进来,把cell从reusr队列拿出来,然后调用prepareForReuse方法,在这个方法里面,可以重置cell的状态,加载新的数据;
    2. 继续滑动,就会调用cellForItemAtIndexPath方法,在这个方法里面给cell赋值模型,然后返回给系统;
    3. 当cell马上进去屏幕的时候,就会调用willDisplayCell方法,在这个方法里面我们还可以修改cell,为进入屏幕做最后的准备工作;
    4. 执行完willDisplayCell方法后,cell就进去屏幕了.当cell完全离开屏幕以后,会调用didEndDisplayingCell方法.
  • iOS 10 UICollectionViewCell的生命周期是这样的:
    1. 用户滑动屏幕,屏幕外有一个cell准备加载进来,把cell从reusr队列拿出来,然后调用prepareForReuse方法,在这里当cell还没有进去屏幕的时候,就已经提前调用这个方法了,对比之前的区别是之前是cell的上边缘马上进去屏幕的时候就会调用该方法,而iOS 10 提前到cell还在屏幕外面的时候就调用;
    2. 在cellForItemAtIndexPath中创建cell,填充数据,刷新状态等操作,相比于之前也提前了;
    3. 用户继续滑动的话,当cell马上就需要显示的时候我们再调用willDisplayCell方法,原则就是:何时需要显示,何时再去调用willDisplayCell方法;
    4. 当cell完全离开屏幕以后,会调用didEndDisplayingCell方法,跟之前一样,cell会进入重用队列.
  • 在iOS 10 之前,cell只能从重用队列里面取出,再走一遍生命周期,并调用cellForItemAtIndexPath创建或者生成一个cell.
  • 在iOS 10 中,系统会cell保存一段时间,也就是说当用户把cell滑出屏幕以后,如果又滑动回来,cell不用再走一遍生命周期了,只需要调用willDisplayCell方法就可以重新出现在屏幕中了.
  • iOS 10 中,系统是一个一个加载cell的,二以前是一行一行加载的,这样就可以提升很多性能;
  • iOS 10 新增加的Pre-Fetching预加载

    这个是为了降低UICollectionViewCell在加载的时候所花费的时间,在 iOS 10 中,除了数据源协议和代理协议外,新增加了一个UICollectionViewDataSourcePrefetching协议,这个协议里面定义了两个方法:

  • 在ColletionView prefetchItemsAt indexPaths这个方法是异步预加载数据的,当中的indexPaths数组是有序的,就是item接收数据的顺序;
    CollectionView cancelPrefetcingForItemsAt indexPaths这个方法是可选的,可以用来处理在滑动中取消或者降低提前加载数据的优先级.
    注意:这个协议并不能代替之前读取数据的方法,仅仅是辅助加载数据.
    Pre-Fetching预加载对UITableViewCell同样适用.

11.UIRefreshControl

  • 在iOS 10 中, UIRefreshControl可以直接在UICollectionView和UITableView中使用,并且脱离了UITableViewController.现在RefreshControl是UIScrollView的一个属性.
    使用方法:
  • 也可以进去头文件查看
20970779-1434ee72beca4596

12.UserNotifications(用户通知)

  • iOS 10 中将通知相关的 API 都统一了,苹果对这是做了重大改进,变的非常易用。

iOS 9 以前的通知

在调用方法时,有些方法让人很难区分,容易写错方法,这让开发者有时候很苦恼。
应用在运行时和非运行时捕获通知的路径还不一致。
应用在前台时,是无法直接显示远程通知,还需要进一步处理。
已经发出的通知是不能更新的,内容发出时是不能改变的,并且只有简单文本展示方式,扩展性根本不是很好。

iOS 10 开始的通知

所有相关通知被统一到了UserNotifications.framework框架中。
增加了撤销、更新、中途还可以修改通知的内容。
通知不在是简单的文本了,可以加入视频、图片,自定义通知的展示等等。
iOS 10相对之前的通知来说更加好用易于管理,并且进行了大规模优化,对于开发者来说是一件好事。
iOS 10开始对于权限问题进行了优化,申请权限就比较简单了(本地与远程通知集成在一个方法中)。

iOS 10 通知学习相关资料:

  1. UserNotifications: 苹果官方文档
  2. 活久见的重构 – iOS 10 UserNotifications 框架解析
  3. WWDC2016 Session笔记 – iOS 10 推送Notification新特性

后面对UserNotifications单独发表文章学习相关的知识

参考资料:

    1. http://blog.csdn.net/jiang314/article/details/52502450
    2. http://www.jianshu.com/p/90d5323cf510
    3. 个人博客 http://dely.vip
原文地址:https://www.cnblogs.com/zhangrunchao/p/5970684.html