iOS判断一些权限是否被禁止
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判断一些权限是否被禁止的更多相关文章
- iOS 判断相机权限是否被限制,判断相机是否可以使用
判断相机权限是否被限制 需要导入 AVFoundation 类 [objc] view plain copy #import <AVFoundation/AVFoundation.h> ...
- ios 判断用户是否开启权限---并跳转设置
ios 判断用户是否开启权限---并跳转设置 ios 判断用户是否开启权限---并跳转“系统设置” 1.判断 访问相册 或 相机 权限是否开启 2.检测是否开启定位 后面将持续更新 只有在应用请求过位 ...
- 检测 iOS 系统网络权限被关闭
背景 一直都有用户反馈无法正常联网的问题,经过定位,发现很大一部分用户是因为网络权限被系统关闭,经过资料搜集和排除发现根本原因是: 第一次打开 app 不能访问网络,无任何提示 第一次打开 app 直 ...
- iOS 判断数组是否为空
有人说可以用([array count]==0 )来判断是否为空,都是坑,如果array为空的话,执行count就会直接报错,程序崩溃退出. 正确判断NSArray是否为空的方法:用 (!array) ...
- IOS判断NSArray是否为空
场景描述:判断一个集合是否为空,如果不为空执行A,如果为空执行B Java实现方法 public void exec(){ List<String> list = this.getCont ...
- iOS 10 之后权限设置
iOS 10 之后权限设置 麦克风权限:Privacy - Microphone Usage Description 是否允许此App使用你的麦克风? 相机权限: Privacy - Camera U ...
- iOS开发-iOS 10 由于权限问题导致崩溃的那些坑
iOS开发-iOS 10 由于权限问题导致崩溃的那些坑 6月份的WWDC大会结束有一段时间了,相信很多开发者也是在努力工作的闲时用着Xcode8 Beta版学习着新的特性吧. 使用Xcode8写自己 ...
- iOS 判断是否有权限访问相机,相册
1.判断用户是否有权限访问相册 #import <AssetsLibrary/AssetsLibrary.h> ALAuthorizationStatus author =[ALAsset ...
- iOS~判断应用是否有定位权限
在特定场景下我们需要判断用户是否允许应用获取定位权限 1.导入类库: #import <CoreLocation/CLLocationManager.h> 2.判断用户手机是否开启了定位服 ...
随机推荐
- 使用autofac在mvc5下依赖注入
把遇到的问题汇总一下: 一.安装mvc5版本 命令:pm> Install-Package Autofac 结果安装的Autofac.Integration.Mvc(版本为4.0),所引用的依赖 ...
- java的重载总结
1.不能以返回值的不同来重载方法,编译都不通过(只有参数类型或者参数个数不同才可以重载方法) 在Java语言中,要重载一个方法,除了要与原方法具有相同的简单名称外,还要求必须拥有一个与原方法不同的(不 ...
- React安装 脚手架create-react-app安装步骤及问题
create-react-app 是来自于 Facebook的脚手架,通过该命令我们无需配置就能快速构建 React 开发环境. 安装步骤: 1.先装脚手架 PS:第一次装直接在打开CMD默认 ...
- 时间&物质&效率
由于我的家庭是地道的农民家庭,在上学的时候,父母很辛苦的供我读初中,高中,大学. 现在我想说的是,用时间来换取效率是我求学时最大的遗憾. 举一个例子吧:每次回家坐火车,火车很费时间,假如我不缺钱,完全 ...
- MVC:@RenderBody、@RenderPage、@RenderSection用法
本文导读:在Razor引擎中没有了“母版页”,取而代之的是叫做“布局”的页面(_Layout.cshtml)放在了共享视图文件夹中.模板页:@RenderBody()占位符:局部页面:@RenderP ...
- fabric.js 学习
官网地址:http://fabricjs.com/ git https://github.com/kangax/fabric.js/ <!DOCTYPE html> < ...
- 怎么看时序图--nand flash的读操作详解 (转)
这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知识的.你需要至少了解 你手上的 nand flash的物理结构和一些诸如读写命令 操作的大概印象,你至少也需要看过 ...
- Mysql重复数据查询置为空
前两天产品有个需求,相同的商品因为价格不同而分开展示,但是明细还是算一条明细,具体区分展示出商品的价格和数量信息,其他重复的商品信息要置空. 需求并不难,用程序代码循环处理就可以了.但是后面涉及到打印 ...
- mac上安装flask详细步骤
1 在终端输入 macdeMac-mini-62:~ mac$ sudo easy_install pip 2 macdeMac-mini-62:~ mac$ sudo pip install fl ...
- JQ淡入淡出效果
<script type="text/javascript"> //页面淡入淡出 $(document).ready(function() { $('body').hi ...