iOS 權(quán)限設(shè)置

版本 時(shí)間
V1.0 2018.12.6

前言

iOS 10以后,蘋果增強(qiáng)了對(duì)用戶隱私的保護(hù),訪問(wèn)照相機(jī)、相冊(cè)、麥克風(fēng)、定位、通訊錄等,都需要在info.plist 文件中添加權(quán)限,而且少一個(gè)都不行。根據(jù)需要添加,項(xiàng)目中使用了什么,就添加對(duì)應(yīng)的權(quán)限。

正文

info.plist中的相關(guān)配置說(shuō)明

字段 描述
Privacy - Photo Library Usage Description 相冊(cè)使用權(quán)限
Privacy - Photo Library Additions Usage Description 編輯相冊(cè)權(quán)限
Privacy - Camera Usage Description 相機(jī)權(quán)限
Privacy - Contacts Usage Description 通訊錄權(quán)限
Privacy - Microphone Usage Description 麥克風(fēng)權(quán)限
Privacy - Bluetooth Peripheral Usage Description 藍(lán)牙權(quán)限
Privacy - Location Always Usage Description 定位權(quán)限
Privacy - Location Usage Description 定位權(quán)限
Privacy - Location When In Use Usage Description 定位權(quán)限
Privacy - Location Always and When In Use Usage Description 定位權(quán)限
Privacy - Media Library Usage Description 媒體庫(kù)權(quán)限
Privacy - Calendars Usage Description 日歷權(quán)限
Privacy - Reminders Usage Description 提醒事項(xiàng)權(quán)限
Privacy - Face ID Usage Description FaceID權(quán)限
Privacy - Health Records Usage Description 健康記錄權(quán)限
Privacy - Health Share Usage Description 健康分享權(quán)限
Privacy - Health Update Usage Description 健康更新權(quán)限
Privacy - Motion Usage Description 運(yùn)動(dòng)權(quán)限
Privacy - Music Usage Description 音樂(lè)權(quán)限
Privacy - NFC Scan Usage Description NFC權(quán)限
Privacy - Siri Usage Description Siri權(quán)限
Privacy - Speech Recognition Usage Description 語(yǔ)音識(shí)別權(quán)限
Privacy - HomeKit Usage Description 智能家具權(quán)限
Privacy - TV Provider Usage Description 電視供應(yīng)商權(quán)限
Privacy - Video Subscriber Account Usage Description 視頻用戶賬號(hào)使用權(quán)限

可根據(jù)需要在info.plist中添加以上key值,但是描述一定要清楚明白,否則蘋果審核可能會(huì)不通過(guò)

可根據(jù)需要在info.plist中添加以上key值,但是描述一定要清楚明白,否則蘋果審核可能會(huì)不通過(guò)

可根據(jù)需要在info.plist中添加以上key值,但是描述一定要清楚明白,否則蘋果審核可能會(huì)不通過(guò)

權(quán)限請(qǐng)求以及簡(jiǎn)要說(shuō)明

在info.plist中配置了,并不代表就完全不需要developer去自己請(qǐng)求權(quán)限,只有極少部分權(quán)限系統(tǒng)在進(jìn)入的時(shí)候會(huì)幫助developer向用戶發(fā)起請(qǐng)求,例如:網(wǎng)絡(luò)權(quán)限,通知權(quán)限等。

絕大部分權(quán)限請(qǐng)求狀態(tài)可以分為以下4種情況:

  • notDetermined 表示未發(fā)起對(duì)當(dāng)前權(quán)限的請(qǐng)求
  • restricted 表示用戶無(wú)法更改當(dāng)前請(qǐng)求權(quán)限的狀態(tài)(出現(xiàn)這種情況的原因可能是家長(zhǎng)控制等)
  • denied 表示用戶已拒絕當(dāng)前請(qǐng)求的權(quán)限
  • authorized 表示用戶已同意當(dāng)前請(qǐng)求的權(quán)限

相冊(cè)權(quán)限

