iOS開發各種許可權問題(相機、錄音等)
阿新 • • 發佈:2019-02-07
起因
在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;
}
}
總結
當我們呼叫系統資源的時候,一定要先判斷是否擁有相應的許可權,做到程式碼的嚴謹性。