許可權一般有三種狀態:未決定、明確地同意了、明確的拒絕了。
如果使用者未決定,可以去請求這個許可權,或者直接執行某些邏輯,這些邏輯在執行的時候系統會自動彈出請求許可權的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];
}複製程式碼