iOS 硬件授权检测:定位服务、通讯录、日历、提醒事项、照片、蓝牙共享、麦克风、相机等(转)

                 转载自:http://www.cocoachina.com/ios/20151214/14502.html

iOS系统版本的不断升级的前提,伴随着用户使用设备的安全性提升,iOS系统对于App需要使用的硬件限制也越来越严格,App处理稍有不妥,轻则造成功能不可用用户还不知道,重则会造成App Crash。

当 用户在App启动时,看到弹出来的一条条“XXX 请求访问您的位置” “XXX 请求访问您的通讯录” “XXX 请求访问您的日历” “XXX 请求访问您的摄像头” 等一系列消息时,用户觉得不耐烦的同时,也会由于一时的安全考虑而把相应的功能给屏蔽掉,这还只是开始,当用户真正在使用对应功能的时候,就会出现一连续 的奇怪现象,比如数据显示异常:明明通讯录里面有信息,却总是加载不出数据;有的甚至是直接Crash。

下面,笔者将会综合性地把上述硬件的授权检测,一一地详细列出,并给出相关示例代码:

1、定位服务

相关框架

#import

检测方法

+ (CLAuthorizationStatus)authorizationStatus

相关返回参数

//用户尚未做出选择
kCLAuthorizationStatusNotDetermined = 0,
 
// 未授权,且用户无法更新,如家长控制情况下
kCLAuthorizationStatusRestricted,
 
// 用户拒绝App使用
kCLAuthorizationStatusDenied,
 
// 总是使用
kCLAuthorizationStatusAuthorizedAlways NS_ENUM_AVAILABLE(NA, 8_0),
 
// 按需使用
kCLAuthorizationStatusAuthorizedWhenInUse NS_ENUM_AVAILABLE(NA, 8_0),
 
// 已授权
kCLAuthorizationStatusAuthorized

参考代码

__block void (^checkLocationAuth)(void) = ^{
    CLAuthorizationStatus authStatus = [CLLocationManager  authorizationStatus];
     
    if (CLAuthorizationStatusAuthorized == authStatus) {
        //授权成功,执行后续操作
    }else {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            checkLocationAuth();
        });
    }
};
checkLocationAuth();

2、通讯录

#import

检测方法

ABAuthorizationStatus ABAddressBookGetAuthorizationStatus(void)

授权状态

kABAuthorizationStatusNotDetermined = 0,    // 未进行授权选择
kABAuthorizationStatusRestricted,           // 未授权,且用户无法更新,如家长控制情况下
kABAuthorizationStatusDenied,               // 用户拒绝App使用
kABAuthorizationStatusAuthorized            // 已授权,可使用

参考代码

__block void (^checkAddressBookAuth)(void) = ^{
    ABAuthorizationStatus authStatus = ABAddressBookGetAuthorizationStatus();
     
    if (kABAuthorizationStatusAuthorized == authStatus) {
        //授权成功,执行后续操作
    }else {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            checkAddressBookAuth();
        });
    }
};
checkAddressBookAuth();

3、日历/提醒事项授权

#import

检测方法

+ (EKAuthorizationStatus)authorizationStatusForEntityType:(EKEntityType)entityType

参数类型

EKEntityTypeEvent,  //事件
 
EKEntityTypeReminder//提醒

授权状态

EKAuthorizationStatusNotDetermined = 0,// 未进行授权选择
 
EKAuthorizationStatusRestricted,    // 未授权,且用户无法更新,如家长控制情况下
 
EKAuthorizationStatusDenied,       // 用户拒绝App使用
 
EKAuthorizationStatusAuthorized,    // 已授权,可使用

参考代码

__block void (^checkCalanderAuth)(void) = ^{
    EKAuthorizationStatus authStatus = [EKAuthorizationStatus authorizationStatusForEntityType:EKEntityTypeEvent];
     
    if (EKAuthorizationStatusAuthorized == authStatus) {
        //授权成功,执行后续操作
    }else {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            checkCalanderAuth();
        });
    }
};
checkCalanderAuth();

