獲得相機(jī)或麥克風(fēng)權(quán)限
使用到對(duì)應(yīng)的權(quán)限時(shí),應(yīng)在info.plist文件中加入對(duì)應(yīng)的權(quán)限描述。
NSCameraUsageDescription
允許訪問您的相機(jī)才能XXXXXXXXXX(描述準(zhǔn)確)NSMicrophoneUsageDescription
允許訪問您的麥克風(fēng)才能XXXXXXXXXX(描述準(zhǔn)確)
#import <AVFoundation/AVFoundation.h>
AVMediaType AVType = AVMediaTypeAudio; // AVMediaTypeVideo 攝像頭 AVMediaTypeAudio 麥克風(fēng)
// 讀取當(dāng)前權(quán)限狀態(tài)
AVAuthorizationStatus avStatus = [AVCaptureDevice authorizationStatusForMediaType:AVType];
// 根據(jù)當(dāng)前狀態(tài)作出對(duì)應(yīng)的操作
switch (avStatus) {
case AVAuthorizationStatusNotDetermined:
NSLog(@"未決定的");
// 發(fā)出權(quán)限請(qǐng)求, 在未決定的時(shí)候發(fā)出請(qǐng)求系統(tǒng)才會(huì)彈出對(duì)話框,其它情況下發(fā)出下面的請(qǐng)求也不彈框,需要自己去指引用戶設(shè)置
[AVCaptureDevice requestAccessForMediaType:AVType completionHandler:^(BOOL granted) {
if (granted) {
NSLog(@"用戶同意使用");
}else{
NSLog(@"用戶不同意使用");
}
}];
break;
case AVAuthorizationStatusRestricted: // 應(yīng)該自己設(shè)置彈框引導(dǎo)用戶去打開設(shè)置
NSLog(@"因其它原因被禁止的");
break;
case AVAuthorizationStatusDenied: // 應(yīng)該自己設(shè)置彈框引導(dǎo)用戶去打開設(shè)置
NSLog(@"用戶拒絕的的");
break;
case AVAuthorizationStatusAuthorized: // 進(jìn)行業(yè)務(wù)操作
NSLog(@"同意的");
break;
default:
break;
}
// 跳轉(zhuǎn)到設(shè)置頁面,只要請(qǐng)求過權(quán)限的,就會(huì)出現(xiàn)在這個(gè)頁面,如果沒有請(qǐng)求過的權(quán)限,這個(gè)頁面是不會(huì)出現(xiàn)對(duì)應(yīng)的權(quán)限設(shè)置的
NSURL * url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
if (success) {
NSLog(@"打開設(shè)置成功");
}
}];
}
相冊(cè)
ios11 之后,剛開始訪問相機(jī)的時(shí)候,系統(tǒng)默認(rèn)可以進(jìn)入,但會(huì)在選擇中某一張相片的時(shí)候,進(jìn)行權(quán)限的詢問.
- NSPhotoLibraryUsageDescription
允許訪問您的相冊(cè)才能XXXXXXXXXX(描述準(zhǔn)確)
#import <Photos/Photos.h>
// 查詢當(dāng)前狀態(tài)
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
switch (status) {
case PHAuthorizationStatusNotDetermined:
NSLog(@"未決定的");
// 此處應(yīng)發(fā)起請(qǐng)求
break;
case PHAuthorizationStatusRestricted:
NSLog(@"因其它原因被禁止的");
break;
case PHAuthorizationStatusDenied:
NSLog(@"用戶拒絕的的");
break;
case PHAuthorizationStatusAuthorized:
NSLog(@"同意的");
break;
default:
break;
}
// 發(fā)起請(qǐng)求
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
switch (status) {
case PHAuthorizationStatusDenied:
NSLog(@"用戶拒絕的的");
break;
case PHAuthorizationStatusAuthorized:
NSLog(@"同意的");
break;
default:
break;
}
}];
位置
位置在iOS11.4之前和之后有區(qū)別。
iOS11.4之前的描述
- NSLocationWhenInUseUsageDescription 使用期間獲得權(quán)限的描述
對(duì)應(yīng)請(qǐng)求:
[self.locationManager requestWhenInUseAuthorization];
- NSLocationAlwaysUsageDescription 未使用期間獲得權(quán)限的描述
對(duì)應(yīng)請(qǐng)求:
[self.locationManager requestAlwaysAuthorization];
以上描述和請(qǐng)求一一對(duì)應(yīng),互不干擾。根據(jù)需要進(jìn)行描述和請(qǐng)求。在用戶未決定之前,系統(tǒng)彈出的對(duì)話框是只有同意和不同意的選擇。
iOS11.4后
如果只詢問使用期間的權(quán)限(requestWhenInUseAuthorization),與之前版本相同。
如果需要詢問是否可以獲得未使用期間的權(quán)限( requestAlwaysAuthorization),則需要同時(shí)配置下面的兩個(gè)描述:
- NSLocationWhenInUseUsageDescription 使用期間獲得權(quán)限的描述
- NSLocationAlwaysAndWhenInUseUsageDescription 使用和未使用期間的權(quán)限描述
第二個(gè)描述,替代了之前版本關(guān)于未使用期間的描述。此時(shí)代碼進(jìn)行(requestAlwaysAuthorization)請(qǐng)求權(quán)限時(shí),如果當(dāng)前狀態(tài)是用戶未決定的,則系統(tǒng)會(huì)彈出對(duì)話框,而這個(gè)對(duì)話框會(huì)有三個(gè)選項(xiàng):
1、僅在使用應(yīng)用期間
2、始終允許
3、不允許
這也是為什么代碼進(jìn)行(requestAlwaysAuthorization)請(qǐng)求權(quán)限時(shí),必須要同時(shí)有兩種描述存在的原因。
注意
1、在第一次請(qǐng)求權(quán)限的時(shí)候,CLLocationManager 的實(shí)例對(duì)象應(yīng)該被引用起來,否則對(duì)話框只會(huì)一閃而過。
2、通過CLLocationManager的delegate,我們可以從“授權(quán)回調(diào)”方法:
-(void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;中獲得在用戶點(diǎn)擊詢問“允許”還是“拒絕”時(shí)的結(jié)果。
#import <CoreLocation/CLLocationManager.h>
// 查詢狀態(tài)
CLAuthorizationStatus CLStatus = [CLLocationManager authorizationStatus];
switch (CLStatus) {
case kCLAuthorizationStatusNotDetermined:
NSLog(@"用戶尚未選擇決定的");
// 此處應(yīng)發(fā)起請(qǐng)求
break;
case kCLAuthorizationStatusRestricted:
NSLog(@"其它原因被禁止的");
break;
case kCLAuthorizationStatusAuthorizedAlways:
NSLog(@"前臺(tái)后臺(tái)一直可以使用定位");
break;
case kCLAuthorizationStatusAuthorizedWhenInUse:
NSLog(@"試用期間可以定位");
break;
case kCLAuthorizationStatusDenied:
NSLog(@"用戶拒絕定位服務(wù)");
break;
default:
break;
}
// 發(fā)起請(qǐng)求,實(shí)例對(duì)象要引用起來,防止詢問對(duì)話框一閃消失
self.locationManager = [[CLLocationManager alloc] init];
//[self.locationManager requestWhenInUseAuthorization]; 請(qǐng)求使用期間的權(quán)限
// 請(qǐng)求始終允許獲得定位的權(quán)限
[self.locationManager requestAlwaysAuthorization];
通訊錄
- Contacts Usage Description
允許訪問您的通訊錄才能XXXXXXXXXX(描述準(zhǔn)確)
// 查詢當(dāng)前狀態(tài)
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
switch (status) {
case CNAuthorizationStatusNotDetermined: // 未確定的
{
// 進(jìn)行權(quán)限請(qǐng)求
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError* _Nullable error) {
if (error) {
NSLog(@"授權(quán)失敗");
}else {
NSLog(@"成功授權(quán)");
}
}];
}
break;
case CNAuthorizationStatusRestricted:
NSLog(@"其它原因被禁止的");
break;
case CNAuthorizationStatusDenied:
NSLog(@"用戶拒絕的");
[self showAlertViewAboutNotAuthorAccessContact];
break;
case CNAuthorizationStatusAuthorized:
NSLog(@"用戶同意的");
//有通訊錄權(quán)限-- 進(jìn)行下一步操作
break;
default:
break;
}