美文网首页
iOS 权限设置

iOS 权限设置

作者: Kity_Pei | 来源:发表于2019-08-05 23:03 被阅读0次
    版本 时间
    V1.0 2018.12.6

    前言

    iOS 10以后,苹果增强了对用户隐私的保护,访问照相机、相册、麦克风、定位、通讯录等,都需要在info.plist 文件中添加权限,而且少一个都不行。根据需要添加,项目中使用了什么,就添加对应的权限。

    正文

    info.plist中的相关配置说明

    字段 描述
    Privacy - Photo Library Usage Description 相册使用权限
    Privacy - Photo Library Additions Usage Description 编辑相册权限
    Privacy - Camera Usage Description 相机权限
    Privacy - Contacts Usage Description 通讯录权限
    Privacy - Microphone Usage Description 麦克风权限
    Privacy - Bluetooth Peripheral Usage Description 蓝牙权限
    Privacy - Location Always Usage Description 定位权限
    Privacy - Location Usage Description 定位权限
    Privacy - Location When In Use Usage Description 定位权限
    Privacy - Location Always and When In Use Usage Description 定位权限
    Privacy - Media Library Usage Description 媒体库权限
    Privacy - Calendars Usage Description 日历权限
    Privacy - Reminders Usage Description 提醒事项权限
    Privacy - Face ID Usage Description FaceID权限
    Privacy - Health Records Usage Description 健康记录权限
    Privacy - Health Share Usage Description 健康分享权限
    Privacy - Health Update Usage Description 健康更新权限
    Privacy - Motion Usage Description 运动权限
    Privacy - Music Usage Description 音乐权限
    Privacy - NFC Scan Usage Description NFC权限
    Privacy - Siri Usage Description Siri权限
    Privacy - Speech Recognition Usage Description 语音识别权限
    Privacy - HomeKit Usage Description 智能家具权限
    Privacy - TV Provider Usage Description 电视供应商权限
    Privacy - Video Subscriber Account Usage Description 视频用户账号使用权限

    可根据需要在info.plist中添加以上key值,但是描述一定要清楚明白,否则苹果审核可能会不通过

    可根据需要在info.plist中添加以上key值,但是描述一定要清楚明白,否则苹果审核可能会不通过

    可根据需要在info.plist中添加以上key值,但是描述一定要清楚明白,否则苹果审核可能会不通过

    权限请求以及简要说明

    在info.plist中配置了,并不代表就完全不需要developer去自己请求权限,只有极少部分权限系统在进入的时候会帮助developer向用户发起请求,例如:网络权限,通知权限等。

    绝大部分权限请求状态可以分为以下4种情况:

    • notDetermined 表示未发起对当前权限的请求
    • restricted 表示用户无法更改当前请求权限的状态(出现这种情况的原因可能是家长控制等)
    • denied 表示用户已拒绝当前请求的权限
    • authorized 表示用户已同意当前请求的权限

    相册权限

    iOS 8开始到现在苹果爸爸将操作相册的ALAssetsLibrary替换成了Photos,在iOS 9中废弃了原有的ALAssetsLibrary。如果某个应用需要支持iOS 8以下的系统的话,需要针对相册权限进行不同的适配。

    AssetsLibrary简介

    AssetsLibrary的组成比较符合相册本身的组成,相册中的完整相册对象、相册、相片都能在AssetsLibrary中找到一一对应的组成,这样在使用AssetsLibrary时变得直观而方便。

    AssetsLibrary:表示设备中的相册库,通过AssetsLibrary可以获得整个设备中的照片和视频。

    ALAssetsGroup:表示整个相册中的一个相册,通过ALAssetsGroup可以获得某一个相册的信息,相册下的所有资源,同时也可以向某一个相册中添加资源。

    ALAsset: 表示整个相册中的一个照片或者视频,通过ALAsset可以获得某个照片或视频的详细信息,或保存照片和视频。

    ALAssetRepresentation: 它是对ALAsset的封装,可以是developer更加方便的获取ALAsset中的资源信息,每个ALAsset都有至少一个ALAssetRepresentation对象,可以通过defaultRepresentation来获取。

    PhotoKit简介

    Photos是iOS8时苹果新推出的一个关于系统相册的新框架。改框架应该跟AssetsLibrary的处理不一样,他不是去根据条件遍历数据资源,而是根据条件直接获得指定的资源。简而言之,个人觉得相对于AssetsLibrary更加高效和完整。

    PHAsset: 代表相册库中的一个照片、视频或者实时照片,跟ALAsset类似,通过PHAsset可以获取和保存资源

    PHFetchOptions: 获取相册中的资源时的参数,可以传 nil。

    PHFetchResult: 表示通过PHAssetPHCollectionPHAssetCollectionPHCollectionList的类方法来检索时,返回的一系列资源对象集合。

    PHAssetCollection: 表示一个相册或者一个时刻

    PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个PHImageRequestOptions控制资源的输出尺寸等规格

    PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数,如是否同步等。

    相册权限请求相关代码

    PhotoKit权限请求

    PHPhotoLibrary.requestAuthorization { (status: PHAuthorizationStatus) in
        switch status {
        case .restricted:
            print("当前用户无法更改该权限状态")
        case .authorized:
            print("允许当前权限的请求")
        case .denied:
            print("拒绝当前权限的请求")
        default:
            print("未发起对当前权限的请求")
        }
    }
    

    相机权限

    判断相机权限

    let status = AVCaptureDevice.authorizationStatus(for: .video)
    

    相机权限请求

    AVCaptureDevice.requestAccess(for: .video) { (granted) in
      if granted {
        print("用户同意开启相机权限")
      } else {
        print("用户拒绝开启相机权限")
      }
    }
    
    

    通讯录权限

    在iOS开发过程中,通讯录也同相册一样,存在着两套库分别是AddressBookContacts。此篇着重于权限请求,所以在此处只是简单介绍以下两者。

    AddressBook简介

    AddressBook是一套C语言的API。主要几个常用的类说明:

    ABRecordRef:表示一个联系人记录,其中包含了所有的属性,比如姓氏,名字,手机,邮箱等;

    ABAddresBookRef:表示的是所有用户联系人的大集合,可以对记录进行增删改;

    AddressBook权限请求
    let addressBook: ABAddressBook = ABAddressBookCreateWithOptions(nil, nil) as ABAddressBook
    ABAddressBookRequestAccessWithCompletion(addressBook) { (granted: Bool, error: CFError?) in
        if !granted {
            print("未获得通讯录访问权限")
            return
        }
        print("获得通讯录权限")
    }
    

    Contacts简介

    Contacts是在iOS 9的时候才出现的用来取代AddressBook的新通讯录框架。Contacts最大的优点是线程安全。下面介绍一下几个主要用到的类:
    CNLabeledValue是一个泛型的类,可以使用如下方法直接返回一个CNLabeledValue类型。在CNContact中的属性都是以CNLabeledValueCNLabeledValue数组的形式存在。我们可以把它当成一个字典(NSDictionary),Label相当于是key,而Value就是Value;

    CNPhoneNumber:表示电话号码类,主要包括了一个属性就是号码,至于到底是家庭号码还是工作号码 需要通过Label来进行区分;

    CNPostalAddressCNMutablePostalAddress:表示联系人地址;

    CNSocialProfile:表示社会化组件信息,比如FaceBook,微博等;

    CNInstantMessageAddress:表示即时通讯信息,比如QQ这些;

    CNContactRelation:表示联系人关系信息。

    Contacts权限请求
    if CNContactStore.authorizationStatus(for: .contacts) == .notDetermined {
        let store = CNContactStore.init()
        store.requestAccess(for: .contacts) { (granted: Bool, error: Error?) in
            if !granted {
                print("未获得通讯录访问权限")
                return
            }
            print("获得通讯录权限")
        }
    }
    

    麦克风权限

    判断麦克风权限

    let status = AVCaptureDevice.authorizationStatus(for: .audio)
    

    麦克风权限请求

    AVCaptureDevice.requestAccess(for: .audio) { (granted) in
      if granted {
        print("用户同意开启麦克风权限")
      } else {
        print("用户拒绝开启麦克风权限")
      }
    }
    
    

    蓝牙权限

    后面会专门写一篇介绍蓝牙的学习笔记。(先欠下这一笔)

    定位权限

    定位权限开启判断

    let localEnable = CLLocationManager.locationServicesEnabled()
    if !localEnable {
      print("用户无法修改该权限状态")
    } else {
      let localServiceStatus = CLLocationManager.authorizationStatus()
      switch localServiceStatus {
        case .restricted:
        print("当前用户无法更改该权限状态")
        case .authorized:
        print("允许当前权限的请求")
        case .denied:
        print("拒绝当前权限的请求")
        default:
        print("未发起对当前权限的请求")
      }
    }
    
    

    媒体库权限

    媒体库权限请求

    @available(iOS 9.3, *)
    MPMediaLibrary.requestAuthorization { (status) in
      switch status {
      case .restricted:
          print("当前用户无法更改该权限状态")
      case .authorized:
          print("允许当前权限的请求")
      case .denied:
          print("拒绝当前权限的请求")
      default:
          print("未发起对当前权限的请求")
      }
    }
    

    日历权限

    日历里面的事件需要通过一个Calendar database的数据管理,如果需要访问的话,我们可以通过EventKit来进行访问日历的信息。

    来自苹果的建议:

    因为EventStoreCalendar database的数据库引擎,所以应该尽量少的对他进行创建和销毁,所以推荐使用EventStore的时候使用单例模式。

    日历权限请求

    EKEventStore().requestAccess(to: EKEntityType.event) { (granted, error) in
    
    }
    
    

    提醒事项权限

    提醒事项和日历使用相同的框架来访问一个叫做Calendar database的数据库。所以需要访问的话,我们也可以通过EventKit来进行提醒事项的信息。

    来自苹果的建议:

    因为EventStoreCalendar database的数据库引擎,所以应该尽量少的对他进行创建和销毁,所以推荐使用EventStore的时候使用单例模式。

    提醒事项权限请求

    EKEventStore().requestAccess(to: EKEntityType.reminder) { (granted, error) in
    
    }
    
    

    Siri权限

    SiriKitiOS 10引入的。目前Siri能支持的服务有:基于网络的语音/视频通话,发送消息等。在使用SiriKit的时候,用户给Siri传达的指令都会被识别成一个Intents,Siri会根据Intents Domain去提供服务。

    如果我们想要App对接Siri,只需要做以下两件事就够了:

    1.在info.plist中提供App支持的Intents Domain;

    2.实现具体的Intents方法。

    具体的会在另外一章完成,此篇只完成权限这块的说名。(@_@)

    Siri权限请求

    INPreferences.requestSiriAuthorization { (status) in
      switch status {
      case .restricted:
          print("当前用户无法更改该权限状态")
      case .authorized:
          print("允许当前权限的请求")
      case .denied:
          print("拒绝当前权限的请求")
      default:
          print("未发起对当前权限的请求")
      }
    }
    

    语音识别权限

    语音识别

    SFSpeechRecognizer.requestAuthorization { (status) in
      switch status {
      case .restricted:
        print("当前用户无法更改该权限状态")
      case .authorized:
        print("允许当前权限的请求")
      case .denied:
        print("拒绝当前权限的请求")
      default:
        print("未发起对当前权限的请求")
      }
    }
    

    相关文章

      网友评论

          本文标题:iOS 权限设置

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