- 开发中一些经常使用到的权限判断:相册、相机、定位、通讯录、通知等,适配iOS10
- 本文不在适配iOS7
一:相册
从iOS8开始苹果推荐使用
PHAuthorizationStatus
来判断获取相册权限,PHAuthorizationStatus
位于Photos.framework
的PHPhotoLibrary.h
文件使用
PHPhotoLibrary.h
需要引入头文件#import <Photos/Photos.h>
在info.plist 中添加iOS10需要的权限设置
<!-- 相册 -->
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能访问相册</string>
- 权限判断,并注册授权
// 1.获取相册授权状态
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
// 2.根据状态进行相应的操作
switch (status) {
case PHAuthorizationStatusNotDetermined: { // 用户还没有做出选择
// 2.1请求获取权限
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusDenied) {
// 拒绝授权
}else if (status == PHAuthorizationStatusAuthorized) {
// 授权成功
}else if (status == PHAuthorizationStatusRestricted) {
// 受限制,家长控制,不允许访问
}
}];
break;
}
case PHAuthorizationStatusRestricted:
// 受限制,家长控制,不允许访问
break;
case PHAuthorizationStatusDenied:
// 用户拒绝授权使用相册,需提醒用户到设置里面去开启app相册权限
break;
case PHAuthorizationStatusAuthorized:
// 用户已经授权,可以使用
break;
default:
break;
}
二:相机
- 引入头文件
#import <AVFoundation/AVFoundation.h>
- 在info.plist 中添加iOS10需要的权限设置
<!-- 相机 -->
<key> NSCameraUsageDescription </key>
<string>App需要您的同意,才能访问相机</string>
- 相机功能,通常使用在拍照、视频等方面。一般情况下会判断摄像机是否可用,避免相应的crash
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
// 可以使用,进行权限判断
}else {
// 没有检查到设备
}
- 权限判断,并注册授权
// 1.获取相机授权状态
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
// 2.检测授权状态
switch (status) {
case AVAuthorizationStatusNotDetermined: { // 用户还没有做出选择
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (granted) {
// 成功授权
}else {
// 拒绝授权
}
}];
}
break;
case AVAuthorizationStatusRestricted:
// 受限制,家长控制,不允许访问
break;
case AVAuthorizationStatusDenied:
// 用户拒绝授权使用相机,需提醒用户到设置里面去开启app相机权限
break;
case AVAuthorizationStatusAuthorized:
break;
// 已经授权
default:
break;
}
三:定位
- 引用头文件
#import <CoreLocation/CoreLocation.h>
- 在info.plist 中添加位置服务权限
<!-- 在使用期间访问位置 -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>App需要您的同意,才能在使用期间访问位置</string>
<!-- 始终访问位置 -->
<key>NSLocationAlwaysUsageDescription</key>
<string>App需要您的同意,才能始终访问位置</string>
- app请求定位之前,通常应该先确定用户是否启用了位置服务。
BOOL enabled = [CLLocationManager locationServicesEnabled];
YES:已经开启
NO:关闭了定位,需要提醒用户去系统设置中打开定位服务
- 声明强引用,防止被释放
@property (nonatomic,strong) CLLocationManager *manager;
- app授权状态检测,并注册授权
// 1.定位服务是否开启
BOOL enabled = [CLLocationManager locationServicesEnabled];
if (enabled) {
// 2.app授权状态检测
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
switch (status) {
case kCLAuthorizationStatusNotDetermined: // 用户还没有选择这个应用程序
// iOS8方法,注册使用期间开启定位,建议使用这个方法,二选一
[_manager requestWhenInUseAuthorization];
// iOS8方法,注册使用一直开启定位,二选一
[_manager requestAlwaysAuthorization];
break;
case kCLAuthorizationStatusRestricted: // 受限制,家长控制,不允许访问
break;
case kCLAuthorizationStatusDenied: //用户已明确拒绝对此应用程序的授权,或在“设置”中禁用位置服务。
break;
case kCLAuthorizationStatusAuthorizedAlways: // 用户已经授权在任何时候使用他们的位置,
// 使用了requestAlwaysAuthorization或在“设置”中“位置”切换为“始终”,会触发
break;
case kCLAuthorizationStatusAuthorizedWhenInUse: // 使用期间才能使用其位置
// 使用了requestWhenInUseAuthorization或在“设置”中“位置”切换为“使用应用期间”,会触发
break;
//case kCLAuthorizationStatusAuthorized : // 用户已授权此应用程序使用位置服务。在MacOS上使用
default:
break;
}
四:通讯录
- 从iOS9开始苹果推荐使用
Contacts.framework
框架来访问手机的通讯录,AddressBook.framework
在iOS9被弃用了,所以手机适配iOs8依然要使用AddressBook.framework
- 在info.plist添加通讯录权限
<!-- 通讯录 -->
<key>NSContactsUsageDescription<key>
<string>App需要您的同意,才能通讯录<string>
- 4.1
Contacts.framework
使用: !!!iOS9以上的异同版本才能使用这个框架 - 引入头文件
#import <Contacts/Contacts.h>
- 权限判断,并注册授权
// 1.获取通讯录授权状态
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
switch (status) {
case CNAuthorizationStatusNotDetermined: {// 用户尚未就应用程序是否可以访问联系人数据做出选择。
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
// 授权成功
}else {
// 未授权访问通讯录!
}
}];
}
break;
case CNAuthorizationStatusRestricted: // 用户无法更改此应用程序的状态,可能是由于主动限制(如父母控制)。
break;
case CNAuthorizationStatusDenied: // 用户明确拒绝对应用程序的联系人数据的访问。
break;
case CNAuthorizationStatusAuthorized: // 该应用程序被授权访问联系人数据。
break;
default:
break;
}
- 4.2
AddressBook.framework
使用 - 引入头文件
#import <AddressBook/AddressBook.h>
- 注册授权
ABAddressBookRef addressBook;
CFErrorRef error = nil;
addressBook = ABAddressBookCreateWithOptions(NULL,&error);
// app第一次启动注册会自动弹出通知框请求授权,如果授权或者拒绝,第二次启动只会进行权限判断
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
// 通讯录导入出错
}else if (!granted){
// 未授权访问通讯录!
}else {
// 授权成功
}
});
});
五:通知
- iOS10新增了
UserNotificationKit
框架,整合了关于通知的方法。增加了很多新特性 - 通知不需要配置info.plist,系统会根据注册的内容弹出相应的提示框
- iOS8 - iOS10注册通知
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil]];
- iOS10
- 引入头文件
#import <UserNotifications/UserNotifications.h>
- 注册授权
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNAuthorizationOptions options = UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert;
[center requestAuthorizationWithOptions:options completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
// 授权
}else {
// 拒绝
}
}];
// 获取各种授权信息
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"%@",settings);
}];
[[UIApplication sharedApplication] registerForRemoteNotifications];
附:iOS10之后,需要设置权限的配置信息
麦克风权限:Privacy - Microphone Usage Description
相机权限: Privacy - Camera Usage Description
相册权限: Privacy - Photo Library Usage Description
通讯录权限: Privacy - Contacts Usage Description
蓝牙权限:Privacy - Bluetooth Peripheral Usage Description
语音转文字权限:Privacy - Speech Recognition Usage Description
日历权限:Privacy - Calendars Usage Description
定位权限:Privacy - Location When In Use Usage Description
定位权限: Privacy - Location Always Usage Description
位置权限:Privacy - Location Usage Description
媒体库权限:Privacy - Media Library Usage Description
健康分享权限:Privacy - Health Share Usage Description
健康更新权限:Privacy - Health Update Usage Description
运动使用权限:Privacy - Motion Usage Description
音乐权限:Privacy - Music Usage Description
提醒使用权限:Privacy - Reminders Usage Description
Siri使用权限:Privacy - Siri Usage Description
电视供应商使用权限:Privacy - TV Provider Usage Description
视频用户账号使用权限:Privacy - Video Subscriber Account Usage Description