起因
在iOS开发中我们经常会调用系统相机和麦克风,但是这些权限都是用户可以控制的,当APP没有权限调用这些手机资源,但是我们没有判断,直接去调用了,这样会出现问题。
麦克风权限
我在项目中开发IM的录音功能的时候,没有判断当前APP是否拥有响应的权限,导致录制失败(录制出来是0kb,长度也是0毫秒)。为此我在工具类中,添加了麦克风权限的判断方法,当用户去录音的时候,如果检测到没有响应的麦克风权限,则提示用户到手机的设置页面打开麦克风的权限,当用权限的时候直接录制就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| - (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的相机访问权限,则我录制视频的时候的预览页黑乎乎一片,什么也没有,同样没办法录制,这给用户的体验非常差,所以当我们调用系统资源的时候,一定要先判断是否拥有相应的权限。以下是我的判断相机权限的代码:
1 2 3 4 5 6 7 8 9 10
| - (BOOL)canRecordViedo { NSString *mediaType = AVMediaTypeVideo; AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType]; if (authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied){ return NO; } else { return YES; } }
|
相册权限
其实该权限不去判断也可以,因为当你没有相册权限而去调用本机相册的时候,系统默认会pop出一个提示的页面,提示用户,没有相册权限,去手机的设置页面设置该权限。系统的这个页面还是可以的(不丑),所以我就用了系统的提示页面了。但是我还是在工具类中实现了相册权限的判断,方便以后归类。
1 2 3 4 5 6 7 8 9
| - (BOOL)albumAuthority { ALAuthorizationStatus author = [ALAssetsLibrary authorizationStatus]; if (author == kCLAuthorizationStatusRestricted || author ==kCLAuthorizationStatusDenied){ return NO; } else { return YES; } }
|
定位权限
当用户用到定位的功能的时候,也涉及到权限的问题,我顺便也实现了该功能权限的判断:
1 2 3 4 5 6 7 8 9
| - (BOOL)locationAuthority { CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; if (kCLAuthorizationStatusDenied == status || kCLAuthorizationStatusRestricted == status) { return NO; } else { return YES; } }
|
总结
当我们调用系统资源的时候,一定要先判断是否拥有相应的权限,做到代码的严谨性。
号外
扫码关注下面二维码,干货不断: