1. 程式人生 > >iOS開發各種許可權問題(相機、錄音等)

iOS開發各種許可權問題(相機、錄音等)

起因

在iOS開發中我們經常會呼叫系統相機和麥克風,但是這些許可權都是使用者可以控制的,當APP沒有許可權呼叫這些手機資源,但是我們沒有判斷,直接去呼叫了,這樣會出現問題。

麥克風許可權

我在專案中開發IM的錄音功能的時候,沒有判斷當前APP是否擁有響應的許可權,導致錄製失敗(錄製出來是0kb,長度也是0毫秒)。為此我在工具類中,添加了麥克風許可權的判斷方法,當用戶去錄音的時候,如果檢測到沒有響應的麥克風許可權,則提示使用者到手機的設定頁面開啟麥克風的許可權,當用許可權的時候直接錄製就可以了。

- (BOOL)canRecord
{
    __block BOOL bCanRecord = YES;
    if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending)
    {
        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
        if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {
            [audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
                bCanRecord = granted;
            }];
        }
    }
    return bCanRecord;
}

相機許可權

同樣在開發IM的小視屏(和微信小視屏一樣)功能的時候也遇到了同樣的問題,在沒有判斷相機許可權的前提下,我手動關掉了APP的相機訪問許可權,則我錄製視訊的時候的預覽頁黑乎乎一片,什麼也沒有,同樣沒辦法錄製,這給使用者的體驗非常差,所以當我們呼叫系統資源的時候,一定要先判斷是否擁有相應的許可權。以下是我的判斷相機許可權的程式碼:

- (BOOL)canRecordViedo
{
    NSString *mediaType = AVMediaTypeVideo;
    AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
    if (authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied){
        return NO;
    } else {
        return YES;
    }
}

相簿許可權

其實該許可權不去判斷也可以,因為當你沒有相簿許可權而去呼叫本機相簿的時候,系統預設會pop出一個提示的頁面,提示使用者,沒有相簿許可權,去手機的設定頁面設定該許可權。系統的這個頁面還是可以的(不醜),所以我就用了系統的提示頁面了。但是我還是在工具類中實現了相簿許可權的判斷,方便以後歸類。

- (BOOL)albumAuthority
{
    ALAuthorizationStatus author = [ALAssetsLibrary authorizationStatus];
    if (author == kCLAuthorizationStatusRestricted || author ==kCLAuthorizationStatusDenied){
        return NO;
    } else {
        return YES;
    }
}

定位許可權

當用戶用到定位的功能的時候,也涉及到許可權的問題,我順便也實現了該功能許可權的判斷:

- (BOOL)locationAuthority
{
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
    if (kCLAuthorizationStatusDenied == status || kCLAuthorizationStatusRestricted == status) {
        return NO;
    } else {
        return YES;
    }
}


總結

當我們呼叫系統資源的時候,一定要先判斷是否擁有相應的許可權,做到程式碼的嚴謹性。