iOS 硬件授權(quán)檢測:定位服務(wù)、通訊錄枣察、日歷争占、提醒事項(xiàng)燃逻、照片、藍(lán)牙共享臂痕、麥克風(fēng)伯襟、相機(jī)等

作者:金田

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();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铸董,一起剝皮案震驚了整個(gè)濱河市祟印,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粟害,老刑警劉巖蕴忆,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悲幅,居然都是意外死亡套鹅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門汰具,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卓鹿,“玉大人,你說我怎么就攤上這事留荔∫魉铮” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵聚蝶,是天一觀的道長杰妓。 經(jīng)常有香客問我,道長碘勉,這世上最難降的妖魔是什么巷挥? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮验靡,結(jié)果婚禮上倍宾,老公的妹妹穿的比我還像新娘雏节。我一直安慰自己,他們只是感情好高职,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布矾屯。 她就那樣靜靜地躺著,像睡著了一般初厚。 火紅的嫁衣襯著肌膚如雪件蚕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天产禾,我揣著相機(jī)與錄音排作,去河邊找鬼。 笑死亚情,一個(gè)胖子當(dāng)著我的面吹牛妄痪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楞件,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼衫生,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了土浸?” 一聲冷哼從身側(cè)響起罪针,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎黄伊,沒想到半個(gè)月后泪酱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡还最,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年墓阀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拓轻。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斯撮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扶叉,到底是詐尸還是另有隱情勿锅,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布辜梳,位于F島的核電站粱甫,受9級(jí)特大地震影響泳叠,放射性物質(zhì)發(fā)生泄漏作瞄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一危纫、第九天 我趴在偏房一處隱蔽的房頂上張望宗挥。 院中可真熱鬧乌庶,春花似錦、人聲如沸契耿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搪桂。三九已至透敌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踢械,已是汗流浹背酗电。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留内列,地道東北人撵术。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像话瞧,于是被迫代替她去往敵國和親嫩与。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容