获取用户权限

获得相机或麦克风权限

使用到对应的权限时,应在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;
}
待续。。。。。。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • github 下载地址 JQAuthorizationTools JQAuthorizationTools 获取用...
    Frankenstein张阅读 1,842评论 0 2
  • 开始注意这点可以做很多优化是即刻当初对用户开启通知权限的流程没思考到这一点。 即刻是会在第一次安装时的引导页,自己...
    舒克安静了阅读 171评论 1 0
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,171评论 0 9
  • 背景 我们在App使用过程中包含获取用户位置的需求,于是在工程的Info.plis中,我们包含“Location ...
    wangplus7阅读 10,772评论 0 10
  • 系统权限 Android 是一个权限分隔的操作系统,其中每个应用都有其独特的系统标识(Linux 用户 ID 和组...
    进攻的蚂蚁阅读 2,190评论 0 0