4、照片库授权

#import

检测方法

+ (ALAuthorizationStatus)authorizationStatus;

授权状态

ALAuthorizationStatusNotDetermined = 0,// 未进行授权选择
 
ALAuthorizationStatusRestricted,    // 未授权,且用户无法更新,如家长控制情况下
 
ALAuthorizationStatusDenied,       // 用户拒绝App使用
 
ALAuthorizationStatusAuthorized,    // 已授权,可使用

参考代码

__block void (^checkAssetLibraryAuth)(void) = ^{
    ALAuthorizationStatus authStatus = [ALAuthorizationStatus authorizationStatus];
     
    if (ALAuthorizationStatusAuthorized == authStatus) {
        //授权成功,执行后续操作
    }else {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            checkAssetLibraryAuth();
        });
    }
};
checkAssetLibraryAuth();

5、蓝牙授权状态检测

#import

检测方法

+ (CBPeripheralManagerAuthorizationStatus)authorizationStatus;

授权状态

CBPeripheralManagerAuthorizationStatusNotDetermined = 0,// 未进行授权选择
 
CBPeripheralManagerAuthorizationStatusRestricted,    // 未授权,且用户无法更新,如家长控制情况下
 
CBPeripheralManagerAuthorizationStatusDenied,       // 用户拒绝App使用
 
CBPeripheralManagerAuthorizationStatusAuthorized,    // 已授权,可使用

参考代码

__block void (^checkPeripheralAuth)(void) = ^{
    CBPeripheralManagerAuthorizationStatus authStatus = [CBPeripheralManagerAuthorizationStatus authorizationStatus];
     
    if (CBPeripheralManagerAuthorizationStatusAuthorized == authStatus) {
        //授权成功,执行后续操作
    }else {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            checkPeripheralAuth();
        });
    }
};
checkPeripheralAuth();

6、摄像头授权状态检测

#import

检测方法

+ (AVAuthorizationStatus)authorizationStatusForMediaType:(NSString *)mediaType;

授权状态

AVAuthorizationStatusNotDetermined = 0,// 未进行授权选择
 
AVAuthorizationStatusRestricted,    // 未授权,且用户无法更新,如家长控制情况下
 
AVAuthorizationStatusDenied,       // 用户拒绝App使用
 
AVAuthorizationStatusAuthorized,    // 已授权,可使用

参考代码

__block void (^checkCameraAuth)(void) = ^{
    AVAuthorizationStatus authStatus = [AVAuthorizationStatus authorizationStatusForMediaType:AVMediaTypeVideo];
     
    if (AVAuthorizationStatusAuthorized == authStatus) {
        //授权成功,执行后续操作
    }else {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            checkCameraAuth();
        });
    }
};
checkCameraAuth();

7、麦克风授权状态检测

#import

检测方法

- (AVAudioSessionRecordPermission)recordPermission;

授权状态

AVAudioSessionRecordPermissionUndetermined,    // 用户尚未被请求许可。
 
AVAudioSessionRecordPermissionDenied,       // 用户已被要求并已拒绝许可。
 
AVAudioSessionRecordPermissionGranted,    // 用户已被要求并已授予权限。

参考代码

__block void (^checkRecordPermission)(void) = ^{
    AVAudioSessionRecordPermission authStatus = [[AVAudioSession sharedInstance] recordPermission];
     
    if (AVAudioSessionRecordPermissionGranted == authStatus) {
        //授权成功,执行后续操作
    }else {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            checkRecordPermission();
        });
    }
};
checkRecordPermission();
时间: 2024-08-27 00:14:23

iOS 硬件授权检测:定位服务、通讯录、日历、提醒事项、照片、蓝牙共享、麦克风、相机等(转)的相关文章

iOS定位服务与地图开发(1)---获取经纬度

