獲取相冊權限,網上的寫法,大多都感覺有點問題,不是特別完美.
方案1: 直接給了返回值, 那對於PHAuthorizationStatusNotDetermined這種的,後面可能權限給了不允許, 然後還去調保存相冊就會出問題. 這種方案不通過.
+ (BOOL)hasPermissionForPhotoGallery {
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied) {
return NO;
}
return YES;
}
方案2: 加了信號量,用信號量阻塞線程,當用戶做了決定之後再返回. 看上去是沒有問題的, 但是在使用的過程中發現了線程卡死.
第一次的時候 , 系統請求權限的彈框遲遲不出來,點擊屏幕沒有響應,之後推出一次後臺,權限的彈窗纔出現,同意/不同意 權限之後,才能解除死鎖,不通過
+ (BOOL)isCanVisitPhotoLibrary {
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusAuthorized) {
return YES;
}
if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied) {
return NO;
}
__block BOOL isAblity = YES;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status != PHAuthorizationStatusAuthorized) {
NSLog(@"未開啓相冊權限,請到設置中開啓");
isAblity = NO;
dispatch_semaphore_signal(semaphore);
}
}];
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return isAblity;
}
最終結果,由於PHAuthorizationStatusNotDetermined 這種的肯定是異步的給出結果,所以只能以異步對抗異步(用魔法打敗魔法) , 所以結果只能在block中給出, 就變成了下面的這樣,不會造成死鎖,block中的結果肯定正確.
其他的相機,麥克風權限的獲取也可以按照類似的方式
//MARK:相冊權限檢測
+ (void)isCanVisitPhotoLibrary:(void(^)(BOOL))result {
/// 獲取當前的狀態
//+ (PHAuthorizationStatus)authorizationStatus;
/// 請求權限
//+ (void)requestAuthorization:(void(^)(PHAuthorizationStatus status))handler;
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusAuthorized) {
result(YES);
return;
}
if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied) {
result(NO);
return ;
}
if (status == PHAuthorizationStatusNotDetermined) {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
// 回調是在子線程的
NSLog(@"%@",[NSThread currentThread]);
dispatch_async(dispatch_get_main_queue(), ^{
if (status != PHAuthorizationStatusAuthorized) {
NSLog(@"未開啓相冊權限,請到設置中開啓");
result(NO);
return ;
}
result(YES);
});
}];
}
}