获得相机或麦克风权限
使用到对应的权限时,应在info.plist文件中加入对应的权限描述。
NSCameraUsageDescription
允许访问您的相机才能XXXXXXXXXX(描述准确)NSMicrophoneUsageDescription
允许访问您的麦克风才能XXXXXXXXXX(描述准确)
#import <AVFoundation/AVFoundation.h>
AVMediaType AVType = AVMediaTypeAudio; // AVMediaTypeVideo 摄像头 AVMediaTypeAudio 麦克风
// 读取当前权限状态
AVAuthorizationStatus avStatus = [AVCaptureDevice authorizationStatusForMediaType:AVType];
// 根据当前状态作出对应的操作
switch (avStatus) {
case AVAuthorizationStatusNotDetermined:
NSLog(@"未决定的");
// 发出权限请求, 在未决定的时候发出请求系统才会弹出对话框,其它情况下发出下面的请求也不弹框,需要自己去指引用户设置
[AVCaptureDevice requestAccessForMediaType:AVType completionHandler:^(BOOL granted) {
if (granted) {
NSLog(@"用户同意使用");
}else{
NSLog(@"用户不同意使用");
}
}];
break;
case AVAuthorizationStatusRestricted: // 应该自己设置弹框引导用户去打开设置
NSLog(@"因其它原因被禁止的");
break;
case AVAuthorizationStatusDenied: // 应该自己设置弹框引导用户去打开设置
NSLog(@"用户拒绝的的");
break;
case AVAuthorizationStatusAuthorized: // 进行业务操作
NSLog(@"同意的");
break;
default:
break;
}
// 跳转到设置页面,只要请求过权限的,就会出现在这个页面,如果没有请求过的权限,这个页面是不会出现对应的权限设置的
NSURL * url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
if (success) {
NSLog(@"打开设置成功");
}
}];
}
相册
ios11 之后,刚开始访问相机的时候,系统默认可以进入,但会在选择中某一张相片的时候,进行权限的询问.
- NSPhotoLibraryUsageDescription
允许访问您的相册才能XXXXXXXXXX(描述准确)
#import <Photos/Photos.h>
// 查询当前状态
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
switch (status) {
case PHAuthorizationStatusNotDetermined:
NSLog(@"未决定的");
// 此处应发起请求
break;
case PHAuthorizationStatusRestricted:
NSLog(@"因其它原因被禁止的");
break;
case PHAuthorizationStatusDenied:
NSLog(@"用户拒绝的的");
break;
case PHAuthorizationStatusAuthorized:
NSLog(@"同意的");
break;
default:
break;
}
// 发起请求
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
switch (status) {
case PHAuthorizationStatusDenied:
NSLog(@"用户拒绝的的");
break;
case PHAuthorizationStatusAuthorized:
NSLog(@"同意的");
break;
default:
break;
}
}];
位置
位置在iOS11.4之前和之后有区别。
iOS11.4之前的描述
- NSLocationWhenInUseUsageDescription 使用期间获得权限的描述
对应请求:
[self.locationManager requestWhenInUseAuthorization];
- NSLocationAlwaysUsageDescription 未使用期间获得权限的描述
对应请求:
[self.locationManager requestAlwaysAuthorization];
以上描述和请求一一对应,互不干扰。根据需要进行描述和请求。在用户未决定之前,系统弹出的对话框是只有同意和不同意的选择。
iOS11.4后
如果只询问使用期间的权限(requestWhenInUseAuthorization),与之前版本相同。
如果需要询问是否可以获得未使用期间的权限( requestAlwaysAuthorization),则需要同时配置下面的两个描述:
- NSLocationWhenInUseUsageDescription 使用期间获得权限的描述
- NSLocationAlwaysAndWhenInUseUsageDescription 使用和未使用期间的权限描述
第二个描述,替代了之前版本关于未使用期间的描述。此时代码进行(requestAlwaysAuthorization)请求权限时,如果当前状态是用户未决定的,则系统会弹出对话框,而这个对话框会有三个选项:
1、仅在使用应用期间
2、始终允许
3、不允许
这也是为什么代码进行(requestAlwaysAuthorization)请求权限时,必须要同时有两种描述存在的原因。
注意
1、在第一次请求权限的时候,CLLocationManager 的实例对象应该被引用起来,否则对话框只会一闪而过。
2、通过CLLocationManager的delegate,我们可以从“授权回调”方法:
-(void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;中获得在用户点击询问“允许”还是“拒绝”时的结果。
#import <CoreLocation/CLLocationManager.h>
// 查询状态
CLAuthorizationStatus CLStatus = [CLLocationManager authorizationStatus];
switch (CLStatus) {
case kCLAuthorizationStatusNotDetermined:
NSLog(@"用户尚未选择决定的");
// 此处应发起请求
break;
case kCLAuthorizationStatusRestricted:
NSLog(@"其它原因被禁止的");
break;
case kCLAuthorizationStatusAuthorizedAlways:
NSLog(@"前台后台一直可以使用定位");
break;
case kCLAuthorizationStatusAuthorizedWhenInUse:
NSLog(@"试用期间可以定位");
break;
case kCLAuthorizationStatusDenied:
NSLog(@"用户拒绝定位服务");
break;
default:
break;
}
// 发起请求,实例对象要引用起来,防止询问对话框一闪消失
self.locationManager = [[CLLocationManager alloc] init];
//[self.locationManager requestWhenInUseAuthorization]; 请求使用期间的权限
// 请求始终允许获得定位的权限
[self.locationManager requestAlwaysAuthorization];
通讯录
- Contacts Usage Description
允许访问您的通讯录才能XXXXXXXXXX(描述准确)
// 查询当前状态
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
switch (status) {
case CNAuthorizationStatusNotDetermined: // 未确定的
{
// 进行权限请求
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError* _Nullable error) {
if (error) {
NSLog(@"授权失败");
}else {
NSLog(@"成功授权");
}
}];
}
break;
case CNAuthorizationStatusRestricted:
NSLog(@"其它原因被禁止的");
break;
case CNAuthorizationStatusDenied:
NSLog(@"用户拒绝的");
[self showAlertViewAboutNotAuthorAccessContact];
break;
case CNAuthorizationStatusAuthorized:
NSLog(@"用户同意的");
//有通讯录权限-- 进行下一步操作
break;
default:
break;
}