美文网首页
获取用户权限

获取用户权限

作者: Leon1024 | 来源:发表于2019-01-02 23:17 被阅读0次

    获得相机或麦克风权限

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

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

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

    #import <AVFoundation/AVFoundation.h>
    
    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 <Photos/Photos.h>
    
    // 查询当前状态
    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 <CoreLocation/CLLocationManager.h>
    
    // 查询状态
    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;
    }
    
    待续。。。。。。

    相关文章

      网友评论

          本文标题:获取用户权限

          本文链接:https://www.haomeiwen.com/subject/mvstrqtx.html