iOS判断一些权限是否被禁止

iOS中常常会遇到访问相册、相机、麦克疯、蓝牙、以及推送等权限,因此每次咱们要使用这些权限是都要记得查看用户是否容许了,若是用户禁止了你的访问权限,你仍然去调取相册或者相机等,那么就会先出现下面的这个提示。并且是英文的,这时候用户可能有些懵逼了,这个时候咱们最好给一个提示,用户点击肯定后,咱们最好贴心的跳转到应用的权限出,让用户一键容许。ios


权限被禁用

1.查看相册权限是否被禁用

(1.)iOS7以前的判断方法(包含iOS7)app

导入头文件#import <AssetsLibrary/AssetsLibrary.h>ide

下面是判断是否有权限的代码post

ALAuthorizationStatus author =[ALAssetsLibrary authorizationStatus];url

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

//无权限  这个时候最好给个提示,用户点击是就跳转到应用的权限设置内 用户动动小手便可容许权限blog

}接口

下面是ALAuthorizationStatus的枚举string

typedef NS_ENUM(NSInteger, ALAuthorizationStatus) {it

ALAuthorizationStatusNotDetermined NS_ENUM_DEPRECATED_IOS(6_0, 9_0) = 0, // 用户还没有作出选择这个应用程序的问候

ALAuthorizationStatusRestricted NS_ENUM_DEPRECATED_IOS(6_0, 9_0),        // 此应用程序没有被受权访问的照片数据。多是家长控制权限

ALAuthorizationStatusDenied NS_ENUM_DEPRECATED_IOS(6_0, 9_0),            // 用户已经明确否定了权限的访问

ALAuthorizationStatusAuthorized NS_ENUM_DEPRECATED_IOS(6_0, 9_0)        // 用户已经受权应用访问照片数据

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

(2)iOS8以后的判断方法(包含iOS8)

导入头文件#import<Photos/Photos.h>

判断代码

PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];

if (status == PHAuthorizationStatusRestricted ||

status == PHAuthorizationStatusDenied) {

//无权限  这个时候最好给个提示,用户点击是就跳转到应用的权限设置内 用户动动小手便可容许权限

}

typedef NS_ENUM(NSInteger, PHAuthorizationStatus) {

PHAuthorizationStatusNotDetermined = 0,// 用户还没有作出选择这个应用程序的问候

PHAuthorizationStatusRestricted,  // 此应用程序没有被受权访问的照片数据。多是家长控制权限

PHAuthorizationStatusDenied,            // 用户已经明确否定了权限的访问

PHAuthorizationStatusAuthorized        //用户已经受权应用访问照片数据

} PHOTOS_AVAILABLE_IOS_TVOS(8_0, 10_0);

2.查看相机权限是否被容许访问

#import <AVFoundation/AVCaptureDevice.h>

AVAuthorizationStatus authStatus =  [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

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

{

//无权限

}

typedefNS_ENUM(NSInteger,AVAuthorizationStatus) {AVAuthorizationStatusNotDetermined=0,// 系统还未知是否访问,第一次开启相机时AVAuthorizationStatusRestricted,// 受限制的AVAuthorizationStatusDenied,//不容许AVAuthorizationStatusAuthorized// 容许状态}NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

3.查看麦克风权限是否被容许访问

#import <AVFoundation/AVCaptureDevice.h>

AVAuthorizationStatus authStatus =  [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];

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

{

//无权限

}

我靠,怎么感受哪里不对?为何跟查看相机权限同样?细心的小伙伴或许已经发现二者的差异只有一个参数不同AVMediaTypeVideo,AVMediaTypeAudio,固然判断结果的枚举也是同样啦,这里再也不赘述。

4.判断用户是否容许推送

其中iOS8以上与iOS8如下有些区别,因此须要进行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.判断是否打开了蓝牙,须要打开时跳转到设置让用户打开

其实在咱们使用蓝牙的时候即建立时就须要遵循CBCentralManagerDelegate这个代理,他有一个代理方法是不停的监控蓝牙状态的变化。

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

switch (central.state) {

case CBManagerStateUnknown:

{

// 初始的时候是未知的(刚刚建立的时候)

}

break;

case CBManagerStateResetting:

{

//正在重置状态

}

break;

case CBManagerStateUnsupported:

{

//设备不支持的状态

}

break;

case CBManagerStateUnauthorized:

{

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

// 设备未受权状态

}

break;

case CBManagerStatePoweredOff:

{

//设备关闭状态

}

break;

case CBManagerStatePoweredOn:

{

// 设备开启状态 -- 可用状态

}

break;

default:

{

}

break;

}

}

}

咱们能够在不一样的状态下作一些事情。固然咱们也能够经过CBCentralManager的state方法获取蓝牙的连接状态,还有就是咱们建立CBCentralManager系统若是发现蓝牙没有开启会自动弹出一个窗口能够去设置里面打开蓝牙。


固然若是咱们想本身给一个用户提示而后跳转到设置页面也是能够的,iOS10之后打开方式有些区别

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.判断位置服务是否被禁用

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

NSLog(@"没打开");

}

locationServicesEnabled这个返回的结果是否设置过位置服务,大概是这个意思,咱们第一次访问位置是,系统会给用户一个提示,是否容许app使用位置信息。若是你选择了是或者否,这个值就是YES,kCLAuthorizationStatusDenied表明用户明确拒绝了访问位置信息。

typedef NS_ENUM(int, CLAuthorizationStatus) {

kCLAuthorizationStatusNotDetermined = 0,//定位服务受权状态是用户没有决定是否使用定位服务。

kCLAuthorizationStatusRestricted,//定位服务受权状态是受限制的。多是因为活动限制定位服务,用户不能改变。这个状态可能不是用户拒绝的定位服务。

kCLAuthorizationStatusDenied,//定位服务受权状态已经被用户明确禁止,或者在设置里的定位服务中关闭。

kCLAuthorizationStatusAuthorizedAlways NS_ENUM_AVAILABLE(10_12, 8_0),//定位服务受权状态已经被用户容许在任何状态下获取位置信息。包括监测区域、访问区域、或者在有显著的位置变化的时候。

kCLAuthorizationStatusAuthorizedWhenInUse NS_ENUM_AVAILABLE(NA, 8_0),//定位服务受权状态仅被容许在使用应用程序的时候。

kCLAuthorizationStatusAuthorized NS_ENUM_DEPRECATED(10_6, NA, 2_0, 8_0, "Use kCLAuthorizationStatusAuthorizedAlways") __TVOS_PROHIBITED __WATCHOS_PROHIBITED = kCLAuthorizationStatusAuthorizedAlways//这个枚举值已经被废弃了。他至关于

kCLAuthorizationStatusAuthorizedAlways这个值。

};

跳转到设置页面,让用户设置权限

若是咱们须要跳转到设置位置让用户容许权限的方法是

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];

}

}

调用这个方法时,必定要有这些权限的需求时才能调用,好比自己你的应用不涉及到任何的隐私权限问题,你直接调用这个接口他不会去设置,而是到home页面。