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

