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;
    }
}


总结


当我们调用系统资源的时候,一定要先判断是否拥有相应的权限,做到代码的严谨性。




你可能感兴趣的:(OC,IOS)