定位服务是通过GPS等方式查找定位自己的位置的,再通过地图标注出来. 在iOS中定位服务和地图开发是使用两套API分别完成的. 1.定位服务: iOS系统提供3种不同定位途径: 1>WiFi定位:通过查询一个WiFi路由器的地理位置信息,iPhone.iPod Touch.iPad都可以采用. 2>蜂窝式移动电话基站定位:通过移动运营商基站定位 3>GPS卫星定位:通过3~4颗GPS卫星位置定位,最为准确,但是耗电量大 iOS不像Android系统在定位服务编程时可以指定采用哪种途径进行

iOS 定位服务、通讯录、日历、提醒事项、照片、蓝牙共享、麦克风、相机等授权检测

金田 iOS系统版本的不断升级的前提,伴随着用户使用设备的安全性提升,iOS系统对于App需要使用的硬件限制也越来越严格,App处理稍有不妥,轻则造成功能不可用用户还不知道,重则会造成App Crash. 当用户在App启动时,看到弹出来的一条条“XXX 请求访问您的位置” “XXX 请求访问您的通讯录” “XXX 请求访问您的日历” “XXX 请求访问您的摄像头” 等一系列消息时,用户觉得不耐烦的同时,也会由于一时的安全考虑而把相应的功能给屏蔽掉,这还只是开始,当用户真正在使用对应功能的时候,

iOS开发-定位服务iOS8.0以上授权

if ([UIDevice currentDevice].systemVersion.doubleValue > 8.0) { [self.locMgr requestAlwaysAuthorization]; } else { [self.locMgr startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizati

iOS开发拓展篇—CoreLocation定位服务

一.简单说明 1.CLLocationManager CLLocationManager的常用操作和属性 开始用户定位- (void)startUpdatingLocation; 停止用户定位- (void) stopUpdatingLocation; 说明:当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法 - (void)locationManager:(CLLocationManager *)manager didUpdat

iOS开发 定位服务与地图

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要实现地图.导航功能,往往需要先熟悉定位功能,在iO

在iOS8下使用CLLocationManager定位服务需要系统授权

最近在ios8.0使用CLLocationManager定位服务,发现老不能定位,查看设置菜单中的项也是处于未知状态.想起之前都有一个弹出框提示用户是否允许定位,这次一直没有出现了.原来ios8.0下的定位服务需要申请授权了. 具体代码如下: 1 if ([CLLocationManager locationServicesEnabled]) { 2 3 self.locationManager = [[CLLocationManager alloc] init]; 4 5 _locationM

iOS开发-定位服务和地理围栏

一.获得用户的位置使用CoreLocation框架.1.如果你的应用基于位置来正确运行,你应该在你的Info.plist中包括UIRequiredDeviceCapabilities键.App Store使用这个信息来阻止没有定位的设备下载该应用.UIRequiredDeviceCapabilities键对应一个字符串数组,包括:1)location-services字符串--如果你请求一般的定位服务2)gps--如果你请求GPS级的精度如果你的应用需要定位,但是没有定位也能正常运行,就不要包含

iOS 开发指南 第16章 定位服务与地图应用之使用苹果地图

1 显示地图 MKMapView MKMapViewDelegate 准备:加载MapKit.framework 设置地图样式 代理-实现代理方法 - (void)viewDidLoad { [super viewDidLoad]; 设置样式,枚举类型MKMapType self.mapView.mapType = MKMapTypeStandard; // self.mapView.mapType = MKMapTypeSatellite; 将当前视图控制器赋值给地图视图的delegate属性

iOS开发之CoreLocaiton框架使用(定位服务)

前言 在iOS开发中,定位和地图功能是比较常用的功能之一,要想加入这2大功能,必须基于2个框架进行开发. (1) CoreLocation:用于地理定位,地理编码,区域监听等(着重功能实现). (2) MapKit:用于地图展示,例如大头针,路线.覆盖层展示等(着重界面展示). 这篇文章我们来着重的介绍下CoreLocation框架 简介 CoreLocaiton框架是百度地图的定位也是在苹果API的基础上进行了封装. CoreLocation框架使用前提 导入框架(Xcode5.0之后可以省略