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

使用PHPickerViewController调用loadFileRepresentation报257权限错误

问题根因

Could not create a bookmark: NSError: Cocoa 257 "The file couldn’t be opened because you don’t have permission to view it

该错误本质是NSItemProvider返回的沙盒安全域URL默认只有临时访问权限,未主动申请安全访问就直接读取文件会触发权限拦截报错。

解决步骤
  • 读取URL内容前,先调用url.startAccessingSecurityScopedResource()申请临时访问权限,确认返回true后再操作文件
  • 操作完成后必须配对调用url.stopAccessingSecurityScopedResource()释放权限,避免内存泄漏
  • 移除强制解包、强制try的写法,补充错误兼容逻辑,避免异常崩溃
修正后代码
private func getPhoto(from itemProvider: NSItemProvider) {
    print(itemProvider.registeredTypeIdentifiers)
    itemProvider.loadFileRepresentation(forTypeIdentifier: UTType.image.identifier) { url, error  in
        // 前置错误处理
        if let error = error {
            print("Encountered Error in loadFileRepresentation \(error.localizedDescription)")
            return
        }
        guard let url = url else {
            print("Could not obtain url")
            return
        }
        print("Obtained url: \(url)")
        
        // 申请安全域访问权限
        guard url.startAccessingSecurityScopedResource() else {
            print("无法获取文件访问权限")
            return
        }
        // 确保无论逻辑是否抛出异常都能释放权限
        defer {
            url.stopAccessingSecurityScopedResource()
        }
        
        do {
            let imageData = try Data(contentsOf: url)
            guard let image = UIImage(data: imageData) else {
                print("图片数据解析失败")
                return
            }
            DispatchQueue.main.async {
                self.parent.mediaItems.append(item: PhotoPickerItem(with: image))
            }
        } catch {
            print("读取图片数据失败: \(error.localizedDescription)")
        }
    }
}
额外排查点

如果修改后问题依然存在,可确认以下配置:

  • PHPicker本身不需要申请相册权限,不要在info.plist中额外添加NSPhotoLibraryUsageDescription配置,多余的权限申请反而可能触发系统权限拦截
  • 确认调试设备的iCloud照片没有开启「优化iPhone存储空间」,如果选中的图片仅存储在云端未本地缓存,也可能出现读取失败,可切换为本地全量存储的相册验证

内容的提问来源于stack exchange,提问作者Pradyot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:24:03