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