SwiftUI滤镜APP用UIImagePickerController后Documents & Data过大如何排查优化
存储空间定位调试流程
- 导出APP沙盒容器排查大文件
打开Xcode顶部菜单栏Window > Devices and Simulators,连接测试设备后找到对应应用,点击「下载容器」保存到本地,右键xcappdata文件选择「显示包内容」,即可直接查看Documents、Library、tmp三个目录的文件大小分布,快速定位大文件所在目录。 - 重点排查tmp目录残留
UIImagePickerController拍摄/选取的原始资源会先写入当前应用的tmp目录临时存储,如果你处理完图片后没有主动删除该临时文件,这部分内容会长期留存,大部分未做主动清理的图片类APP的异常占用都来源于此。 - 排查本地数据库二进制存储
如果你使用Core Data、Realm等本地数据库存储编辑记录、滤镜参数,注意是否无意中将图片的Data数据存入了数据库,二进制资源存数据库会被计入Documents&Data统计,且很难被主动清理。 - 排查系统默认缓存占用
就算你未自己实现缓存逻辑,URLSession的默认网络缓存、图片加载框架的缓存、第三方滤镜库生成的临时处理文件都会存储在Library/Caches目录,这部分也会被计入苹果系统统计的Documents&Data占用。
降低占用的解决方案
- 及时清理临时文件
每次完成图片编辑流程后,主动删除UIImagePickerController生成的临时文件,也可以在应用启动时统一清理所有超过24小时的tmp目录文件,参考代码:func clearExpiredTmpFiles() { let tmpDir = FileManager.default.temporaryDirectory let expiredThreshold = Date().addingTimeInterval(-24 * 3600) guard let fileList = try? FileManager.default.contentsOfDirectory( at: tmpDir, includingPropertiesForKeys: [.creationDateKey], options: .skipsHiddenFiles ) else { return } for fileURL in fileList { guard let createDate = try? fileURL.resourceValues(forKeys: [.creationDateKey]).creationDate, createDate < expiredThreshold else { continue } try? FileManager.default.removeItem(at: fileURL) } } - 避免重复存储图片资源
不要把全分辨率的图片写入沙盒的Documents目录,仅存储用户编辑的滤镜参数、对应原始图片的PHAsset本地标识符即可,下次需要编辑时再从系统相册读取原始资源,避免同一张图片在系统相册和APP沙盒各存一份。 - 限制缓存目录上限
主动设置网络缓存、图片缓存的最大容量,建议设置为50-100MB,超过上限时自动清理最早生成的缓存文件,也可以在用户触发清理缓存功能时直接清空整个Library/Caches目录。 - 禁止在UserDefaults中存储二进制数据
确认没有将缩略图、编辑快照等图片的Data数据存入UserDefaults,UserDefaults是用于存储小体量配置项的,存储二进制数据会导致plist文件体积异常膨胀,且无法被系统自动清理。
内容的提问来源于stack exchange,提问作者Ataman
相关产品推荐
相关产品推荐

