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

摘要:
在iOS中经常会遇到对相册、相机、Macintosh、蓝牙和推送权限的访问,因此每次我们想要使用这些权限时,我们都应该记得检查用户是否允许这些权限。如果用户禁用了您的访问权限,而您仍然要检索相册或相机,则会首先出现以下提示。

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

iOS判断一些权限是否被禁止第1张
权限被禁用

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

// 设备未授权状态

}

break;

case CBManagerStatePoweredOff:

{

//设备关闭状态

}

break;

case CBManagerStatePoweredOn:

{

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

}

break;

default:

{

}

break;

}

}

}

我们可以在不同的状态下做一些事情。当然我们也可以通过CBCentralManager的state方法获取蓝牙的链接状态,还有就是我们创建CBCentralManager系统如果发现蓝牙没有开启会自动弹出一个窗口可以去设置里面打开蓝牙。

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

当然如果我们想自己给一个用户提示然后跳转到设置页面也是可以的,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页面。

免责声明:文章转载自《iOS判断一些权限是否被禁止》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇轻量级锁,偏向锁,重量级锁Java 字符串常用操作(String类)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DMA映射 dma_addr_t

DMA映射 一个DMA映射是要分配的DMA缓冲区与为该缓冲区生成的、设备可访问地址的组合。 DMA映射建立了一个新的结构类型——dma_addr_t来表示总线地址。dma_addr_t类型的变量对驱动程序是不透明的, 唯一允许的操作是将它们传递给DMA支持例程以及设备本身。 根据DMA缓冲区期望保留的时间长短,PCI代码有两种DMA映射: 1) 一致性映射...

C# 获取枚举 Enum 变量值的 Description 属性

在C#中如何读取枚举值的描述属性? 在C#中,有时候我们需要读取枚举值的描述属性,也就是说这个枚举值代表了什么意思。比如本文中枚举值 Chinese ,我们希望知道它代表意思的说明(即“中文”)。 有下面的枚举: 1 2 3 4 5 6 public enum EnumLanugage {     [System.ComponentMode...

使用VS2008开发OPC客户端程序

使用Rockwell的 RsiOPCAuto.dll 或者Siemens的 Interop.OPCSiemensDAAutomation.dll时, 若直接拷贝的Dll使用,需要注册后才可添加引用到VS2008.注册:D:\>regsvr32 rsiopcauto.dll 已下为OPC读取标签的核心内容: 使用了Hash表存储标签位置对应标签多代表...

C语言 枚举类型

https://www.runoob.com/cprogramming/c-enum.html C enum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,……}; 接下来我们举个例子,比如:一星期有 7 天,如果不用枚举,我们需要使用 #define 来为每个...

python之路——表操作

阅读目录   引擎介绍   表介绍   创建表   查看表结构   mysql中的数据类型   表的完整性约束   修改表结构   删除表   多表结构的创建与分析   作业 返回顶部 引擎介绍 mysql中的存储引擎(https://www.cnblogs.com/l-hf/p/11533999.html) 返回顶部 表介绍 表就相当于文...

iOS状态栏详解(隐藏)

状态栏的隐藏 状态栏的隐藏主要有两种方法:方法一:通过代码控制 @interface UIApplication(UIApplicationDeprecated) // Setting statusBarHidden does nothing if your application is using the default UIViewControl...