iOS-权限判断

  • 开发中一些经常使用到的权限判断:相册、相机、定位、通讯录、通知等,适配iOS10
  • 本文不在适配iOS7
一:相册
  • 从iOS8开始苹果推荐使用PHAuthorizationStatus来判断获取相册权限,PHAuthorizationStatus位于Photos.frameworkPHPhotoLibrary.h文件

  • 使用PHPhotoLibrary.h需要引入头文件#import <Photos/Photos.h>

  • 在info.plist 中添加iOS10需要的权限设置

<!-- 相册 --> 
<key>NSPhotoLibraryUsageDescription</key> 
<string>App需要您的同意,才能访问相册</string>
  • 权限判断,并注册授权
// 1.获取相册授权状态
       PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
    // 2.根据状态进行相应的操作
    switch (status) {
        case PHAuthorizationStatusNotDetermined: { // 用户还没有做出选择
            // 2.1请求获取权限
            [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
                if (status == PHAuthorizationStatusDenied) {
                    // 拒绝授权
                }else if (status == PHAuthorizationStatusAuthorized) {
                    // 授权成功
                }else if (status == PHAuthorizationStatusRestricted) {
                    // 受限制,家长控制,不允许访问
                }
            }];
            break;
        }
        case PHAuthorizationStatusRestricted:
          // 受限制,家长控制,不允许访问
            break;
        case PHAuthorizationStatusDenied:
            // 用户拒绝授权使用相册,需提醒用户到设置里面去开启app相册权限
            break;
        case PHAuthorizationStatusAuthorized:
          // 用户已经授权,可以使用
            break;
        default:
            break;
    }
二:相机
  • 引入头文件 #import <AVFoundation/AVFoundation.h>
  • 在info.plist 中添加iOS10需要的权限设置
<!-- 相机 --> 
<key> NSCameraUsageDescription </key> 
<string>App需要您的同意,才能访问相机</string>
  • 相机功能,通常使用在拍照、视频等方面。一般情况下会判断摄像机是否可用,避免相应的crash
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        // 可以使用,进行权限判断
    }else {
        // 没有检查到设备
    }
  • 权限判断,并注册授权
// 1.获取相机授权状态
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    // 2.检测授权状态
    switch (status) {
        case AVAuthorizationStatusNotDetermined: { // 用户还没有做出选择
            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
                if (granted) {
                    // 成功授权
                }else {
                    // 拒绝授权
                }
            }];
        }
            break;
        case    AVAuthorizationStatusRestricted:
            // 受限制,家长控制,不允许访问
            break;
        case   AVAuthorizationStatusDenied:
            // 用户拒绝授权使用相机,需提醒用户到设置里面去开启app相机权限
            break;
        case   AVAuthorizationStatusAuthorized:
            break;
            // 已经授权
        default:
            break;
    }
三:定位
  • 引用头文件#import <CoreLocation/CoreLocation.h>
  • 在info.plist 中添加位置服务权限
<!-- 在使用期间访问位置 --> 
<key>NSLocationWhenInUseUsageDescription</key> 
<string>App需要您的同意,才能在使用期间访问位置</string> 
<!-- 始终访问位置 --> 
<key>NSLocationAlwaysUsageDescription</key> 
<string>App需要您的同意,才能始终访问位置</string> 
  • app请求定位之前,通常应该先确定用户是否启用了位置服务。
BOOL enabled = [CLLocationManager locationServicesEnabled];
YES:已经开启
NO:关闭了定位,需要提醒用户去系统设置中打开定位服务
  • 声明强引用,防止被释放
@property (nonatomic,strong) CLLocationManager *manager;
  • app授权状态检测,并注册授权
