UIApplicationOpenSettingsURLString闪退

本文探讨了在iPhone上由于隐私权限限制导致使用UIApplicationOpenSettingsURLString时可能出现的闪退问题。iOS系统对隐私权限管理越来越严格,应用必须正确配置和注册隐私项目。当应用未正确配置相关权限,比如相册访问,直接调用该方法可能导致应用崩溃。解决方案是确保在调用前已将隐私权限注册到系统。同时,该方法在不同iOS版本中可能有所变化,需要适配。

iPhone在隐私方面对开发者的要求越来越高,在iOS10 中加入对相机相册定位蓝牙等一系列的限制,app在配置文件中未对这些隐私项目进行配置并提供相应的使用理由时iOS会拒绝使用这些隐私项目,并且应用在强制使用时,iOS会直接将app退出。
1. 对于应用到这些隐私的地方一定要进行配置。
2. 配置时说明的用途,暂时了解到2个地方要用,
1). 是用户在首次访问该隐私功能时,应用中的对话框会弹出来;
2). 是在系统设置中对隐私项目使用的描述;

对话框提示

系统设置里描述

有时在使用QQ的过程中会进入到这样的页面:

QQ独立的隐私设置页

在这个页面系统会将QQ用到的诸如定位相机相册 这些隐私配置,显示出来。
当用户关闭其中一个设置,而且在后续的使用时触发了这个被关闭的配置时,QQ会引导用户跳转到系统的QQ自己独立的隐私设置页面,让用户进行重新设置,这样以来用户在使用上就方便很多了。
在开发应用时其实是很容易做到这一点,可以直接使用下面这句代码完成:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

就这句代码就可以实现上述一键到达app独立的隐私配置页的功能。

那么如题,有时新建工程后,在应用使用这段代码,在正常打开系统设置 时,先出现白屏,随后设置就崩溃。 原因很简单,对照以下问题:
1. 在系统设置首页最下面的apps列表中始终找不到自己的app,而能找到QQ,微信等其他app,并且QQ的下一级页面有很多选项,包括定位相机相册等;
2. 工程中没有找到配置这些隐私key,随后在info.plist中配置了相册始终定位使用期间定位等项目,然后再重新使用上面的代码,结果依然出现上述第一点的问题;
个人感觉iOS在隐私使用上的这个流程应该是:1.app在自身做了隐私项目使用的标记,2.调用系统的api注册到系统,3.系统征询用户的许可,4.当许可通过,app就可以对隐私权限进行使用了。
那么上面的问题原因在于,当在app中配置了这些隐私项目,但是并没有在系统中去注册。系统的注册表中并没用相关的注册信息,也就无法在系统的设置当中进行展示,当强制跳转到隐私独立配置页时,因为没有相应的数据,所以系统设置就奔溃了,所以这个算是iOS系统的一个bug。
那么处理的方式:一定要保证在调用[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; 之前将隐私配置注册到系统中去。以相册为例:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.allowsEditing = YES;
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    [self presentViewController:imagePicker animated:YES completion:nil];

在调用相册之前系统就会去申请许可限制,这样就将配置注册到系统去了,这样避免了系统设置的崩溃;

另外,
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
这个方法在iOS8之前还属于私用方法,不能使用,之后可以正常使用。
当然在iOS10中openUrl的方法也变了,可以做相应变化进行调整就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值