权限一般有三种状态:未决定、明确地同意了、明确的拒绝了。
如果用户未决定,可以去请求这个权限,或者直接执行某些逻辑,这些逻辑在执行的时候系统会自动弹出请求权限的alert。
如果用户同意了,就可以顺利地做接下来的逻辑。
如果用户明确地拒绝了,这时就不能使用系统的方法去请求权限了,而是要引导用户去设置页面打开相关权限。
//去'设置'的代码
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
判断用户是否是否允许通知
+ (BOOL)cj_isUserAllowNotification {
return [[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
}
判断用户是否允许定位
+ (BOOL)cj_isUserAllowLocation {
return !([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied);
}
判断用户的麦克风权限
AVAudioSessionRecordPermissionUndetermined:表示用户未决定,执行 - (void)cj_requestPermissionForAudioWithAgreedHandle:(void(^)(void))handle 方法,可以弹出请求权限的alert框,并且处理用户同意之后的事情。
AVAudioSessionRecordPermissionDenied:表示用户已经明确地拒绝了,这个时候要引导用户去设置界面打开权限。
AVAudioSessionRecordPermissionGranted:表示用户已经同意了。
+ (AVAudioSessionRecordPermission)cj_askPermissionStatusForRecordAudio {
return [[AVAudioSession sharedInstance] recordPermission];
}
- 请求用户的麦克风权限
- (void)cj_requestPermissionForAudioWithAgreedHandle:(void(^)(void))handle
{
AVAudioSession* sharedSession = [AVAudioSession sharedInstance];
[sharedSession requestRecordPermission:^(BOOL granted) {
dispatch_sync(dispatch_get_main_queue(), ^{
//用户点击了允许
if (granted) {
if (handle) handle();
}
});
}];
}
判断用户的相册权限
PHAuthorizationStatusNotDetermined:表示用户还未决定,这个时候执行 - (void)cj_requestPermissionForPhotoLibraryWithAgreeHandle:(void(^)(void))handle 方法,可以弹出请求权限的alert框,并且处理用户同意之后的事情。
PHAuthorizationStatusAuthorized:表示用户已经同意,可以直接处理。 PHAuthorizationStatusDenied 或 PHAuthorizationStatusRestricted:表示用户已明确拒绝或没有权限(可能是家长控制),这时要引导用户去设置界面打开相册权限。
+ (PHAuthorizationStatus)cj_askPermissionStatusForPhotoLibrary {
return [PHPhotoLibrary authorizationStatus];
}
- 请求用户的相册权限
- (void)cj_requestPermissionForPhotoLibraryWithAgreeHandle:(void(^)(void))handle {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
//用户点击了允许
if (status == PHAuthorizationStatusAuthorized) {
if (handle) handle();
}
});
}];
}
判断用户的相机权限
AVAuthorizationStatusRestricted 或 AVAuthorizationStatusDenied:表示用户不同意使用。这个时候要引导用户去设置界面界面打开相机权限。
如果返回值不是上面两种请求,则说明用户未决定或者用户已经同意了,可以直接调用相机。如果用户是未同意,那么在调用相机的时候系统会自动弹出权限的请求框。
+ (AVAuthorizationStatus)cj_askPermissionStatusForCamera {
return [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
}