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