如何复现UIDocumentUIPickerViewController的NSCocoaErrorDomain Code=260错误?
复现iOS 16+ UIDocumentPickerViewController崩溃的可行方案
问题背景
使用如下代码唤起文档选择器:
let documentPicker = UIDocumentPickerViewController( documentTypes: [String(kUTTypePDF), String(kUTTypeImage)], in: .import ) documentPicker.delegate = self documentPicker.modalPresentationStyle = .fullScreen present(documentPicker, animated: true, completion: nil)
正常流程下可在documentPicker(controller:url:)获取文件URL,但iOS16+用户出现崩溃,日志如下:
-[UIDocumentPickerViewController initForExportingURLs:asCopy:] must be called with a URL pointing to an existing file: Error Domain=NSCocoaErrorDomain Code=260 UserInfo (NSURL=file:///var/mobile/Containers/Data/Application/APP_ID/Documents/FILE.pdf, NSFilePath=/var/mobile/Containers/Data/Application/APP/Documents/FILE.pdf, (Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"))
可行复现方法
方法1:应用强制退出+未完成导入缓存
- 准备一个iCloud Drive中存储的1GB以上大文件(PDF/图片均可),确保文件已完整上传至iCloud
- 在iOS16+设备打开你的应用,唤起文档选择器并选中该大文件,等界面出现导入进度提示后,立刻从后台强制退出应用
- 重新打开应用,再次唤起文档选择器并选择同一个大文件,此时大概率触发崩溃——因为之前中断的导入缓存URL仍被引用,但对应本地文件已被系统清理
方法2:构造本地异常文件状态
- 打开iOS自带「文件」App,将一个iCloud中的文件移动到「我的iPhone」本地存储目录
- 在移动进度条显示时,立刻断开设备网络并强制退出「文件」App,让文件移动中断,出现“损坏/无法打开”状态
- 在你的应用中唤起文档选择器,选中这个状态异常的文件,文档选择器访问该URL时会因文件缺失触发崩溃
方法3:低网络环境中断文件下载
- 在iOS设置中开启「蜂窝网络」的低数据模式,并关闭Wi-Fi
- 在「文件」App中找到未下载到本地的iCloud文件(图标带云下载标识)
- 打开你的应用,唤起文档选择器并选中该文件,等下载/导入开始后立刻开启飞行模式中断网络
- 此时文档选择器尝试访问未完成下载的文件URL,会触发崩溃
核心触发逻辑
该崩溃本质是iOS16+的文档选择器会复用之前的文件缓存URL,但该URL对应的本地文件已被系统清理、移动或未完成写入,导致访问时触发“文件不存在”错误。
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

