获取用户权限

获得相机或麦克风权限

使用到对应的权限时,应在info.plist文件中加入对应的权限描述。

  • NSCameraUsageDescription
    允许访问您的相机才能XXXXXXXXXX(描述准确)

  • NSMicrophoneUsageDescription
    允许访问您的麦克风才能XXXXXXXXXX(描述准确)

#import 

AVMediaType AVType = AVMediaTypeAudio;  // AVMediaTypeVideo 摄像头  AVMediaTypeAudio 麦克风
// 读取当前权限状态
AVAuthorizationStatus avStatus = [AVCaptureDevice authorizationStatusForMediaType:AVType];
// 根据当前状态作出对应的操作
switch (avStatus) {
    case AVAuthorizationStatusNotDetermined:
        NSLog(@"未决定的");
        // 发出权限请求, 在未决定的时候发出请求系统才会弹出对话框,其它情况下发出下面的请求也不弹框,需要自己去指引用户设置
        [AVCaptureDevice requestAccessForMediaType:AVType completionHandler:^(BOOL granted) {
            if (granted) {
                NSLog(@"用户同意使用");
            }else{
                NSLog(@"用户不同意使用");
            }
        }];
        break;
    case AVAuthorizationStatusRestricted:   // 应该自己设置弹框引导用户去打开设置
        NSLog(@"因其它原因被禁止的");
        break;
    case AVAuthorizationStatusDenied:   // 应该自己设置弹框引导用户去打开设置
        NSLog(@"用户拒绝的的");
        break;
    case AVAuthorizationStatusAuthorized:   // 进行业务操作
        NSLog(@"同意的");
        
        break;
    default:
        break;
}


// 跳转到设置页面,只要请求过权限的,就会出现在这个页面,如果没有请求过的权限,这个页面是不会出现对应的权限设置的
NSURL * url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
        if (success) {
            NSLog(@"打开设置成功");
        }
    }];
}

相册

ios11 之后,刚开始访问相机的时候,系统默认可以进入,但会在选择中某一张相片的时候,进行权限的询问.
- NSPhotoLibraryUsageDescription
允许访问您的相册才能XXXXXXXXXX(描述准确)

#import 

// 查询当前状态
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
switch (status) {
    case PHAuthorizationStatusNotDetermined:
        NSLog(@"未决定的");
        // 此处应发起请求
        break;
    case PHAuthorizationStatusRestricted:
        NSLog(@"因其它原因被禁止的");
        break;
    case PHAuthorizationStatusDenied:
        NSLog(@"用户拒绝的的");
        break;
    case PHAuthorizationStatusAuthorized:
        NSLog(@"同意的");
        break;
    default:
        break;
}


// 发起请求
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
    switch (status) {
        case PHAuthorizationStatusDenied:
            NSLog(@"用户拒绝的的");
            break;
        case PHAuthorizationStatusAuthorized:
            NSLog(@"同意的");
            break;
        default:
            break;
    }
}];

位置

位置在iOS11.4之前和之后有区别。

iOS11.4之前的描述
  • NSLocationWhenInUseUsageDescription 使用期间获得权限的描述
    对应请求:
[self.locationManager requestWhenInUseAuthorization];
  • NSLocationAlwaysUsageDescription 未使用期间获得权限的描述
    对应请求:
[self.locationManager requestAlwaysAuthorization];

以上描述和请求一一对应,互不干扰。根据需要进行描述和请求。在用户未决定之前,系统弹出的对话框是只有同意和不同意的选择。

iOS11.4后

如果只询问使用期间的权限(requestWhenInUseAuthorization),与之前版本相同。
如果需要询问是否可以获得未使用期间的权限( requestAlwaysAuthorization),则需要同时配置下面的两个描述:

  • NSLocationWhenInUseUsageDescription 使用期间获得权限的描述
  • NSLocationAlwaysAndWhenInUseUsageDescription 使用和未使用期间的权限描述
    第二个描述,替代了之前版本关于未使用期间的描述。此时代码进行(requestAlwaysAuthorization)请求权限时,如果当前状态是用户未决定的,则系统会弹出对话框,而这个对话框会有三个选项:
    1、仅在使用应用期间
    2、始终允许
    3、不允许
    这也是为什么代码进行(requestAlwaysAuthorization)请求权限时,必须要同时有两种描述存在的原因。
注意

1、在第一次请求权限的时候,CLLocationManager 的实例对象应该被引用起来,否则对话框只会一闪而过。
2、通过CLLocationManager的delegate,我们可以从“授权回调”方法:
-(void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;中获得在用户点击询问“允许”还是“拒绝”时的结果。

#import 

// 查询状态
CLAuthorizationStatus CLStatus = [CLLocationManager authorizationStatus];
switch (CLStatus) {
    case kCLAuthorizationStatusNotDetermined:
        NSLog(@"用户尚未选择决定的");
        // 此处应发起请求
        break;
    case kCLAuthorizationStatusRestricted:
        NSLog(@"其它原因被禁止的");
        break;
    case kCLAuthorizationStatusAuthorizedAlways:
        NSLog(@"前台后台一直可以使用定位");
        break;
    case kCLAuthorizationStatusAuthorizedWhenInUse:
        NSLog(@"试用期间可以定位");
        break;
    case kCLAuthorizationStatusDenied:
        NSLog(@"用户拒绝定位服务");
        break;
    default:
        break;
}

// 发起请求,实例对象要引用起来,防止询问对话框一闪消失
self.locationManager = [[CLLocationManager alloc] init];
//[self.locationManager requestWhenInUseAuthorization]; 请求使用期间的权限
// 请求始终允许获得定位的权限
[self.locationManager requestAlwaysAuthorization];

通讯录

  • Contacts Usage Description
    允许访问您的通讯录才能XXXXXXXXXX(描述准确)
// 查询当前状态
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
switch (status) {
    case CNAuthorizationStatusNotDetermined:    // 未确定的
    {
        // 进行权限请求
        CNContactStore *store = [[CNContactStore alloc] init];
        [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError*  _Nullable error) {
            if (error) {
                NSLog(@"授权失败");
            }else {
                NSLog(@"成功授权");
            }
        }];
    }
        break;
    case CNAuthorizationStatusRestricted:
        NSLog(@"其它原因被禁止的");
        break;
    case CNAuthorizationStatusDenied:
        NSLog(@"用户拒绝的");
         [self showAlertViewAboutNotAuthorAccessContact];
        break;
    case CNAuthorizationStatusAuthorized:
        NSLog(@"用户同意的");
        //有通讯录权限-- 进行下一步操作
        break;
    default:
        break;
}
待续。。。。。。

你可能感兴趣的:(获取用户权限)