iOS判斷一些權(quán)限是否被禁止

iOS中經(jīng)常會遇到訪問相冊砾淌、相機啦撮、麥克瘋、藍牙汪厨、以及推送等權(quán)限赃春,所以每次我們要使用這些權(quán)限是都要記得查看用戶是否允許了,如果用戶禁止了你的訪問權(quán)限劫乱,你仍然去調(diào)取相冊或者相機等织中,那么就會先出現(xiàn)下面的這個提示。而且是英文的衷戈,這時候用戶可能有些懵逼了狭吼,這個時候我們最好給一個提示,用戶點擊確定后殖妇,我們最好貼心的跳轉(zhuǎn)到應(yīng)用的權(quán)限出刁笙,讓用戶一鍵允許。

權(quán)限被禁用

1.查看相冊權(quán)限是否被禁用

(1.)iOS7之前的判斷方法(包含iOS7)

導(dǎo)入頭文件#import <AssetsLibrary/AssetsLibrary.h>

下面是判斷是否有權(quán)限的代碼

ALAuthorizationStatus author =[ALAssetsLibrary authorizationStatus];

if (author == ALAuthorizationStatusRestricted || author ==ALAuthorizationStatusDenied){

//無權(quán)限? 這個時候最好給個提示谦趣,用戶點擊是就跳轉(zhuǎn)到應(yīng)用的權(quán)限設(shè)置內(nèi) 用戶動動小手即可允許權(quán)限

}

下面是ALAuthorizationStatus的枚舉

typedef NS_ENUM(NSInteger, ALAuthorizationStatus) {

ALAuthorizationStatusNotDetermined NS_ENUM_DEPRECATED_IOS(6_0, 9_0) = 0, // 用戶尚未做出選擇這個應(yīng)用程序的問候

ALAuthorizationStatusRestricted NS_ENUM_DEPRECATED_IOS(6_0, 9_0),? ? ? ? // 此應(yīng)用程序沒有被授權(quán)訪問的照片數(shù)據(jù)疲吸。可能是家長控制權(quán)限

ALAuthorizationStatusDenied NS_ENUM_DEPRECATED_IOS(6_0, 9_0),? ? ? ? ? ? // 用戶已經(jīng)明確否認了權(quán)限的訪問

ALAuthorizationStatusAuthorized NS_ENUM_DEPRECATED_IOS(6_0, 9_0)? ? ? ? // 用戶已經(jīng)授權(quán)應(yīng)用訪問照片數(shù)據(jù)

} NS_DEPRECATED_IOS(6_0, 9_0, "Use PHAuthorizationStatus in the Photos framework instead");

(2)iOS8之后的判斷方法(包含iOS8)

導(dǎo)入頭文件#import<Photos/Photos.h>

判斷代碼

PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];

if (status == PHAuthorizationStatusRestricted ||

status == PHAuthorizationStatusDenied) {

//無權(quán)限? 這個時候最好給個提示前鹅,用戶點擊是就跳轉(zhuǎn)到應(yīng)用的權(quán)限設(shè)置內(nèi) 用戶動動小手即可允許權(quán)限

}

typedef NS_ENUM(NSInteger, PHAuthorizationStatus) {

PHAuthorizationStatusNotDetermined = 0,// 用戶尚未做出選擇這個應(yīng)用程序的問候

PHAuthorizationStatusRestricted,? // 此應(yīng)用程序沒有被授權(quán)訪問的照片數(shù)據(jù)摘悴。可能是家長控制權(quán)限

PHAuthorizationStatusDenied,? ? ? ? ? ? // 用戶已經(jīng)明確否認了權(quán)限的訪問

PHAuthorizationStatusAuthorized? ? ? ? //用戶已經(jīng)授權(quán)應(yīng)用訪問照片數(shù)據(jù)

} PHOTOS_AVAILABLE_IOS_TVOS(8_0, 10_0);

2.查看相機權(quán)限是否被允許訪問

#import <AVFoundation/AVCaptureDevice.h>

