Swift中解决文档选择器固件文件路径后台返回后失效问题
iOS后台返回后选中的固件文件路径失效问题解决
问题描述
通过文档选择器选中固件文件后,将文件路径保存到单例变量中,但应用进入后台再返回后,该路径下的文件显示不存在。
保存路径的代码:
let file = urls[0] do { let filePath = file.path self.firmwareLocalfilePath = filePath SessionController.sharedController.filePath = self.firmwareLocalfilePath
检查文件可用性的代码:if FileManager().fileExists(atPath: self.firmwareLocalfilePath!)
后台返回后报错:
File does not exist [/private/var/mobile/Containers/Data/Application/92D35520-C1E8-44DD-960E-B7024E8602E8/tmp/com.houston-radar.app-Inbox/dc300b04_v297.frm]
问题原因
- 临时目录文件会被系统清理:文档选择器的Inbox目录属于临时目录范畴,iOS系统会在应用进入后台、设备空闲或存储空间不足时自动清理该目录下的文件。
- 沙盒容器ID动态变化:iOS应用重启后,沙盒的容器ID(路径中的一串UUID)会改变,之前保存的旧路径自然失效。
- 直接存路径字符串不可靠:用
String存储文件路径,无法应对沙盒路径的动态变化,而用URL才是iOS推荐的文件位置存储方式。
解决方案
1. 复制文件到应用私有沙盒目录
不要直接使用文档选择器返回的临时文件路径,而是将选中的文件复制到应用自己的沙盒目录(比如Documents或Library),这些目录下的文件不会被系统随意清理,且沙盒ID变化时,通过系统API获取的URL能自动适配。
示例代码:
let selectedFileURL = urls[0] // 获取应用Documents目录的URL guard let documentsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { print("无法获取Documents目录") return } // 构造目标文件URL,保留原文件名 let destinationURL = documentsDir.appendingPathComponent(selectedFileURL.lastPathComponent) do { // 若目标文件已存在,先删除(可选,根据业务需求调整) if FileManager.default.fileExists(atPath: destinationURL.path) { try FileManager.default.removeItem(at: destinationURL) } // 复制文件到私有沙盒 try FileManager.default.copyItem(at: selectedFileURL, to: destinationURL) // 保存目标路径到单例(推荐直接保存URL而非字符串) SessionController.sharedController.fileURL = destinationURL // 如果仍需保存路径字符串: // SessionController.sharedController.filePath = destinationURL.path } catch { print("复制固件文件失败:\(error.localizedDescription)") }
2. 用URL而非字符串存储文件位置
将单例中的filePath(String类型)替换为fileURL(URL类型),后续检查文件存在时直接用URL判断:
// 检查文件存在 if FileManager.default.fileExists(atPath: SessionController.sharedController.fileURL.path) { // 文件存在,执行升级逻辑 }
关于UserDefaults的疑问
不能将文件路径或文件保存到UserDefaults:
- UserDefaults仅适合存储轻量、非敏感的配置数据(如开关状态、用户偏好设置),文件路径属于动态变化的内容,沙盒ID变化后旧路径完全失效。
- UserDefaults无法存储文件本身,也不适合存储大体积数据(固件文件通常体积较大),强行存储会导致性能问题或数据丢失。
内容的提问来源于stack exchange,提问作者Joice George
相关产品推荐
相关产品推荐

