獲取用戶權(quán)限

獲得相機(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;
}
待續(xù)。。。。。。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • github 下載地址 JQAuthorizationTools JQAuthorizationTools 獲取用...
    Frankenstein張閱讀 1,968評(píng)論 0 2
  • 開始注意這點(diǎn)可以做很多優(yōu)化是即刻當(dāng)初對(duì)用戶開啟通知權(quán)限的流程沒思考到這一點(diǎn)。 即刻是會(huì)在第一次安裝時(shí)的引導(dǎo)頁,自己...
    舒克安靜了閱讀 210評(píng)論 1 0
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,951評(píng)論 0 9
  • 背景 我們?cè)贏pp使用過程中包含獲取用戶位置的需求,于是在工程的Info.plis中,我們包含“Location ...
    wangplus7閱讀 11,256評(píng)論 0 10
  • 系統(tǒng)權(quán)限 Android 是一個(gè)權(quán)限分隔的操作系統(tǒng),其中每個(gè)應(yīng)用都有其獨(dú)特的系統(tǒng)標(biāo)識(shí)(Linux 用戶 ID 和組...
    進(jìn)攻的螞蟻閱讀 2,264評(píng)論 0 0

友情鏈接更多精彩內(nèi)容