iOS 正確的獲取相冊權限

獲取相冊權限,網上的寫法,大多都感覺有點問題,不是特別完美. 

方案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);
            });
  
        }];
    }
    
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章