在做ios 的不同功能的时候可能要寻求 ios系统爸爸很多的权限授权才可以完成。
然而在很多情况下有很多人有肯能会误点到,或者 主动未授权,那么相应的功能就无法开启了。但是有大多数用户是不知道的,作为一个优秀的程序员,为了更好用户体验,这个时候我们就需要检测相关权限是否授权,如果未授权要给与提示,去设置。
之前只要在系统上删除app再重新安装的时候,就会再次询问是否授权的操作。但最近随着系统更新发现各种权限只在第一次安装app的时候询问一次后,就不会再次询问了。这样以前卸载重装可以解决的问题就不行了,这个时候就更需要我们来提醒用户授权问题。
所以接下来总结一下相关权限的授权,检测是否授权,以及提示去设置的操作。
一 照相机权限
第一步 在 info.plist 文件中添加照相机权限,并在后面说明原因,系统询问授权前会显示给用户
第二步 在代码中询问授权
//相机权限
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authStatus ==AVAuthorizationStatusRestricted ||//此应用程序没有被授权访问的照片数据。可能是家长控制权限
authStatus ==AVAuthorizationStatusDenied) //用户已经明确否认了这一照片数据的应用程序访问
{
// 无权限 引导去开启 操作 写这里
}
二 照片权限 (选取照片 或者 存储图片)
1 第一步 同上在 在 info.plist 文件中添加照片权限,并在后面说明用途,系统询问授权前会显示给用户
2 代码询问
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
if ((status == PHAuthorizationStatusRestricted) || (status == PHAuthorizationStatusDenied) || (status == PHAuthorizationStatusNotDetermined))
{
// 提示询问逻辑 在这里写
UIAlertController * alertVC = [UIAlertController alertControllerWithTitle:@"" message:@"照片权限未开启" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction * goAction = [UIAlertAction actionWithTitle:@"去设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication]canOpenURL:url]) {
[[UIApplication sharedApplication]openURL:url];
}
}];
UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alertVC addAction:cancelAction];
[alertVC addAction:goAction];
[self presentViewController:alertVC animated:true completion:nil];
}else{
[self shutterCamera];
}
});
}];
三 麦克风 权限
1 第一步 同上在 在 info.plist 文件中添加麦克风权限,并在后面说明用途,系统询问授权前会显示给用户
2 第二步 代码开启询问
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
AVAudioSessionRecordPermission permissionStatus = [[AVAudioSession sharedInstance] recordPermission];
switch (permissionStatus) {
case AVAudioSessionRecordPermissionUndetermined:{
NSLog(@"第一次调用,是否允许麦克风弹框");
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
if (granted) {
// 第一次询问授权成功
}
else {
// 第一次询问授权失败
}
}];
break;
}
case AVAudioSessionRecordPermissionDenied:
// 授权失败 在这里做提示,去设置操作
break;
case AVAudioSessionRecordPermissionGranted:
// 授权成功
break;
default:
break;
}
if(permissionStatus == AVAudioSessionRecordPermissionUndetermined) return;
}
四 语音识别权限
1 第一步 同上在 在 info.plist 文件中添加 语音识别权限,并在后面说明用途,系统询问授权前会显示给用户
2 第二步 代码开启
语音识别是从 ios 10.0 开始兼容的,所以在 ios 系统低于10。0时记得提示用户更新系统才可以使用此功能。
if (@available(iOS 10.0, *)) {
[SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
switch (status) {
case SFSpeechRecognizerAuthorizationStatusNotDetermined:
case SFSpeechRecognizerAuthorizationStatusDenied:
case SFSpeechRecognizerAuthorizationStatusRestricted:
//授权失败
break;
case SFSpeechRecognizerAuthorizationStatusAuthorized:
// 授权成功
break;
default:
break;
}
});
}];
} else {
NSlog(@"@"系统版本过低,不支持翻译"")
}
五 后台播放权限
1 app进入后台的 进行后台播放
注意:记得在工程中打开发后台播放功能 否则不会后台播放
六 定位权限
1 第一步 infor.plist 中添加定位权限,并说明用途
2 代码判断是否具有定位权限
//定位服务是否可用
BOOL enable=[CLLocationManager locationServicesEnabled];
//是否具有定位权限
int status=[CLLocationManager authorizationStatus];
if (status == 2) {
// 在这里做提示 去开启的操作
} else if(!enable || status<3){
//请求权限
[_locationManager requestWhenInUseAuthorization];
}
最后 去设置
UIAlertController * alertVC = [UIAlertController alertControllerWithTitle:@"" message:@"某某权限未开启,无法进行。。。。。" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction * goAction = [UIAlertAction actionWithTitle:@"去设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication]canOpenURL:url]) {
[[UIApplication sharedApplication]openURL:url];
}
}];
UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alertVC addAction:cancelAction];
[alertVC addAction:goAction];
[self presentViewController:alertVC animated:true completion:nil];