使用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
相关产品推荐
相关产品推荐

