iOS 14.7.1系统如何获取相机权限?NSCameraUsageDescription配置失效怎么办
iOS 14.7.1 相机权限正确获取方式
- 首先排查Info.plist的权限声明:除了原有
NSCameraUsageDescription之外,如果你业务逻辑中存在相机拍照后直接写入系统相册的场景,必须补充添加NSPhotoLibraryAddUsageUsage,iOS 14.7.1对权限组合校验逻辑收紧,缺失该配置会触发隐性权限拒绝,不会弹出权限申请弹窗。 - 调整权限请求时序:iOS 14.7.1修复了权限请求并发调用的漏洞,禁止在
applicationDidFinishLaunchingWithOptions生命周期内直接请求相机权限,也禁止同时发起多个权限请求(比如同时请求相机+麦克风+相册权限),必须等待上一个权限请求回调完成后再发起下一个权限申请,相机权限请求必须放在视图控制器的viewDidAppear之后的生命周期触发,或者由用户主动点击操作触发。 - 权限状态校验逻辑补全:请求权限前必须先调用权限状态查询接口,仅当权限状态为未确定时才可以发起请求,如果状态为已拒绝/受限制,直接引导用户到系统设置页开启权限,不要重复发起请求,重复请求会被系统直接拦截返回拒绝。
- 排查后台模式配置:如果你的App启用了后台模式,禁止在后台状态下发起相机权限请求,iOS 14.7.1会直接拒绝后台发起的相机权限申请,且会记录异常请求行为,短时间内多次触发会导致一段时间内无法正常弹出权限申请弹窗。
示例代码(Swift)
import AVFoundation func requestCameraPermission(completion: @escaping (Bool) -> Void) { let status = AVCaptureDevice.authorizationStatus(for: .video) switch status { case .notDetermined: AVCaptureDevice.requestAccess(for: .video) { granted in DispatchQueue.main.async { completion(granted) } } case .authorized: completion(true) case .denied, .restricted: completion(false) // 此处可插入引导用户跳转系统设置的逻辑 @unknown default: completion(false) } }
示例代码(Objective-C)
#import <AVFoundation/AVFoundation.h> - (void)requestCameraPermissionWithCompletion:(void(^)(BOOL granted))completion { AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; if (status == AVAuthorizationStatusNotDetermined) { [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { dispatch_async(dispatch_get_main_queue(), ^{ if (completion) completion(granted); }); }]; } else if (status == AVAuthorizationStatusAuthorized) { if (completion) completion(YES); } else { if (completion) completion(NO); // 此处可插入引导用户跳转系统设置的逻辑 } }
注意:如果已经触发过多次异常权限请求导致弹窗无法弹出,可以先卸载App重启设备后重新安装测试,排除系统权限缓存的影响。
内容的提问来源于stack exchange,提问作者Paul Kamp
相关产品推荐
相关产品推荐