iOS 8開始到現(xiàn)在蘋果爸爸將操作相冊(cè)的ALAssetsLibrary替換成了Photos,在iOS 9中廢棄了原有的ALAssetsLibrary。如果某個(gè)應(yīng)用需要支持iOS 8以下的系統(tǒng)的話,需要針對(duì)相冊(cè)權(quán)限進(jìn)行不同的適配。

AssetsLibrary簡(jiǎn)介

AssetsLibrary的組成比較符合相冊(cè)本身的組成,相冊(cè)中的完整相冊(cè)對(duì)象、相冊(cè)、相片都能在AssetsLibrary中找到一一對(duì)應(yīng)的組成,這樣在使用AssetsLibrary時(shí)變得直觀而方便。

AssetsLibrary:表示設(shè)備中的相冊(cè)庫(kù),通過(guò)AssetsLibrary可以獲得整個(gè)設(shè)備中的照片和視頻。

ALAssetsGroup:表示整個(gè)相冊(cè)中的一個(gè)相冊(cè),通過(guò)ALAssetsGroup可以獲得某一個(gè)相冊(cè)的信息,相冊(cè)下的所有資源,同時(shí)也可以向某一個(gè)相冊(cè)中添加資源。

ALAsset: 表示整個(gè)相冊(cè)中的一個(gè)照片或者視頻,通過(guò)ALAsset可以獲得某個(gè)照片或視頻的詳細(xì)信息,或保存照片和視頻。

ALAssetRepresentation: 它是對(duì)ALAsset的封裝,可以是developer更加方便的獲取ALAsset中的資源信息,每個(gè)ALAsset都有至少一個(gè)ALAssetRepresentation對(duì)象,可以通過(guò)defaultRepresentation來(lái)獲取。

PhotoKit簡(jiǎn)介

Photos是iOS8時(shí)蘋果新推出的一個(gè)關(guān)于系統(tǒng)相冊(cè)的新框架。改框架應(yīng)該跟AssetsLibrary的處理不一樣,他不是去根據(jù)條件遍歷數(shù)據(jù)資源,而是根據(jù)條件直接獲得指定的資源。簡(jiǎn)而言之,個(gè)人覺(jué)得相對(duì)于AssetsLibrary更加高效和完整。

PHAsset: 代表相冊(cè)庫(kù)中的一個(gè)照片、視頻或者實(shí)時(shí)照片,跟ALAsset類似,通過(guò)PHAsset可以獲取和保存資源

PHFetchOptions: 獲取相冊(cè)中的資源時(shí)的參數(shù),可以傳 nil。

PHFetchResult: 表示通過(guò)PHAssetPHCollectionPHAssetCollectionPHCollectionList的類方法來(lái)檢索時(shí),返回的一系列資源對(duì)象集合。

PHAssetCollection: 表示一個(gè)相冊(cè)或者一個(gè)時(shí)刻

PHImageManager: 用于處理資源的加載,加載圖片的過(guò)程帶有緩存處理,可以通過(guò)傳入一個(gè)PHImageRequestOptions控制資源的輸出尺寸等規(guī)格

PHImageRequestOptions: 如上面所說(shuō),控制加載圖片時(shí)的一系列參數(shù),如是否同步等。

相冊(cè)權(quán)限請(qǐng)求相關(guān)代碼

PhotoKit權(quán)限請(qǐng)求

PHPhotoLibrary.requestAuthorization { (status: PHAuthorizationStatus) in
    switch status {
    case .restricted:
        print("當(dāng)前用戶無(wú)法更改該權(quán)限狀態(tài)")
    case .authorized:
        print("允許當(dāng)前權(quán)限的請(qǐng)求")
    case .denied:
        print("拒絕當(dāng)前權(quán)限的請(qǐng)求")
    default:
        print("未發(fā)起對(duì)當(dāng)前權(quán)限的請(qǐng)求")
    }
}

相機(jī)權(quán)限

判斷相機(jī)權(quán)限

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

相機(jī)權(quán)限請(qǐng)求

AVCaptureDevice.requestAccess(for: .video) { (granted) in
  if granted {
    print("用戶同意開啟相機(jī)權(quán)限")
  } else {
    print("用戶拒絕開啟相機(jī)權(quán)限")
  }
}

