iOS-权限判断

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

  • 使用PHPhotoLibrary.h需要引入头文件#import

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

 
NSPhotoLibraryUsageDescription 
App需要您的同意,才能访问相册
  • 权限判断,并注册授权
// 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
  • 在info.plist 中添加iOS10需要的权限设置
 
 NSCameraUsageDescription  
App需要您的同意,才能访问相机
  • 相机功能,通常使用在拍照、视频等方面。一般情况下会判断摄像机是否可用,避免相应的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
  • 在info.plist 中添加位置服务权限
 
NSLocationWhenInUseUsageDescription 
App需要您的同意,才能在使用期间访问位置 
 
NSLocationAlwaysUsageDescription 
App需要您的同意,才能始终访问位置 
  • 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添加通讯录权限
 
NSContactsUsageDescription
App需要您的同意,才能通讯录
  • 4.1Contacts.framework使用: !!!iOS9以上的异同版本才能使用这个框架
  • 引入头文件#import
  • 权限判断,并注册授权
   // 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
  • 注册授权
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
  • 注册授权
 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

你可能感兴趣的:(iOS-权限判断)