AVAuthorizationStatus authStatus =? [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

if (authStatus == AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied)

{

//無權(quán)限

}

typedefNS_ENUM(NSInteger,AVAuthorizationStatus) {AVAuthorizationStatusNotDetermined=0,// 系統(tǒng)還未知是否訪問嫡纠,第一次開啟相機時AVAuthorizationStatusRestricted,// 受限制的AVAuthorizationStatusDenied,//不允許AVAuthorizationStatusAuthorized// 允許狀態(tài)}NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

3.查看麥克風(fēng)權(quán)限是否被允許訪問

#import <AVFoundation/AVCaptureDevice.h>

AVAuthorizationStatus authStatus =? [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];

if (authStatus == AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied)

{

//無權(quán)限

}

我靠烦租,怎么感覺哪里不對?為什么跟查看相機權(quán)限一樣除盏?細心的小伙伴或許已經(jīng)發(fā)現(xiàn)兩者的差別只有一個參數(shù)不一樣AVMediaTypeVideo叉橱,AVMediaTypeAudio,當(dāng)然判斷結(jié)果的枚舉也是一樣啦者蠕,這里不再贅述窃祝。

4.判斷用戶是否允許推送

其中iOS8以上與iOS8以下有些區(qū)別,所以需要進行iOS版本判斷踱侣。

#define IOS8 ([[[UIDevice currentDevice] systemVersion] doubleValue] >=8.0 ? YES : NO)

if (IOS8) { //iOS8以上包含iOS8

if ([[UIApplication sharedApplication] currentUserNotificationSettings].types? ==UIUserNotificationTypeNone) {

NSLog(@"沒有開啟");

}

}else{ // ios7 一下

if ([[UIApplication sharedApplication] enabledRemoteNotificationTypes]? == UIRemoteNotificationTypeNone) {

NSLog(@"沒有開啟");

}

}

typedef NS_OPTIONS(NSUInteger, UIUserNotificationType) {

UIUserNotificationTypeNone? ? = 0,? ? ? // 用戶禁止了推送

UIUserNotificationTypeBadge? = 1 << 0, // 用戶開啟了推送角標

UIUserNotificationTypeSound? = 1 << 1, // 用戶開啟了推送提示音

UIUserNotificationTypeAlert? = 1 << 2, // 用戶開啟了通知欄提醒

} NS_ENUM_DEPRECATED_IOS(8_0, 10_0, "Use UserNotifications Framework's UNAuthorizationOptions") __TVOS_PROHIBITED;

5.判斷是否打開了藍牙粪小,需要打開時跳轉(zhuǎn)到設(shè)置讓用戶打開

其實在我們使用藍牙的時候即創(chuàng)建時就需要遵循CBCentralManagerDelegate這個代理,他有一個代理方法是不停的監(jiān)控藍牙狀態(tài)的變化抡句。

- (void)centralManagerDidUpdateState:(CBCentralManager *)central{

switch (central.state) {

case CBManagerStateUnknown:

{

// 初始的時候是未知的(剛剛創(chuàng)建的時候)

}

break;

case CBManagerStateResetting:

{

//正在重置狀態(tài)

}

break;

case CBManagerStateUnsupported:

{

//設(shè)備不支持的狀態(tài)

}

break;

case CBManagerStateUnauthorized:

{

[stringForCentral appendString:@"Resetting\n"];

// 設(shè)備未授權(quán)狀態(tài)

}

break;

case CBManagerStatePoweredOff:

{

//設(shè)備關(guān)閉狀態(tài)

}

break;

case CBManagerStatePoweredOn:

{

// 設(shè)備開啟狀態(tài) -- 可用狀態(tài)

}

break;

default:

{

}

break;

}

}

}

我們可以在不同的狀態(tài)下做一些事情探膊。當(dāng)然我們也可以通過CBCentralManager的state方法獲取藍牙的鏈接狀態(tài),還有就是我們創(chuàng)建CBCentralManager系統(tǒng)如果發(fā)現(xiàn)藍牙沒有開啟會自動彈出一個窗口可以去設(shè)置里面打開藍牙待榔。

當(dāng)然如果我們想自己給一個用戶提示然后跳轉(zhuǎn)到設(shè)置頁面也是可以的,iOS10以后打開方式有些區(qū)別

NSString * urlString = @"App-Prefs:root=Bluetooth";

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlString]]) {

if (IOS_VERSION>10.0) {

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString] options:@{} completionHandler:nil];

} else {

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];

}

}

6.判斷位置服務(wù)是否被禁用