通訊錄權(quán)限

在iOS開發(fā)過(guò)程中,通訊錄也同相冊(cè)一樣,存在著兩套庫(kù)分別是AddressBookContacts。此篇著重于權(quán)限請(qǐng)求,所以在此處只是簡(jiǎn)單介紹以下兩者。

AddressBook簡(jiǎn)介

AddressBook是一套C語(yǔ)言的API。主要幾個(gè)常用的類說(shuō)明:

ABRecordRef:表示一個(gè)聯(lián)系人記錄,其中包含了所有的屬性,比如姓氏,名字,手機(jī),郵箱等;

ABAddresBookRef:表示的是所有用戶聯(lián)系人的大集合,可以對(duì)記錄進(jìn)行增刪改;

AddressBook權(quán)限請(qǐng)求
let addressBook: ABAddressBook = ABAddressBookCreateWithOptions(nil, nil) as ABAddressBook
ABAddressBookRequestAccessWithCompletion(addressBook) { (granted: Bool, error: CFError?) in
    if !granted {
        print("未獲得通訊錄訪問(wèn)權(quán)限")
        return
    }
    print("獲得通訊錄權(quán)限")
}

Contacts簡(jiǎn)介

Contacts是在iOS 9的時(shí)候才出現(xiàn)的用來(lái)取代AddressBook的新通訊錄框架。Contacts最大的優(yōu)點(diǎn)是線程安全。下面介紹一下幾個(gè)主要用到的類:
CNLabeledValue是一個(gè)泛型的類,可以使用如下方法直接返回一個(gè)CNLabeledValue類型。在CNContact中的屬性都是以CNLabeledValueCNLabeledValue數(shù)組的形式存在。我們可以把它當(dāng)成一個(gè)字典(NSDictionary),Label相當(dāng)于是key,而Value就是Value;

CNPhoneNumber:表示電話號(hào)碼類,主要包括了一個(gè)屬性就是號(hào)碼,至于到底是家庭號(hào)碼還是工作號(hào)碼 需要通過(guò)Label來(lái)進(jìn)行區(qū)分;

CNPostalAddressCNMutablePostalAddress:表示聯(lián)系人地址;

CNSocialProfile:表示社會(huì)化組件信息,比如FaceBook,微博等;

CNInstantMessageAddress:表示即時(shí)通訊信息,比如QQ這些;

CNContactRelation:表示聯(lián)系人關(guān)系信息。

Contacts權(quán)限請(qǐng)求
if CNContactStore.authorizationStatus(for: .contacts) == .notDetermined {
    let store = CNContactStore.init()
    store.requestAccess(for: .contacts) { (granted: Bool, error: Error?) in
        if !granted {
            print("未獲得通訊錄訪問(wèn)權(quán)限")
            return
        }
        print("獲得通訊錄權(quán)限")
    }
}

麥克風(fēng)權(quán)限

判斷麥克風(fēng)權(quán)限

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

麥克風(fēng)權(quán)限請(qǐng)求

AVCaptureDevice.requestAccess(for: .audio) { (granted) in
  if granted {
    print("用戶同意開啟麥克風(fēng)權(quán)限")
  } else {
    print("用戶拒絕開啟麥克風(fēng)權(quán)限")
  }
}

藍(lán)牙權(quán)限

后面會(huì)專門寫一篇介紹藍(lán)牙的學(xué)習(xí)筆記。(先欠下這一筆)

定位權(quán)限

定位權(quán)限開啟判斷

let localEnable = CLLocationManager.locationServicesEnabled()
if !localEnable {
  print("用戶無(wú)法修改該權(quán)限狀態(tài)")
} else {
  let localServiceStatus = CLLocationManager.authorizationStatus()
  switch localServiceStatus {
    case .restricted:
    print("當(dāng)前用戶無(wú)法更改該權(quán)限狀態(tài)")
    case .authorized:
    print("允許當(dāng)前權(quán)限的請(qǐng)求")
    case .denied:
    print("拒絕當(dāng)前權(quán)限的請(qǐng)求")
    default:
    print("未發(fā)起對(duì)當(dāng)前權(quán)限的請(qǐng)求")
  }
}

