iOS10和xcode8的GM版都放出了下载,我怀着忐忑的心更新了下(怕有适配问题啊!!!),先更新的xcode8,跑了下公司的项目,除了nullable字段有问题其他都还比较顺利,不过项目跑起来,还是有一点小问题,好在不像iOS9更新时变化那么多,然后我又给手机升级了iOS10,跑了个真机,结果一不小心测试到后半夜2点。。。浪费了一上午玩游戏的好时光。本篇就我碰到的问题一一整理,希望有类似问题的猴们,可以有点参考。
问题点
问题一(nullable)
Q:以前是可以nullable的,现在的报错了。
![](http://upload-images.jianshu.io/upload_images/2702013-14afe45e0dcb17f3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
A:删掉就好了
问题二(系统权限)
Q:xcode8编译的版本在访问相机、相册等需要用户点击允许开通权限的地方会崩溃A:由于iOS10对Security and Privacy Enhancements安全和保密性增强,在申请很多私有权限时,都需要添加描述,不添加会crash。解决办法,只需在info.plist里配置上请求权限的描述信息就可以了。
<key>NSCameraUsageDescription</key> <string>描述信息</string> <key>NSPhotoLibraryUsageDescription</key> <string>描述信息</string>
这里以相机和照片权限为例,描述信息可以是任何字符串,跟iOS9中的访问位置的字段是类似的
<key>NSLocationAlwaysUsageDescription</key> <string></string> <key>NSLocationWhenInUseUsageDescription</key> <string></string>
下面列出所有的key,用到的自行添加吧。
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能访问相册</string>
<key>NSCameraUsageDescription</key>
<string>App需要您的同意,才能访问相机</string>
<key>NSMicrophoneUsageDescription</key>
<string>App需要您的同意,才能访问麦克风</string>
<key>NSLocationUsageDescription</key>
<string>App需要您的同意,才能访问位置</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>App需要您的同意,才能在使用期间访问位置</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>App需要您的同意,才能始终访问位置</string>
<key>NSCalendarsUsageDescription</key>
<string>App需要您的同意,才能访问日历</string>
<key>NSRemindersUsageDescription</key>
<string>App需要您的同意,才能访问提醒事项</string>
<key>NSMotionUsageDescription</key>
<string>App需要您的同意,才能访问运动与健身</string>
<key>NSHealthUpdateUsageDescription</key>
<string>App需要您的同意,才能访问健康更新 </string>
<key>NSHealthShareUsageDescription</key>
<string>App需要您的同意,才能访问健康分享</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>App需要您的同意,才能访问蓝牙</string>
<key>NSAppleMusicUsageDescription</key>
<string>App需要您的同意,才能访问媒体资料库</string>
问题三(App跳转设置)
Q:访问当前应用的设置页面的问题
NSURL *url = [NSURL URLWithString:@"prefs:root=bundleIn identifier"];
if ([[UIApplication sharedApplication] canOpenURL:url])
{
[[UIApplication sharedApplication] openURL:url];
}
本来在iOS7-9上都正常工作的如上方式的跳转设置页面,在iOS10上点击会报下面的错误
![](http://upload-images.jianshu.io/upload_images/2702013-7bb51650628e72af.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
A:解决办法也很简单,实际上从iOS8开始就提供了直接跳转设置页面的url
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
替换成这个url就ok了,顺便openUrl方法在iOS10中也废弃了,不过还是可以用滴
(BOOL)openURL:(NSURL*)url NS_DEPRECATED_IOS(2_0, 10_0, "Please use openURL:options:completionHandler: instead") NS_EXTENSION_UNAVAILABLE_IOS("");
改为
(void)openURL:(NSURL)url options:(NSDictionary<NSString , id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS("");
问题四(字体变化引发的文字宽高计算问题)
Q:xcode7编译的包,动态计算一段文字的高度时,计算出来的高度在iOS10设备上不足以容纳这段文字A:因为iOS10更换了系统字体,所以会导致文字的大小跟iOS9及之前的系统有点区别,如果继续使用xcode7编译的话,建议在文字高度上多加5。或者直接使用xcode8编译的包也可以,文字的高度计算结果是正确的。至于类似YYText这样的库,底层使用CoreText写的,xcode7、xcode8上都会存在这个问题,在最后的计算出来的高度上直接加5就ok了。
问题五(推送获取device token问题)
Q:推送中在获取device token时,会报如下错误
![](http://upload-images.jianshu.io/upload_images/2702013-9e8c71cb90afde32.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
A:打开如下设置
![](http://upload-images.jianshu.io/upload_images/2702013-1fb2c66bed37bc33.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然后会自动生成如下文件
![](http://upload-images.jianshu.io/upload_images/2702013-a00582b00d1982e2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
打开如下显示
![](http://upload-images.jianshu.io/upload_images/2702013-20df119b0c800198.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
字段对应两种状态:development和production,然后再运行,即可成功获取device token了。
问题六(iOS7支持问题)
xcode8开始,不再支持iOS7,最低支持到iOS8。
![](http://upload-images.jianshu.io/upload_images/2702013-f53654492fff3f26.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
不过既然iOS10都出了,而且iOS7用户量是真心少,我觉得iOS7就可以舍弃了,还减轻了开发成本,一些老的库,比如ALAsset,性能真的不行了。不过还是得听领导安排啊哈哈。还好xcode8编译的ipa包,装在iOS7设备上,还是可以正常工作的,无非是测试时麻烦了点。
问题七(证书问题)
打开xcode8.0时编译运行时出现下面问题:
![](http://upload-images.jianshu.io/upload_images/2702013-ee6687d76791b37b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
39B1F3AE-530A-46B7-BE6E-379A0AA6B4DE.png
这个问题刚开始估计大家都会碰到也是第一个要解决的问题这个问题就是一个证书的设置问题,下面看两张图正常我们会在BuildeSettings中设置证书:
![](http://upload-images.jianshu.io/upload_images/2702013-3551b0c25223e924.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
A6682834-E135-4D55-9636-DC5E0962AF05.png
但是在xcode8.0中我们看到下面的新特性:
![](http://upload-images.jianshu.io/upload_images/2702013-ff9b459a07fc8e39.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
06300540-83C7-44F4-9069-F198599F0086.png
相信大家都能看到在Genreal下面会有Siging,没错这就是新特性,为了方便用户来管理,大家可以选择Automatically manage signing。需要输入开发者账号!如果没有账号也没关系,在下面也可以选择Debug、Realease、inHouse模式下对应的证书也可以!
但是 但是 但是 如果你的证书如果是通配符类型的,但是你的app包含了比如推送、apple pay、他会报错提示你未报含xx.id的manteid等等。所以你要生成针对你app的bundleid对应的证书!
问题八(插件取消)
Xcode8取消了三方插件的功能,好多教程破解可以继续使用,但是可能app上线可能会被拒。我们最喜爱的VVDocumenter-Xcode也不能使用了,下面是作者的感谢
![](http://upload-images.jianshu.io/upload_images/2702013-44e1d84f6e004705.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
9A4F4CA5-47C7-4301-9BE8-599DCA1BD5B4.png
上面也提到了我们可以继续使用注释,快捷键(⌥ Option + ⌘ Command + / )
问题九 UserNotifications(用户通知)
iOS 10 中将通知相关的 API 都统一了,苹果对这是做了重大改进,变的非常易用。
iOS 9 以前的通知
在调用方法时,有些方法让人很难区分,容易写错方法,这让开发者有时候很苦恼。应用在运行时和非运行时捕获通知的路径还不一致。应用在前台时,是无法直接显示远程通知,还需要进一步处理。已经发出的通知是不能更新的,内容发出时是不能改变的,并且只有简单文本展示方式,扩展性根本不是很好。
iOS 10 开始的通知
所有相关通知被统一到了UserNotifications.framework框架中。增加了撤销、更新、中途还可以修改通知的内容。通知不在是简单的文本了,可以加入视频、图片,自定义通知的展示等等。iOS 10相对之前的通知来说更加好用易于管理,并且进行了大规模优化,对于开发者来说是一件好事。iOS 10开始对于权限问题进行了优化,申请权限就比较简单了(本地与远程通知集成在一个方法中)。
iOS 10 通知学习相关资料: