You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DKImagePickerController时权限申请弹窗Info.plist描述重复显示问题

你遇到的两个问题同时包含代码逻辑问题和DKImagePickerController旧版本的已知bug,修复方案如下:

问题根因

  1. 现有权限申请逻辑存在重复调用唤起选择器的问题:相机权限和相册权限的授权回调中都单独调用了showImgPicker(),如果两个权限均为未授权状态,两次授权通过后会先后两次唤起选择器,触发两次权限检查导致文案重复。
  2. DKImagePickerController默认开启自动权限检查,无论是否提前申请过权限,内部都会重新触发一次权限申请,旧版本(低于4.3.4)的库存在文案拼接错误,会把相机和相册两个权限的说明文案合并到同一个权限弹窗中展示。

修复步骤

  1. 修正权限申请逻辑,使用DispatchGroup统一管理两个权限的异步请求,仅在所有权限都通过后调用一次选择器
  2. 初始化DKImagePickerController时禁用内部自动权限检查,避免重复申请
  3. 若当前使用的库版本低于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:39:05