// 1.定位服务是否开启
    BOOL enabled = [CLLocationManager locationServicesEnabled];
    if (enabled) {
        // 2.app授权状态检测
        CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
        switch (status) {
            case kCLAuthorizationStatusNotDetermined:  // 用户还没有选择这个应用程序
                // iOS8方法,注册使用期间开启定位,建议使用这个方法,二选一
                [_manager requestWhenInUseAuthorization];
                // iOS8方法,注册使用一直开启定位,二选一
                [_manager requestAlwaysAuthorization];
                break;
            case kCLAuthorizationStatusRestricted: // 受限制,家长控制,不允许访问
                break;
            case kCLAuthorizationStatusDenied: //用户已明确拒绝对此应用程序的授权,或在“设置”中禁用位置服务。
                break;
            case kCLAuthorizationStatusAuthorizedAlways: // 用户已经授权在任何时候使用他们的位置,
                // 使用了requestAlwaysAuthorization或在“设置”中“位置”切换为“始终”,会触发
                break;
            case kCLAuthorizationStatusAuthorizedWhenInUse: // 使用期间才能使用其位置
                // 使用了requestWhenInUseAuthorization或在“设置”中“位置”切换为“使用应用期间”,会触发
                break;
                //case kCLAuthorizationStatusAuthorized : // 用户已授权此应用程序使用位置服务。在MacOS上使用
            default:
                break;
        }
四:通讯录
  • 从iOS9开始苹果推荐使用Contacts.framework框架来访问手机的通讯录,AddressBook.framework在iOS9被弃用了,所以手机适配iOs8依然要使用AddressBook.framework
  • 在info.plist添加通讯录权限
<!-- 通讯录 --> 
<key>NSContactsUsageDescription<key>
<string>App需要您的同意,才能通讯录<string>
  • 4.1Contacts.framework使用: !!!iOS9以上的异同版本才能使用这个框架
  • 引入头文件#import <Contacts/Contacts.h>
  • 权限判断,并注册授权
   // 1.获取通讯录授权状态
   CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
   switch (status) {
       case CNAuthorizationStatusNotDetermined:  {//  用户尚未就应用程序是否可以访问联系人数据做出选择。
           CNContactStore *store = [[CNContactStore alloc] init];
           [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
               if (granted) {
                   // 授权成功
               }else {
                   // 未授权访问通讯录!
               }
           }];
       }
           break;
       case CNAuthorizationStatusRestricted: // 用户无法更改此应用程序的状态,可能是由于主动限制(如父母控制)。
           break;
       case CNAuthorizationStatusDenied: // 用户明确拒绝对应用程序的联系人数据的访问。
           break;
       case CNAuthorizationStatusAuthorized: // 该应用程序被授权访问联系人数据。
           break;
       default:
           break;
   }
  • 4.2AddressBook.framework使用
  • 引入头文件#import <AddressBook/AddressBook.h>
  • 注册授权
ABAddressBookRef addressBook;
   CFErrorRef error = nil;
   addressBook = ABAddressBookCreateWithOptions(NULL,&error);
// app第一次启动注册会自动弹出通知框请求授权,如果授权或者拒绝,第二次启动只会进行权限判断
   ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
       dispatch_async(dispatch_get_main_queue(), ^{
           if (error) {
               // 通讯录导入出错
           }else if (!granted){
               // 未授权访问通讯录!
           }else {
               // 授权成功
           }
       });
   });
五:通知
  • iOS10新增了UserNotificationKit框架,整合了关于通知的方法。增加了很多新特性
  • 通知不需要配置info.plist,系统会根据注册的内容弹出相应的提示框
  • iOS8 - iOS10注册通知
    [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil]];
  • iOS10
  • 引入头文件#import <UserNotifications/UserNotifications.h>
  • 注册授权
 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    UNAuthorizationOptions options = UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert;
    [center requestAuthorizationWithOptions:options completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (granted) {
            // 授权
        }else {
            // 拒绝
        }
    }];
    // 获取各种授权信息
    [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
        NSLog(@"%@",settings);
    }];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
附:iOS10之后,需要设置权限的配置信息
麦克风权限:Privacy - Microphone Usage Description 
相机权限: Privacy - Camera Usage Description 
相册权限: Privacy - Photo Library Usage Description
通讯录权限: Privacy - Contacts Usage Description 
蓝牙权限:Privacy - Bluetooth Peripheral Usage Description 
语音转文字权限:Privacy - Speech Recognition Usage Description 
日历权限:Privacy - Calendars Usage Description 
定位权限:Privacy - Location When In Use Usage Description 
定位权限: Privacy - Location Always Usage Description 
位置权限:Privacy - Location Usage Description
媒体库权限:Privacy - Media Library Usage Description
健康分享权限:Privacy - Health Share Usage Description
健康更新权限:Privacy - Health Update Usage Description
运动使用权限:Privacy - Motion Usage Description
音乐权限:Privacy - Music Usage Description
提醒使用权限:Privacy - Reminders Usage Description
Siri使用权限:Privacy - Siri Usage Description
电视供应商使用权限:Privacy - TV Provider Usage Description
视频用户账号使用权限:Privacy - Video Subscriber Account Usage Description
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容