iOS 10 开发适配系列 之 权限Crash问题
2016-10-25 17:22
537 查看
摘要: 今天接手了一个项目,由于证书什么的没在我的电脑上,经过一番配置,编译成功了。但是刚运行就发生了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 NSContactsUsageDescription key with a string value explaining to the user how the app uses this data.
其实,在iOS10对用户的安全和隐私的增强,在申请很多私有权限的时候都需要添加描述.
要想解决这个问题,只需要在
如果不起作用,可以请求后台权限,类似于这样:
我在Xcode的info.plist文件中做了一下的配置
![](http://static.oschina.net/uploads/space/2016/1023/163318_FgU8_2973131.png)
说到这里,就不得不说一说iOS10适配的问题了。下面是除了数据隐私问题外的其他问题。
一、https问题
在iOS 9的时候,我们可以通过配置,禁用掉ATS安全功能。但是此前,6月14日在WWDC 2016开发者大会上,苹果宣布了一个最后期限:2017年1月1日起,苹果App Store中的所有App都必须启用 App Transport Security(ATS)安全功能。也就是说,那时候以后的http请求会失败。
它会永远返回
应该使用下面的这些方法:
Objective-C 中这样写:
或者使用:
或者使用:
有时候会缺少一些常量,
在swift中应该这样:
或者使用
三、UIStatusBar方法过期
在文档中是这样的:
![](http://static.oschina.net/uploads/space/2016/1023/173528_buHl_2973131.png)
在我们开发中有可能用到UIStatusBar一些属性,在iOS 10 中这些方法已经过期了,如果你的项目中有用的话就得需要适配。上面的图片也能发现,如果在iOS 10中你需要使用preferredStatusBar比如这样:
四、iOS 10 UICollectionView 性能优化
随着开发者对UICollectionView的信赖,项目中用的地方也比较多,但是还是存在一些问题,比如有时会卡顿、加载慢等。所以iOS 10 对UICollectionView进一步的优化,因为叙述起来比较复杂耗费时间,并且已经有人总结过了,在这里只提供学习参考文章如下:WWDC2016 Session笔记 - iOS 10 UICollectionView新特性
在iOS 10 UITextField添加了textContentType枚举,指示文本输入区域所期望的语义意义。
使用此属性可以给键盘和系统信息,关于用户输入的内容的预期的语义意义。例如,您可以指定一个文本字段,用户填写收到一封电子邮件确认uitextcontenttypeemailaddress。当您提供有关您期望用户在文本输入区域中输入的内容的信息时,系统可以在某些情况下自动选择适当的键盘,并提高键盘修正和主动与其他文本输入机会的整合。
![](http://static.oschina.net/uploads/space/2016/1023/173655_mfdf_2973131.png)
iOS 10 以后只要是继承UIScrollView那么就支持刷新功能:
其实,在iOS10对用户的安全和隐私的增强,在申请很多私有权限的时候都需要添加描述.
要想解决这个问题,只需要在
info.plist添加
NSContactsUsageDescription的key, value自己随意填写就可以,好在这些key的名字在Xcode 8中已经有了自动补全。添加一个属性,输入Privacy后就会出现自动提示。这里列举出对应的key(Source Code模式下):
<!-- 相册 --> <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>
如果不起作用,可以请求后台权限,类似于这样:
<key>UIBackgroundModes</key> <array> <!-- 在这里写上你在后台模式下要使用权限对应的key --> <string>location</string>
我在Xcode的info.plist文件中做了一下的配置
![](http://static.oschina.net/uploads/space/2016/1023/163318_FgU8_2973131.png)
说到这里,就不得不说一说iOS10适配的问题了。下面是除了数据隐私问题外的其他问题。
一、https问题
在iOS 9的时候,我们可以通过配置,禁用掉ATS安全功能。但是此前,6月14日在WWDC 2016开发者大会上,苹果宣布了一个最后期限:2017年1月1日起,苹果App Store中的所有App都必须启用 App Transport Security(ATS)安全功能。也就是说,那时候以后的http请求会失败。
二、系统判断方法失效:
在你的项目中,当需要判断系统版本的话,不要使用下面的方法:#define isiOS10 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=10)
它会永远返回
NO,
substringToIndex:1在iOS 10 会被检测成 iOS 1了,
应该使用下面的这些方法:
Objective-C 中这样写:
#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame) #define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending) #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) #define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) #define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
或者使用:
if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){.majorVersion = 9, .minorVersion = 1, .patchVersion = 0}]) { NSLog(@"Hello from > iOS 9.1");} if ([NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){9,3,0}]) { NSLog(@"Hello from > iOS 9.3");}
或者使用:
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_9_0) { // do stuff for iOS 9 and newer} else { // do stuff for older versions than iOS 9}
有时候会缺少一些常量,
NSFoundationVersionNumber是在
NSObjCRuntime.h中定义的,作为Xcode7.3.1的一部分,我们设定常熟范围从iPhone OS 2到
#define NSFoundationVersionNumber_iOS_8_4 1144.17,在iOS 10(Xcode 8)中,苹果补充了缺少的数字,设置有未来的版本.
#define NSFoundationVersionNumber_iOS_9_0 1240.1 #define NSFoundationVersionNumber_iOS_9_1 1241.14 #define NSFoundationVersionNumber_iOS_9_2 1242.12 #define NSFoundationVersionNumber_iOS_9_3 1242.12 #define NSFoundationVersionNumber_iOS_9_4 1280.25 #define NSFoundationVersionNumber_iOS_9_x_Max 1299
在swift中应该这样:
if NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 10, minorVersion: 0, patchVersion: 0)) { // 代码块 }
或者使用
if #available(iOS 10.0, *) { // 代码块 } else { // 代码块 }
三、UIStatusBar方法过期
在文档中是这样的:
![](http://static.oschina.net/uploads/space/2016/1023/173528_buHl_2973131.png)
在我们开发中有可能用到UIStatusBar一些属性,在iOS 10 中这些方法已经过期了,如果你的项目中有用的话就得需要适配。上面的图片也能发现,如果在iOS 10中你需要使用preferredStatusBar比如这样:
//iOS 10 - (UIStatusBarStyle)preferredStatusBarStyle { // //return UIStatusBarStyleDefault; // }
四、iOS 10 UICollectionView 性能优化
随着开发者对UICollectionView的信赖,项目中用的地方也比较多,但是还是存在一些问题,比如有时会卡顿、加载慢等。所以iOS 10 对UICollectionView进一步的优化,因为叙述起来比较复杂耗费时间,并且已经有人总结过了,在这里只提供学习参考文章如下:WWDC2016 Session笔记 - iOS 10 UICollectionView新特性
五、iOS 10 UITextContentType
// The textContentType property is to provide the keyboard with extra information about the semantic intent of the text document.@property(nonatomic,copy) UITextContentType textContentType NS_AVAILABLE_IOS(10_0); // default is nil
在iOS 10 UITextField添加了textContentType枚举,指示文本输入区域所期望的语义意义。
使用此属性可以给键盘和系统信息,关于用户输入的内容的预期的语义意义。例如,您可以指定一个文本字段,用户填写收到一封电子邮件确认uitextcontenttypeemailaddress。当您提供有关您期望用户在文本输入区域中输入的内容的信息时,系统可以在某些情况下自动选择适当的键盘,并提高键盘修正和主动与其他文本输入机会的整合。
六、iOS 10 字体随着手机系统字体而改变
当我们手机系统字体改变了之后,那我们App的label也会跟着一起变化,这需要我们写很多代码来进一步处理才能实现,但是iOS 10 提供了这样的属性adjustsFontForContentSizeCategory来设置。因为没有真机,具体实际操作还没去实现,如果理解错误帮忙指正。
UILabel *myLabel = [UILabel new]; /* UIFont 的preferredFontForTextStyle: 意思是指定一个样式,并让字体大小符合用户设定的字体大小。 */ myLabel.font =[UIFont preferredFontForTextStyle: UIFontTextStyleHeadline]; /* Indicates whether the corresponding element should automatically update its font when the device’s UIContentSizeCategory is changed. For this property to take effect, the element’s font must be a font vended using +preferredFontForTextStyle: or +preferredFontForTextStyle:compatibleWithTraitCollection: with a valid UIFontTextStyle. */ //是否更新字体的变化 myLabel.adjustsFontForContentSizeCategory = YES;
七、iOS 10 UIScrollView新增refreshControl
![](http://static.oschina.net/uploads/space/2016/1023/173655_mfdf_2973131.png)
iOS 10 以后只要是继承UIScrollView那么就支持刷新功能:
@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(10_0) __TVOS_PROHIBITED;
相关文章推荐
- iOS 10 开发适配系列 之 权限Crash问题
- iOS 10 开发适配系列 之 权限Crash问题
- iOS 10 开发适配系列 之 权限Crash问题
- iOS 10 开发适配系列 之 权限Crash问题
- iOS 10 开发适配系列 之 权限Crash问题
- [绍棠] iOS 10 开发适配系列 之 权限Crash问题
- iOS 10 开发适配系列 之 权限Crash问题
- iOS 10 开发适配系列 之 权限Crash问题
- iOS 10 开发适配系列 之 权限Crash问题
- iOS 10 开发适配系列 之 权限Crash问题
- iOS 10 开发适配系列 之 权限Crash问题
- IOS 10 适配系列_4_ 权限Crash问题
- iOS 10 适配系列-权限Crash问题
- iOS - 适配iOS10以及由于权限crash的问题
- iOS开发 iOS 10权限问题
- iOS 10 开发之权限Crash 相机相册等权限的使用、检测并引导用户开启权限
- iOS开发-iOS 10 由于权限问题导致崩溃的那些坑
- 问题:iOS 10 权限Crash问题
- 问题:iOS 10 权限Crash问题
- iOS 10 开发适配问题汇总详解