版本 | 時間 |
---|---|
V1.0 | 2018.12.6 |
前言
iOS 10以后恩尾,蘋果增強了對用戶隱私的保護,訪問照相機挽懦、相冊翰意、麥克風、定位信柿、通訊錄等冀偶,都需要在info.plist 文件中添加權(quán)限,而且少一個都不行渔嚷。根據(jù)需要添加进鸠,項目中使用了什么,就添加對應的權(quán)限形病。
正文
info.plist中的相關(guān)配置說明
字段 | 描述 |
---|---|
Privacy - Photo Library Usage Description | 相冊使用權(quán)限 |
Privacy - Photo Library Additions Usage Description | 編輯相冊權(quán)限 |
Privacy - Camera Usage Description | 相機權(quán)限 |
Privacy - Contacts Usage Description | 通訊錄權(quán)限 |
Privacy - Microphone Usage Description | 麥克風權(quán)限 |
Privacy - Bluetooth Peripheral Usage Description | 藍牙權(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 | 媒體庫權(quán)限 |
Privacy - Calendars Usage Description | 日歷權(quán)限 |
Privacy - Reminders Usage Description | 提醒事項權(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 | 運動權(quán)限 |
Privacy - Music Usage Description | 音樂權(quán)限 |
Privacy - NFC Scan Usage Description | NFC權(quán)限 |
Privacy - Siri Usage Description | Siri權(quán)限 |
Privacy - Speech Recognition Usage Description | 語音識別權(quán)限 |
Privacy - HomeKit Usage Description | 智能家具權(quán)限 |
Privacy - TV Provider Usage Description | 電視供應商權(quán)限 |
Privacy - Video Subscriber Account Usage Description | 視頻用戶賬號使用權(quán)限 |
可根據(jù)需要在info.plist中添加以上key值堤如,但是描述一定要清楚明白,否則蘋果審核可能會不通過
可根據(jù)需要在info.plist中添加以上key值窒朋,但是描述一定要清楚明白搀罢,否則蘋果審核可能會不通過
可根據(jù)需要在info.plist中添加以上key值,但是描述一定要清楚明白侥猩,否則蘋果審核可能會不通過
權(quán)限請求以及簡要說明
在info.plist中配置了榔至,并不代表就完全不需要developer去自己請求權(quán)限,只有極少部分權(quán)限系統(tǒng)在進入的時候會幫助developer向用戶發(fā)起請求欺劳,例如:網(wǎng)絡權(quán)限唧取,通知權(quán)限等。
絕大部分權(quán)限請求狀態(tài)可以分為以下4種情況:
-
notDetermined
表示未發(fā)起對當前權(quán)限的請求 -
restricted
表示用戶無法更改當前請求權(quán)限的狀態(tài)(出現(xiàn)這種情況的原因可能是家長控制等) -
denied
表示用戶已拒絕當前請求的權(quán)限 -
authorized
表示用戶已同意當前請求的權(quán)限
相冊權(quán)限
iOS 8開始到現(xiàn)在蘋果爸爸將操作相冊的ALAssetsLibrary
替換成了Photos
划提,在iOS 9中廢棄了原有的ALAssetsLibrary
枫弟。如果某個應用需要支持iOS 8以下的系統(tǒng)的話,需要針對相冊權(quán)限進行不同的適配鹏往。
AssetsLibrary
簡介
AssetsLibrary
的組成比較符合相冊本身的組成淡诗,相冊中的完整相冊對象、相冊、相片都能在AssetsLibrary
中找到一一對應的組成韩容,這樣在使用AssetsLibrary
時變得直觀而方便款违。
AssetsLibrary
:表示設備中的相冊庫,通過AssetsLibrary
可以獲得整個設備中的照片和視頻群凶。
ALAssetsGroup
:表示整個相冊中的一個相冊插爹,通過ALAssetsGroup
可以獲得某一個相冊的信息,相冊下的所有資源请梢,同時也可以向某一個相冊中添加資源赠尾。
ALAsset
: 表示整個相冊中的一個照片或者視頻,通過ALAsset
可以獲得某個照片或視頻的詳細信息毅弧,或保存照片和視頻气嫁。
ALAssetRepresentation
: 它是對ALAsset
的封裝,可以是developer更加方便的獲取ALAsset
中的資源信息形真,每個ALAsset
都有至少一個ALAssetRepresentation
對象杉编,可以通過defaultRepresentation
來獲取超全。
PhotoKit
簡介
Photos
是iOS8時蘋果新推出的一個關(guān)于系統(tǒng)相冊的新框架咆霜。改框架應該跟AssetsLibrary
的處理不一樣,他不是去根據(jù)條件遍歷數(shù)據(jù)資源嘶朱,而是根據(jù)條件直接獲得指定的資源蛾坯。簡而言之,個人覺得相對于AssetsLibrary
更加高效和完整疏遏。
PHAsset
: 代表相冊庫中的一個照片脉课、視頻或者實時照片,跟ALAsset
類似财异,通過PHAsset
可以獲取和保存資源
PHFetchOptions
: 獲取相冊中的資源時的參數(shù)倘零,可以傳 nil。
PHFetchResult
: 表示通過PHAsset
戳寸、PHCollection
呈驶、PHAssetCollection
和PHCollectionList
的類方法來檢索時,返回的一系列資源對象集合疫鹊。
PHAssetCollection
: 表示一個相冊或者一個時刻
PHImageManager
: 用于處理資源的加載袖瞻,加載圖片的過程帶有緩存處理,可以通過傳入一個PHImageRequestOptions
控制資源的輸出尺寸等規(guī)格
PHImageRequestOptions
: 如上面所說拆吆,控制加載圖片時的一系列參數(shù)聋迎,如是否同步等。
相冊權(quán)限請求相關(guān)代碼
PhotoKit權(quán)限請求
PHPhotoLibrary.requestAuthorization { (status: PHAuthorizationStatus) in
switch status {
case .restricted:
print("當前用戶無法更改該權(quán)限狀態(tài)")
case .authorized:
print("允許當前權(quán)限的請求")
case .denied:
print("拒絕當前權(quán)限的請求")
default:
print("未發(fā)起對當前權(quán)限的請求")
}
}
相機權(quán)限
判斷相機權(quán)限
let status = AVCaptureDevice.authorizationStatus(for: .video)
相機權(quán)限請求
AVCaptureDevice.requestAccess(for: .video) { (granted) in
if granted {
print("用戶同意開啟相機權(quán)限")
} else {
print("用戶拒絕開啟相機權(quán)限")
}
}
通訊錄權(quán)限
在iOS開發(fā)過程中枣耀,通訊錄也同相冊一樣霉晕,存在著兩套庫分別是AddressBook
、Contacts
。此篇著重于權(quán)限請求娄昆,所以在此處只是簡單介紹以下兩者佩微。
AddressBook
簡介
AddressBook
是一套C語言的API。主要幾個常用的類說明:
ABRecordRef
:表示一個聯(lián)系人記錄萌焰,其中包含了所有的屬性哺眯,比如姓氏,名字扒俯,手機奶卓,郵箱等;
ABAddresBookRef
:表示的是所有用戶聯(lián)系人的大集合,可以對記錄進行增刪改;
AddressBook
權(quán)限請求
let addressBook: ABAddressBook = ABAddressBookCreateWithOptions(nil, nil) as ABAddressBook
ABAddressBookRequestAccessWithCompletion(addressBook) { (granted: Bool, error: CFError?) in
if !granted {
print("未獲得通訊錄訪問權(quán)限")
return
}
print("獲得通訊錄權(quán)限")
}
Contacts
簡介
Contacts
是在iOS 9
的時候才出現(xiàn)的用來取代AddressBook
的新通訊錄框架撼玄。Contacts
最大的優(yōu)點是線程安全夺姑。下面介紹一下幾個主要用到的類:
CNLabeledValue
是一個泛型的類,可以使用如下方法直接返回一個CNLabeledValue類型掌猛。在CNContact
中的屬性都是以CNLabeledValue
或CNLabeledValue
數(shù)組的形式存在盏浙。我們可以把它當成一個字典(NSDictionary
),Label相當于是key荔茬,而Value就是Value;
CNPhoneNumber
:表示電話號碼類废膘,主要包括了一個屬性就是號碼,至于到底是家庭號碼還是工作號碼 需要通過Label來進行區(qū)分;
CNPostalAddress
和CNMutablePostalAddress
:表示聯(lián)系人地址;
CNSocialProfile
:表示社會化組件信息慕蔚,比如FaceBook丐黄,微博等;
CNInstantMessageAddress
:表示即時通訊信息,比如QQ這些;
CNContactRelation
:表示聯(lián)系人關(guān)系信息孔飒。
Contacts
權(quán)限請求
if CNContactStore.authorizationStatus(for: .contacts) == .notDetermined {
let store = CNContactStore.init()
store.requestAccess(for: .contacts) { (granted: Bool, error: Error?) in
if !granted {
print("未獲得通訊錄訪問權(quán)限")
return
}
print("獲得通訊錄權(quán)限")
}
}
麥克風權(quán)限
判斷麥克風權(quán)限
let status = AVCaptureDevice.authorizationStatus(for: .audio)
麥克風權(quán)限請求
AVCaptureDevice.requestAccess(for: .audio) { (granted) in
if granted {
print("用戶同意開啟麥克風權(quán)限")
} else {
print("用戶拒絕開啟麥克風權(quán)限")
}
}
藍牙權(quán)限
后面會專門寫一篇介紹藍牙的學習筆記灌闺。(先欠下這一筆)
定位權(quán)限
定位權(quán)限開啟判斷
let localEnable = CLLocationManager.locationServicesEnabled()
if !localEnable {
print("用戶無法修改該權(quán)限狀態(tài)")
} else {
let localServiceStatus = CLLocationManager.authorizationStatus()
switch localServiceStatus {
case .restricted:
print("當前用戶無法更改該權(quán)限狀態(tài)")
case .authorized:
print("允許當前權(quán)限的請求")
case .denied:
print("拒絕當前權(quán)限的請求")
default:
print("未發(fā)起對當前權(quán)限的請求")
}
}
媒體庫權(quán)限
媒體庫權(quán)限請求
@available(iOS 9.3, *)
MPMediaLibrary.requestAuthorization { (status) in
switch status {
case .restricted:
print("當前用戶無法更改該權(quán)限狀態(tài)")
case .authorized:
print("允許當前權(quán)限的請求")
case .denied:
print("拒絕當前權(quán)限的請求")
default:
print("未發(fā)起對當前權(quán)限的請求")
}
}
日歷權(quán)限
日歷里面的事件需要通過一個Calendar database
的數(shù)據(jù)管理,如果需要訪問的話坏瞄,我們可以通過EventKit
來進行訪問日歷的信息桂对。
來自蘋果的建議:
因為
EventStore
是Calendar database
的數(shù)據(jù)庫引擎,所以應該盡量少的對他進行創(chuàng)建和銷毀鸠匀,所以推薦使用EventStore的時候使用單例模式蕉斜。
日歷權(quán)限請求
EKEventStore().requestAccess(to: EKEntityType.event) { (granted, error) in
}
提醒事項權(quán)限
提醒事項和日歷使用相同的框架來訪問一個叫做Calendar database
的數(shù)據(jù)庫。所以需要訪問的話狮崩,我們也可以通過EventKit
來進行提醒事項的信息蛛勉。
來自蘋果的建議:
因為
EventStore
是Calendar database
的數(shù)據(jù)庫引擎,所以應該盡量少的對他進行創(chuàng)建和銷毀睦柴,所以推薦使用EventStore的時候使用單例模式诽凌。
提醒事項權(quán)限請求
EKEventStore().requestAccess(to: EKEntityType.reminder) { (granted, error) in
}
Siri權(quán)限
SiriKit
是iOS 10
引入的。目前Siri能支持的服務有:基于網(wǎng)絡的語音/視頻通話坦敌,發(fā)送消息等侣诵。在使用SiriKit
的時候痢法,用戶給Siri傳達的指令都會被識別成一個Intents
,Siri會根據(jù)Intents Domain
去提供服務。
如果我們想要App對接Siri,只需要做以下兩件事就夠了:
1.在info.plist
中提供App支持的Intents Domain
;
2.實現(xiàn)具體的Intents
方法杜顺。
具體的會在另外一章完成财搁,此篇只完成權(quán)限這塊的說名。(@_@)
Siri權(quán)限請求
INPreferences.requestSiriAuthorization { (status) in
switch status {
case .restricted:
print("當前用戶無法更改該權(quán)限狀態(tài)")
case .authorized:
print("允許當前權(quán)限的請求")
case .denied:
print("拒絕當前權(quán)限的請求")
default:
print("未發(fā)起對當前權(quán)限的請求")
}
}
語音識別權(quán)限
語音識別
SFSpeechRecognizer.requestAuthorization { (status) in
switch status {
case .restricted:
print("當前用戶無法更改該權(quán)限狀態(tài)")
case .authorized:
print("允許當前權(quán)限的請求")
case .denied:
print("拒絕當前權(quán)限的請求")
default:
print("未發(fā)起對當前權(quán)限的請求")
}
}