每次更新大的版本总会折腾一段时间,特别是维护多个应用时,很是苦逼。下面将会讲述我在适配iOS10.0时踩过的一些坑和一些总结。
Xcode 8.0
如果你想适配iOS10.0首先得更新Xcode 至8.0+
-
Xcode 8.0 提供的选择最低支持iOS系统版本为8.0. (可以手动输入最低版本)
-
Xcode 8.0 警告提示也更完善。例如:
[super awakeFromNib]
-
屏幕快照 2016-10-11 19.30.44.pngTARGETS-General-Signing
变的越来越直观便于管理了:
- 屏幕快照 2016-10-11 19.34.58.png
- 运行工程也会发现终端多了很多奇怪的Log。关闭办法: 在Xcode菜单中打开:
Product
->Scheme
->Edit Scheme
,添加环境变量:OS_ACTIVITY_MODE
为disable
关闭方法参考: 。个人建议不要关闭日志,关闭后有些错误提示你就看不到了。
屏幕快照 2016-10-11 19.56.08.png
兼容 iOS 10.0 +
-
iOS 10.0+ 隐私权限设置。
屏幕快照 2016-10-11 20.10.31.png
iOS 10.0 开始对隐私权限更加严厉,如果没有设置权限的描述说明,直接奔溃。还好终端会提示你需要在info.plist 文件中添加对应的Key-Value
。这里需要注意的是如果你前面OS_ACTIVITY_MODE
为disable
的话也许就接受不倒终端的提示了,所以前面我建议最好不要关闭 我工程中一系列的隐私功能使用描述:
-
Notification
自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化很小,直至现在iOS 10.0开始真正的进行大改重构,这让开发者也体会到UserNotifications的易用,功能也变得非常强大。iOS 9 以前的通知
- 应用在运行时和非运行时捕获通知的路径不一致。
-
应用在前台时,是无法直接显示远程通知,还需要进一步处理。
-
已经发出的通知是不能更新的,内容发出时是不能改变的,并且只有简单文本展示方式,扩展性根本不是很好。
iOS 10 开始的通知
-
所有相关通知被统一到了UserNotifications.framework框架中。
-
增加了撤销、更新、中途还可以修改通知的内容。
-
通知不在是简单的文本了,可以加入视频、图片,自定义通知的展示等等。
-
iOS 10相对之前的通知来说更加好用易于管理,并且进行了大规模优化,对于开发者来说是一件好事。
-
iOS 10开始对于权限问题进行了优化,申请权限就比较简单了(本地与远程通知集成在一个方法中)。
-
用Xcode 8.0打开并选择了相应的设备作为布局后在
viewDidLoad
方法中调用CGRectGetWidth(self.view.bounds)
和CGRectGetHeight(self.view.bounds)
不能获取真实宽度和高度结果都为600,需要在viewDidAppear
中调用获取真实高度,解决办法使用[[UIScreen mainScreen] bounds].size.xxxx
-
设置了宽度和高度
Equals
约束后,在Xcode 8.0 以前是可以通过 函数CGRectGetWidth()
或CGRectGetHeight()
来获取宽度和高度,但是用Xcode 8.0打开并选择了相应的设备作为布局后,宽度和高度就获取不到了。解决办法:把约束作为一个变量,然后获取约束的constant
。(这个坑很难察觉,如果你适配时如果选择了相应的设备作为布局,最好check下是否有类似的情况) -
iOS 10.0 UIScrollView新增refreshControl
iOS 10.0 以后只要是继承UIScrollView那么就支持刷新功能:
@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(10_0) __TVOS_PROHIBITED;
- 判断版本
不要使用[[[[UIDevice currentDevice] systemVersion] substringToIndex:1] integerValue]
改为[[[UIDevice currentDevice] systemVersion] floatValue]
看下面代码及打印结果
CGFloat f = [[[UIDevice currentDevice] systemVersion] floatValue];
CGFloat t = [[[[UIDevice currentDevice] systemVersion] substringToIndex:1] integerValue];
NSLog(@"f:%f--t:%f",f,t);
//Log
f:10.000000--t:1.000000