作者:金田
iOS系統(tǒng)版本的不斷升級(jí)的前提,伴隨著用戶使用設(shè)備的安全性提升握童,iOS系統(tǒng)對(duì)于App需要使用的硬件限制也越來越嚴(yán)格姆怪,App處理稍有不妥,輕則造成功能不可用用戶還不知道澡绩,重則會(huì)造成App Crash稽揭。
當(dāng)用戶在App啟動(dòng)時(shí),看到彈出來的一條條“XXX 請(qǐng)求訪問您的位置” “XXX 請(qǐng)求訪問您的通訊錄” “XXX 請(qǐng)求訪問您的日歷” “XXX 請(qǐng)求訪問您的攝像頭” 等一系列消息時(shí)肥卡,用戶覺得不耐煩的同時(shí)溪掀,也會(huì)由于一時(shí)的安全考慮而把相應(yīng)的功能給屏蔽掉,這還只是開始步鉴,當(dāng)用戶真正在使用對(duì)應(yīng)功能的時(shí)候揪胃,就會(huì)出現(xiàn)一連續(xù)的奇怪現(xiàn)象,比如數(shù)據(jù)顯示異常:明明通訊錄里面有信息氛琢,卻總是加載不出數(shù)據(jù);有的甚至是直接Crash喊递。
下面,筆者將會(huì)綜合性地把上述硬件的授權(quán)檢測阳似,一一地詳細(xì)列出骚勘,并給出相關(guān)示例代碼:
1、定位服務(wù)
檢測方法
+ (CLAuthorizationStatus)authorizationStatus
相關(guān)返回參數(shù)
//用戶尚未做出選擇
kCLAuthorizationStatusNotDetermined = 0,
// 未授權(quán)撮奏,且用戶無法更新俏讹,如家長控制情況下
kCLAuthorizationStatusRestricted,
// 用戶拒絕App使用
kCLAuthorizationStatusDenied,
// 總是使用
kCLAuthorizationStatusAuthorizedAlways NS_ENUM_AVAILABLE(NA, 8_0),
// 按需使用
kCLAuthorizationStatusAuthorizedWhenInUse NS_ENUM_AVAILABLE(NA, 8_0),
// 已授權(quán)
kCLAuthorizationStatusAuthorized
參考代碼
__block void (^checkLocationAuth)(void) = ^{
CLAuthorizationStatus authStatus = [CLLocationManager authorizationStatus];
if (CLAuthorizationStatusAuthorized == authStatus) {
//授權(quán)成功,執(zhí)行后續(xù)操作
}else {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
checkLocationAuth();
});
}
};
checkLocationAuth();
2挽荡、通訊錄
檢測方法
ABAuthorizationStatus ABAddressBookGetAuthorizationStatus(void)
授權(quán)狀態(tài)
kABAuthorizationStatusNotDetermined = 0, // 未進(jìn)行授權(quán)選擇
kABAuthorizationStatusRestricted, // 未授權(quán)藐石,且用戶無法更新即供,如家長控制情況下
kABAuthorizationStatusDenied, // 用戶拒絕App使用
kABAuthorizationStatusAuthorized // 已授權(quán)定拟,可使用
參考代碼
__block void (^checkAddressBookAuth)(void) = ^{
ABAuthorizationStatus authStatus = ABAddressBookGetAuthorizationStatus();
if (kABAuthorizationStatusAuthorized == authStatus) {
//授權(quán)成功,執(zhí)行后續(xù)操作
}else {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
checkAddressBookAuth();
});
}
};
checkAddressBookAuth();
3逗嫡、日歷/提醒事項(xiàng)授權(quán)
檢測方法
+ (EKAuthorizationStatus)authorizationStatusForEntityType:(EKEntityType)entityType
參數(shù)類型
EKEntityTypeEvent, //事件
EKEntityTypeReminder//提醒
授權(quán)狀態(tài)
EKAuthorizationStatusNotDetermined = 0,// 未進(jìn)行授權(quán)選擇
EKAuthorizationStatusRestricted, // 未授權(quán)青自,且用戶無法更新,如家長控制情況下
EKAuthorizationStatusDenied, // 用戶拒絕App使用
EKAuthorizationStatusAuthorized, // 已授權(quán)驱证,可使用
參考代碼
__block void (^checkCalanderAuth)(void) = ^{
EKAuthorizationStatus authStatus = [EKAuthorizationStatus authorizationStatusForEntityType:EKEntityTypeEvent];
if (EKAuthorizationStatusAuthorized == authStatus) {
//授權(quán)成功延窜,執(zhí)行后續(xù)操作
}else {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
checkCalanderAuth();
});
}
};
checkCalanderAuth();
4、照片庫授權(quán)
檢測方法
+ (ALAuthorizationStatus)authorizationStatus;
授權(quán)狀態(tài)
ALAuthorizationStatusNotDetermined = 0,// 未進(jìn)行授權(quán)選擇
ALAuthorizationStatusRestricted, // 未授權(quán)抹锄,且用戶無法更新逆瑞,如家長控制情況下
ALAuthorizationStatusDenied, // 用戶拒絕App使用
ALAuthorizationStatusAuthorized, // 已授權(quán)荠藤,可使用
參考代碼
__block void (^checkAssetLibraryAuth)(void) = ^{
ALAuthorizationStatus authStatus = [ALAuthorizationStatus authorizationStatus];
if (ALAuthorizationStatusAuthorized == authStatus) {
//授權(quán)成功,執(zhí)行后續(xù)操作
}else {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
checkAssetLibraryAuth();
});
}
};
checkAssetLibraryAuth();
5获高、藍(lán)牙授權(quán)狀態(tài)檢測
檢測方法
+ (CBPeripheralManagerAuthorizationStatus)authorizationStatus;
授權(quán)狀態(tài)
CBPeripheralManagerAuthorizationStatusNotDetermined = 0,// 未進(jìn)行授權(quán)選擇
CBPeripheralManagerAuthorizationStatusRestricted, // 未授權(quán)哈肖,且用戶無法更新,如家長控制情況下
CBPeripheralManagerAuthorizationStatusDenied, // 用戶拒絕App使用
CBPeripheralManagerAuthorizationStatusAuthorized, // 已授權(quán)念秧,可使用
參考代碼
__block void (^checkPeripheralAuth)(void) = ^{
CBPeripheralManagerAuthorizationStatus authStatus = [CBPeripheralManagerAuthorizationStatus authorizationStatus];
if (CBPeripheralManagerAuthorizationStatusAuthorized == authStatus) {
//授權(quán)成功淤井,執(zhí)行后續(xù)操作
}else {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
checkPeripheralAuth();
});
}
};
checkPeripheralAuth();
6、攝像頭授權(quán)狀態(tài)檢測
檢測方法
+ (AVAuthorizationStatus)authorizationStatusForMediaType:(NSString *)mediaType;
授權(quán)狀態(tài)
AVAuthorizationStatusNotDetermined = 0,// 未進(jìn)行授權(quán)選擇
AVAuthorizationStatusRestricted, // 未授權(quán)摊趾,且用戶無法更新币狠,如家長控制情況下
AVAuthorizationStatusDenied, // 用戶拒絕App使用
AVAuthorizationStatusAuthorized, // 已授權(quán),可使用
參考代碼
__block void (^checkCameraAuth)(void) = ^{
AVAuthorizationStatus authStatus = [AVAuthorizationStatus authorizationStatusForMediaType:AVMediaTypeVideo];
if (AVAuthorizationStatusAuthorized == authStatus) {
//授權(quán)成功砾层,執(zhí)行后續(xù)操作
}else {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
checkCameraAuth();
});
}
};
checkCameraAuth();
7漩绵、麥克風(fēng)授權(quán)狀態(tài)檢測
檢測方法
- (AVAudioSessionRecordPermission)recordPermission;
授權(quán)狀態(tài)
AVAudioSessionRecordPermissionUndetermined, // 用戶尚未被請(qǐng)求許可。
AVAudioSessionRecordPermissionDenied, // 用戶已被要求并已拒絕許可梢为。
AVAudioSessionRecordPermissionGranted, // 用戶已被要求并已授予權(quán)限渐行。
參考代碼
__block void (^checkRecordPermission)(void) = ^{
AVAudioSessionRecordPermission authStatus = [[AVAudioSession sharedInstance] recordPermission];
if (AVAudioSessionRecordPermissionGranted == authStatus) {
//授權(quán)成功,執(zhí)行后續(xù)操作
}else {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
checkRecordPermission();
});
}
};
checkRecordPermission();