美文网首页
iOS-权限判断

iOS-权限判断

作者: Devin_ | 来源:发表于2017-06-04 00:44 被阅读751次
    • 开发中一些经常使用到的权限判断:相册、相机、定位、通讯录、通知等,适配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
    

    相关文章

      网友评论

          本文标题:iOS-权限判断

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