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页面。

iOS判断一些权限是否被禁止的更多相关文章

  1. iOS 判断相机权限是否被限制,判断相机是否可以使用

    判断相机权限是否被限制 需要导入   AVFoundation 类 [objc] view plain copy #import <AVFoundation/AVFoundation.h> ...

  2. ios 判断用户是否开启权限---并跳转设置

    ios 判断用户是否开启权限---并跳转设置 ios 判断用户是否开启权限---并跳转“系统设置” 1.判断 访问相册 或 相机 权限是否开启 2.检测是否开启定位 后面将持续更新 只有在应用请求过位 ...

  3. 检测 iOS 系统网络权限被关闭

    背景 一直都有用户反馈无法正常联网的问题,经过定位,发现很大一部分用户是因为网络权限被系统关闭,经过资料搜集和排除发现根本原因是: 第一次打开 app 不能访问网络,无任何提示 第一次打开 app 直 ...

  4. iOS 判断数组是否为空

    有人说可以用([array count]==0 )来判断是否为空,都是坑,如果array为空的话,执行count就会直接报错,程序崩溃退出. 正确判断NSArray是否为空的方法:用 (!array) ...

  5. IOS判断NSArray是否为空

    场景描述:判断一个集合是否为空,如果不为空执行A,如果为空执行B Java实现方法 public void exec(){ List<String> list = this.getCont ...

  6. iOS 10 之后权限设置

    iOS 10 之后权限设置 麦克风权限:Privacy - Microphone Usage Description 是否允许此App使用你的麦克风? 相机权限: Privacy - Camera U ...

  7. iOS开发-iOS 10 由于权限问题导致崩溃的那些坑

     iOS开发-iOS 10 由于权限问题导致崩溃的那些坑 6月份的WWDC大会结束有一段时间了,相信很多开发者也是在努力工作的闲时用着Xcode8 Beta版学习着新的特性吧. 使用Xcode8写自己 ...

  8. iOS 判断是否有权限访问相机,相册

    1.判断用户是否有权限访问相册 #import <AssetsLibrary/AssetsLibrary.h> ALAuthorizationStatus author =[ALAsset ...

  9. iOS~判断应用是否有定位权限

    在特定场景下我们需要判断用户是否允许应用获取定位权限 1.导入类库: #import <CoreLocation/CLLocationManager.h> 2.判断用户手机是否开启了定位服 ...

随机推荐

  1. 软件需求规范说明 (Software Requirements Specification, 简称SRS)

    GB/T 9385-2008 笔记 为了形成确定和完备的规格说明, 我们需要明确 软件的顾客希望得到什么; 软件的供方理解用户想要什么; 4.2 SRS的基本性质 SRS是对在具体环境中执行确定功能的 ...

  2. caffe 参数介绍 solver.prototxt

    转载自 http://blog.csdn.net/cyh_24/article/details/51537709 solver.prototxt net: "models/bvlc_alex ...

  3. logging (日志) 模块

    本文源自景女神 函数式简单配置 import logging logging.debug('debug message') logging.info('info message') logging.w ...

  4. Android学习——碎片Fragment的使用

    一.碎片的简单用法(实现在一个活动中添加两个碎片,并让这两个碎片平分活动空间) 1.新建一个FragmentTest项目: 新建一个左侧碎片布局left_fragment.xml,代码如下:(只放置一 ...

  5. PowerDesigner 逆向工程Non SQL Error : Could not load class com.mysql.jdbc.Driver

    建立与数据库的连接. 在菜单条上,有一个Database的选择项: 选择connect…后弹出设置对话框: 在Data source里选择第三个单选按钮,即Connection profile:后,点 ...

  6. 【Oracle】回收站

    ☆回收站概念 oracle从10g开始,引入回收站(Recycle Bin)概念.回收站的全称叫:Tablespace Recycle Bin.回收站是一个逻辑区域,oracle并没有为它分配物理空间 ...

  7. 【Oracle】恢复丢失的临时表空间文件

    Oracle 11g以后,临时表空间文件是可以在重启数据库以后自动生成的(当然也可以在相同目录再建一个临时表空间文件),模拟实验如下: 1)删除临时表空间数据文件 SYS@ENMOEDU> se ...

  8. ML一些简单的资源

    参考文献及推荐阅读 维基百科,http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm: 机器学习中的相似性度量,http://www.cnb ...

  9. window环境下,提升工作效率

    效率工具 windows桌面程序 Listary 本地文件搜索器 有道词典 划词翻译, 并且能够存在生词本里面 印象笔记 浏览资料整理 chrom插件 crxMouse 鼠标手势 chrome vim ...

  10. nodeJs的一些常识知识

    在项目目录中打开命令窗口 1. npm init 生成一个 package.json.(npm inii -y 直接生成,不用确定). 2.npm i . 下载 package.json devDep ...