使用DKImagePickerController时权限申请弹窗Info.plist描述重复显示问题
你遇到的两个问题同时包含代码逻辑问题和DKImagePickerController旧版本的已知bug,修复方案如下:
问题根因
- 现有权限申请逻辑存在重复调用唤起选择器的问题:相机权限和相册权限的授权回调中都单独调用了
showImgPicker(),如果两个权限均为未授权状态,两次授权通过后会先后两次唤起选择器,触发两次权限检查导致文案重复。 - DKImagePickerController默认开启自动权限检查,无论是否提前申请过权限,内部都会重新触发一次权限申请,旧版本(低于4.3.4)的库存在文案拼接错误,会把相机和相册两个权限的说明文案合并到同一个权限弹窗中展示。
修复步骤
- 修正权限申请逻辑,使用DispatchGroup统一管理两个权限的异步请求,仅在所有权限都通过后调用一次选择器
- 初始化DKImagePickerController时禁用内部自动权限检查,避免重复申请
- 若当前使用的库版本低于4.3.4,升级到最新稳定版即可解决内部文案拼接的bug
修复后代码示例
// 统一申请所需权限后再唤起选择器 func requestPermissionsAndShowPicker() { let dispatchGroup = DispatchGroup() var isCameraAllowed = false var isPhotoAllowed = false // 申请相机权限 dispatchGroup.enter() AVCaptureDevice.requestAccess(for: .video) { granted in isCameraAllowed = granted dispatchGroup.leave() } // 申请相册权限 dispatchGroup.enter() let photoStatus = PHPhotoLibrary.authorizationStatus() if photoStatus == .notDetermined { PHPhotoLibrary.requestAuthorization { status in isPhotoAllowed = status == .authorized dispatchGroup.leave() } } else { isPhotoAllowed = photoStatus == .authorized dispatchGroup.leave() } // 所有权限请求完成后再执行后续逻辑 dispatchGroup.notify(queue: .main) { if isCameraAllowed && isPhotoAllowed { self.showImgPicker() } else { self.showAlertForPermissions() } } } // 图片选择器初始化逻辑 func showImgPicker() { let picker = DKImagePickerController() // 禁用库内部自动权限检查,使用外部申请的权限结果 picker.forceDisablePermissionsCheck = true // 此处添加你自己的选择器配置,比如最大可选数量、资源类型等 present(picker, animated: true) }
内容的提问来源于stack exchange,提问作者Diksha Rattan
相关产品推荐
相关产品推荐

