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

从UIDocumentPickerViewController获取的PDF存于Documents目录却不在Bundle

问题根源:混淆了App Bundle和Document Directory的本质区别

你遇到的问题其实是对iOS沙盒里的两个关键目录理解有误:

  • App Bundle:这是你的App安装时自带的资源目录,里面的文件是你开发时添加到项目中、编译打包时一起封装进去的。这个目录是只读的,运行时不能向里面写入文件,Bundle.main.url(...)只会在这个目录里查找资源。
  • Document Directory:这是App专门用来存储用户生成或导入的文件的可读写目录,属于沙盒的一部分,和Bundle是完全独立的两个区域。你之前的代码已经把Announcements.pdf成功写到了这里,但却跑去Bundle里找,自然会返回nil。

正确的解决方案:从Document Directory读取文件

你不需要去Bundle里找这个文件,直接从你之前保存的路径或者重新构建Document目录的URL来获取即可。比如可以这样修改你的检查代码:

// 方案1:直接用之前已经确认存在的finalFilePath
if let fileURL = finalFilePath {
    print("找到文件:\(fileURL)")
    // 在这里进行后续的文件操作,比如打开PDF
} 
// 方案2:如果finalFilePath失效,重新从Document Directory构建URL查找
else {
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let targetURL = documentsURL.appendingPathComponent("Announcements.pdf")
    
    if FileManager.default.fileExists(atPath: targetURL.path) {
        print("找到文件:\(targetURL)")
        finalFilePath = targetURL
        // 执行后续逻辑,比如加载PDF
    } else {
        print("文件不存在")
    }
}

补充说明

如果你希望Bundle.main.url(...)能找到某个PDF,那你需要在开发阶段就把它添加到Xcode项目中,并确保在Build Phases的Copy Bundle Resources列表里包含它——但这只适用于App自带的固定资源,完全不适合用户导入的动态文件。你现在的场景是用户导入文件,显然应该存在Document Directory里,所以从这里读取才是正确的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:46:20