iOS中经常会遇到访问相册、相机、麦克疯、蓝牙、以及推送等权限,所以每次我们要使用这些权限是都要记得查看用户是否允许了,如果用户禁止了你的访问权限,你仍然去调取相册或者相机等,那么就会先出现下面的这个提示。而且是英文的,这时候用户可能有些懵逼了,这个时候我们最好给一个提示,用户点击确定后,我们最好贴心的跳转到应用的权限出,让用户一键允许。
权限被禁用
1.查看相册权限是否被禁用
(1.)iOS7之前的判断方法(包含iOS7)
导入头文件#import <AssetsLibrary/AssetsLibrary.h>
下面是判断是否有权限的代码
ALAuthorizationStatus author =[ALAssetsLibrary authorizationStatus];
if (author == ALAuthorizationStatusRestricted || author ==ALAuthorizationStatusDenied){
//无权限 这个时候最好给个提示,用户点击是就跳转到应用的权限设置内 用户动动小手即可允许权限
}
下面是ALAuthorizationStatus的枚举
typedef NS_ENUM(NSInteger, ALAuthorizationStatus) {
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页面。