ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

iOS 沙盒机制+持久化

iOS 沙盒机制+持久化 iOS 沙盒机制 三大目录职责 FileManager一、沙盒基础iOS 每个App独立沙盒App只能访问自己沙盒不能跨App访问App重装会清空沙盒。 沙盒根目录下常用3个文件夹Documents、Library、tmp1. Documents获取方式FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first✅ 用途持久化用户业务数据用户产生的数据、可备份的业务文件本地数据库、下载的文档备份策略iCloud/iTunes 默认会备份注意不要放缓存、临时文件大文件如果不需要备份要设置isExcludedFromBackupKey排除备份适合本地sqlite、用户保存的文件、离线资源业务数据类2. LibraryLibrary下面有两个最常用子文件夹Caches、PreferencesLibrary ├─ Caches └─ PreferencesLibrary/Caches获取FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first✅ 用途缓存文件网络图片、接口缓存、可重新下载的资源备份iCloud不自动备份系统行为磁盘空间不足时系统会自动删除Caches下文件特点可以重建删掉不影响App核心功能Library/Preferences存放UserDefaults数据不要手动用FileManager读写这个目录由NSUserDefaults自动维护你写UserDefaults.standard系统底层会在Library/Preferences/生成一个bundleID.plist文件。 所有UserDefaults的键值对序列化保存在这个 plist。✅ 抖音示例自动播放开关深色 / 浅色模式通知推送开关上次浏览的简单配置标记小体积布尔、字符串、数字这类轻量配置3. tmp临时目录获取NSTemporaryDirectory()✅ 用途临时文件用完就删比如解压临时包、上传临时文件备份不备份系统行为App不在运行、磁盘紧张时系统随时自动清理tmp规范业务用完自己主动删除不要依赖系统帮你清理目录备份(iCloud)系统自动清理适用场景Documents✅备份❌不会清理用户持久业务数据Library/Caches❌不备份✅磁盘不足会删缓存、可重建资源tmp❌不备份✅随时清理短期临时文件二、FileManager 常用文件操作SwiftFileManager.default是单例1. 获取目录路径示例// Documents let docUrl FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! // Caches let cacheUrl FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first! // tmp let tmpUrl URL(fileURLWithPath: NSTemporaryDirectory())2. 判断文件是否存在let fileExists FileManager.default.fileExists(atPath: filePath)3. 创建文件夹let folderUrl docUrl.appendingPathComponent(customFolder) try FileManager.default.createDirectory(at: folderUrl, withIntermediateDirectories: true, attributes: nil) // withIntermediateDirectories true 自动创建中间多级目录4. 写入文件let text hello sandbox let fileUrl docUrl.appendingPathComponent(test.txt) try text.write(to: fileUrl, atomically: true, encoding: .utf8) // atomically:true 先写临时文件写完再替换防止中途崩溃文件损坏5. 读取文件let content try String(contentsOf: fileUrl, encoding: .utf8)6. 删除文件try FileManager.default.removeItem(at: fileUrl)7. 拷贝 / 移动文件// 拷贝 try FileManager.default.copyItem(at: sourceUrl, to: destUrl) // 移动剪切 try FileManager.default.moveItem(at: sourceUrl, to: destUrl)8. 遍历目录下所有文件let contents try FileManager.default.contentsOfDirectory(at: docUrl, includingPropertiesForKeys: nil, options: [.skipsHiddenFiles])三、高频坑点不要在Documents放大量缓存iCloud备份会增大备份包审核可能被拒大文件记得关闭备份// 关闭文件iCloud备份 try url.setResourceValue(true, forKey: .isExcludedFromBackupKey)Caches目录不能放核心数据系统随时删丢数据会出bugtmp不要长期存数据App杀进程后文件可能消失FileManager所有磁盘操作会抛异常必须try-catch不要强制try!生产建议do-catch捕获错误区分path(字符串路径) 和URL(推荐苹果新API优先URL)四、一句话总结口述版iOS沙盒每个App独立隔离Documents放需要iCloud备份的用户持久业务数据Library/Caches放可重建缓存iCloud不备份磁盘紧张系统自动清理tmp存放临时文件系统随时清理。 FileManager用来做沙盒里文件/文件夹增删改查开发优先使用URL接口所有IO操作要做异常捕获。
返回列表