ImagePicker报com.apple.accounts Code=7错误 有权限却无法加载图片
com.apple.accounts Code=7错误排查方案 报错特征:
PHPhotoLibrary.requestAuthorization返回authorized状态,可正常获取相册和asset列表,但无法加载图片资源,触发报错:Error returned from daemon: Error Domain=com.apple.accounts Code=7 "(null)"
按优先级逐一排查解决
修复权限接口版本兼容问题
iOS14之后新增了「仅允许选中部分照片」的limited权限状态,如果你用的是iOS14之前的老权限API,会把limited状态误识别为authorized,当你加载未被用户授权的asset时,就会触发账户守护进程的权限拒绝错误。
适配方案:最低支持iOS14的项目必须替换为新API查询权限:PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in // 注意区分limited、authorized、denied三种状态 }如果是
limited状态,要么引导用户开启完整相册访问权限,要么适配系统提供的有限照片选择逻辑。修复iCloud资源加载参数配置
能拿到asset列表不代表图片资源存储在本地,iCloud云端同步的资源如果加载参数配置错误,会触发iCloud鉴权失败抛错。使用PHImageManager加载图片时必须正确配置options:let imageOptions = PHImageRequestOptions() imageOptions.isNetworkAccessAllowed = true // 核心配置:允许从iCloud下载云端资源 imageOptions.isSynchronous = false imageOptions.deliveryMode = .highQualityFormat imageOptions.progressHandler = { progress, error, stop, info in // 可以在这里加iCloud下载进度回调,方便排查 }未开启
isNetworkAccessAllowed时,系统不会主动拉取iCloud资源,也不会返回明确的iCloud错误提示,只会抛出accounts域的Code=7错误。校验Photos框架调用线程
所有Photos相关操作(权限请求、资源查询、图片加载)必须在主线程发起,子线程调用会导致系统账户守护进程鉴权失败,触发daemon返回的报错。校验权限配置文件与能力项
- 确认Info.plist中添加了完整的相册权限字段:
NSPhotoLibraryUsageDescription,如果涉及相册写入操作还要添加NSPhotoLibraryAddUsageDescription - 如果项目开启了iCloud能力,确认Signing&Capabilities中勾选了iCloud对应的Photos选项;不需要iCloud能力的话不要随意开启相关配置,避免触发额外的iCloud账户鉴权。
- 确认Info.plist中添加了完整的相册权限字段:
清理异常缓存验证
如果是模拟器调试,直接执行「重置内容和设置」,卸载重装App重新申请权限;真机调试的话删除App、重启手机后重新安装,清除旧版本遗留的权限脏缓存。
验证方法
优先选择本地存储(非iCloud同步)的图片做加载测试,如果可以正常加载,说明问题出在iCloud参数配置或者limited权限适配环节。
内容的提问来源于stack exchange,提问作者ldo1985