if([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {

NSLog(@"沒打開");

}

locationServicesEnabled這個返回的結(jié)果是否設(shè)置過位置服務(wù)逞壁,大概是這個意思流济,我們第一次訪問位置是,系統(tǒng)會給用戶一個提示腌闯,是否允許app使用位置信息绳瘟。如果你選擇了是或者否,這個值就是YES姿骏,kCLAuthorizationStatusDenied代表用戶明確拒絕了訪問位置信息糖声。

typedef NS_ENUM(int, CLAuthorizationStatus) {

kCLAuthorizationStatusNotDetermined = 0,//定位服務(wù)授權(quán)狀態(tài)是用戶沒有決定是否使用定位服務(wù)。

kCLAuthorizationStatusRestricted,//定位服務(wù)授權(quán)狀態(tài)是受限制的分瘦≌盒海可能是由于活動限制定位服務(wù),用戶不能改變嘲玫。這個狀態(tài)可能不是用戶拒絕的定位服務(wù)蟋恬。

kCLAuthorizationStatusDenied,//定位服務(wù)授權(quán)狀態(tài)已經(jīng)被用戶明確禁止,或者在設(shè)置里的定位服務(wù)中關(guān)閉趁冈。

kCLAuthorizationStatusAuthorizedAlways NS_ENUM_AVAILABLE(10_12, 8_0),//定位服務(wù)授權(quán)狀態(tài)已經(jīng)被用戶允許在任何狀態(tài)下獲取位置信息。包括監(jiān)測區(qū)域拜马、訪問區(qū)域渗勘、或者在有顯著的位置變化的時候。

kCLAuthorizationStatusAuthorizedWhenInUse NS_ENUM_AVAILABLE(NA, 8_0),//定位服務(wù)授權(quán)狀態(tài)僅被允許在使用應(yīng)用程序的時候俩莽。

kCLAuthorizationStatusAuthorized NS_ENUM_DEPRECATED(10_6, NA, 2_0, 8_0, "Use kCLAuthorizationStatusAuthorizedAlways") __TVOS_PROHIBITED __WATCHOS_PROHIBITED = kCLAuthorizationStatusAuthorizedAlways//這個枚舉值已經(jīng)被廢棄了旺坠。他相當(dāng)于

kCLAuthorizationStatusAuthorizedAlways這個值。

};

跳轉(zhuǎn)到設(shè)置頁面扮超,讓用戶設(shè)置權(quán)限

如果我們需要跳轉(zhuǎn)到設(shè)置位置讓用戶允許權(quán)限的方法是

NSURL * url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

if ([[UIApplication sharedApplication] canOpenURL:url]) {

if (IOS_VERSION>10.0) {

[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];

} else {

[[UIApplication sharedApplication] openURL:url];

}

}

調(diào)用這個方法時取刃,一定要有這些權(quán)限的需求時才能調(diào)用,比如本身你的應(yīng)用不涉及到任何的隱私權(quán)限問題出刷,你直接調(diào)用這個接口他不會去設(shè)置璧疗,而是到home頁面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馁龟,一起剝皮案震驚了整個濱河市崩侠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坷檩,老刑警劉巖却音,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矢炼,居然都是意外死亡系瓢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門句灌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夷陋,“玉大人,你說我怎么就攤上這事〖〉荆” “怎么了清蚀?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爹谭。 經(jīng)常有香客問我枷邪,道長,這世上最難降的妖魔是什么诺凡? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任东揣,我火速辦了婚禮,結(jié)果婚禮上腹泌,老公的妹妹穿的比我還像新娘嘶卧。我一直安慰自己,他們只是感情好凉袱,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布芥吟。 她就那樣靜靜地躺著,像睡著了一般专甩。 火紅的嫁衣襯著肌膚如雪钟鸵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天涤躲,我揣著相機與錄音棺耍,去河邊找鬼。 笑死种樱,一個胖子當(dāng)著我的面吹牛蒙袍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嫩挤,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼害幅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俐镐?” 一聲冷哼從身側(cè)響起矫限,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佩抹,沒想到半個月后叼风,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡棍苹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年无宿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枢里。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡孽鸡,死狀恐怖蹂午,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彬碱,我是刑警寧澤豆胸,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站巷疼,受9級特大地震影響晚胡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嚼沿,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一估盘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骡尽,春花似錦遣妥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谭贪,卻和暖如春班套,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背故河。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吆豹,地道東北人鱼的。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像痘煤,于是被迫代替她去往敵國和親凑阶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

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