每次更新大的版本总会折腾一段时间,特别是维护多个应用时,很是苦逼。下面将会讲述我在适配iOS10.0时踩过的一些坑和一些总结。
Xcode 8.0
如果你想适配iOS10.0首先得更新Xcode 至8.0+
Xcode 8.0 提供的选择最低支持iOS系统版本为8.0. (可以手动输入最低版本)
Xcode 8.0 警告提示也更完善。例如:
[super awakeFromNib]
-
TARGETS-General-Signing
变的越来越直观便于管理了:
屏幕快照 2016-10-11 19.30.44.png -
Xcode 8.0 第一次打开SB或者Xib文件时,会提示:
Choose an initial device view
,可以直接选着Close Document
或者选择一个设备作为布局使用。不过选择了设备后会有一些坑,下面会讲解到。可以参考stackoverflow
屏幕快照 2016-10-11 19.34.58.png 当你把已经存在的工程用Xcode 8.0 打开SB或者Xib文件后,再用Xcode 7.x 打开后会提示:
The document Main.storyboard requires Xcode 8.0 or later
解决办法参考 stackoverflow
- 运行工程也会发现终端多了很多奇怪的Log。关闭办法: 在Xcode菜单中打开:
Product
->Scheme
->Edit Scheme
,添加环境变量:OS_ACTIVITY_MODE
为disable
关闭方法参考:stackoverflow 。个人建议不要关闭日志,关闭后有些错误提示你就看不到了。
屏幕快照 2016-10-11 19.56.08.png
兼容 iOS 10.0 +
-
iOS 10.0+ 隐私权限设置。
iOS 10.0 开始对隐私权限更加严厉,如果没有设置权限的描述说明,直接奔溃。还好终端会提示你需要在info.plist 文件中添加对应的Key-Value
。这里需要注意的是如果你前面OS_ACTIVITY_MODE
为disable
的话也许就接受不倒终端的提示了,所以前面我建议最好不要关闭 我工程中一系列的隐私功能使用描述:
屏幕快照 2016-10-11 20.10.31.png -
Notification
自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化很小,直至现在iOS 10.0开始真正的进行大改重构,这让开发者也体会到UserNotifications的易用,功能也变得非常强大。iOS 9 以前的通知
- 应用在运行时和非运行时捕获通知的路径不一致。
应用在前台时,是无法直接显示远程通知,还需要进一步处理。
已经发出的通知是不能更新的,内容发出时是不能改变的,并且只有简单文本展示方式,扩展性根本不是很好。
iOS 10 开始的通知
所有相关通知被统一到了UserNotifications.framework框架中。
增加了撤销、更新、中途还可以修改通知的内容。
通知不在是简单的文本了,可以加入视频、图片,自定义通知的展示等等。
iOS 10相对之前的通知来说更加好用易于管理,并且进行了大规模优化,对于开发者来说是一件好事。
iOS 10开始对于权限问题进行了优化,申请权限就比较简单了(本地与远程通知集成在一个方法中)。
更多详细内容请参考: Apple视频文档
用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