媒體庫(kù)權(quán)限

媒體庫(kù)權(quán)限請(qǐng)求

@available(iOS 9.3, *)
MPMediaLibrary.requestAuthorization { (status) in
  switch status {
  case .restricted:
      print("當(dāng)前用戶無(wú)法更改該權(quán)限狀態(tài)")
  case .authorized:
      print("允許當(dāng)前權(quán)限的請(qǐng)求")
  case .denied:
      print("拒絕當(dāng)前權(quán)限的請(qǐng)求")
  default:
      print("未發(fā)起對(duì)當(dāng)前權(quán)限的請(qǐng)求")
  }
}

日歷權(quán)限

日歷里面的事件需要通過(guò)一個(gè)Calendar database的數(shù)據(jù)管理,如果需要訪問(wèn)的話,我們可以通過(guò)EventKit來(lái)進(jìn)行訪問(wèn)日歷的信息。

來(lái)自蘋果的建議:

因?yàn)?code>EventStore是Calendar database的數(shù)據(jù)庫(kù)引擎,所以應(yīng)該盡量少的對(duì)他進(jìn)行創(chuàng)建和銷毀,所以推薦使用EventStore的時(shí)候使用單例模式。

日歷權(quán)限請(qǐng)求

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

}

提醒事項(xiàng)權(quán)限

提醒事項(xiàng)和日歷使用相同的框架來(lái)訪問(wèn)一個(gè)叫做Calendar database的數(shù)據(jù)庫(kù)。所以需要訪問(wèn)的話,我們也可以通過(guò)EventKit來(lái)進(jìn)行提醒事項(xiàng)的信息。

來(lái)自蘋果的建議:

因?yàn)?code>EventStore是Calendar database的數(shù)據(jù)庫(kù)引擎,所以應(yīng)該盡量少的對(duì)他進(jìn)行創(chuàng)建和銷毀,所以推薦使用EventStore的時(shí)候使用單例模式。

提醒事項(xiàng)權(quán)限請(qǐng)求

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

}

Siri權(quán)限

SiriKitiOS 10引入的。目前Siri能支持的服務(wù)有:基于網(wǎng)絡(luò)的語(yǔ)音/視頻通話,發(fā)送消息等。在使用SiriKit的時(shí)候,用戶給Siri傳達(dá)的指令都會(huì)被識(shí)別成一個(gè)Intents,Siri會(huì)根據(jù)Intents Domain去提供服務(wù)。

如果我們想要App對(duì)接Siri,只需要做以下兩件事就夠了:

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

2.實(shí)現(xiàn)具體的Intents方法。

具體的會(huì)在另外一章完成,此篇只完成權(quán)限這塊的說(shuō)名。(@_@)

Siri權(quán)限請(qǐng)求

INPreferences.requestSiriAuthorization { (status) in
  switch status {
  case .restricted:
      print("當(dāng)前用戶無(wú)法更改該權(quán)限狀態(tài)")
  case .authorized:
      print("允許當(dāng)前權(quán)限的請(qǐng)求")
  case .denied:
      print("拒絕當(dāng)前權(quán)限的請(qǐng)求")
  default:
      print("未發(fā)起對(duì)當(dāng)前權(quán)限的請(qǐng)求")
  }
}

語(yǔ)音識(shí)別權(quán)限

語(yǔ)音識(shí)別

SFSpeechRecognizer.requestAuthorization { (status) in
  switch status {
  case .restricted:
    print("當(dāng)前用戶無(wú)法更改該權(quán)限狀態(tài)")
  case .authorized:
    print("允許當(dāng)前權(quán)限的請(qǐng)求")
  case .denied:
    print("拒絕當(dāng)前權(quán)限的請(qǐng)求")
  default:
    print("未發(fā)起對(duì)當(dāng)前權(quán)限的請(qǐng)求")
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容