iOS企业应用Documents目录下图片被自动删除问题咨询
嘿,这个问题我之前帮同行排查过类似的,刚好能给你梳理清楚问题根源和靠谱的解决办法!
问题根源分析
你遇到的iOS自动删除图片的情况,核心原因和苹果的文件系统规则直接相关:
Documents目录默认是会被iCloud/iTunes备份的,苹果系统会认为这个目录下的文件是用户需要持久保留的重要数据,但有个关键例外:如果系统检测到设备存储空间严重不足,对于那些已经完成备份、且判定为「可重新获取的大体积资源」(比如你这3GB的同步图片),系统会主动删除这些文件来释放空间——因为它默认你可以再次联网同步回来。- 你用SDWebImage默认将图片存在
Documents且没加「不备份标记」,刚好踩中了这个规则的触发条件。
具体解决方案
针对你的场景,有两个最直接的解决方向,选哪个可以根据你的业务需求来定:
方向1:把图片移到「缓存目录(Caches)」
这是苹果官方推荐的方案,因为Caches目录就是专门用来存放可重新获取的缓存资源的:
- 系统明确知道这个目录下的文件可以被删除,但只会在设备存储空间极度紧张时才动手,不会像
Documents那样因为备份优先级的问题主动清理; - 不需要额外加备份标记,SDWebImage也能很好适配这个目录。
代码实现(Objective-C)
// 获取SDWebImage的缓存配置 SDImageCacheConfig *cacheConfig = [SDImageCache sharedImageCache].config; // 获取系统Caches目录路径,建议加上自己的子目录避免和其他缓存冲突 NSString *cachesDir = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YourEnterpriseAppImageCache"]; // 修改SDWebImage的磁盘缓存路径 cacheConfig.diskCacheDirectory = cachesDir;
代码实现(Swift)
let cacheConfig = SDImageCache.shared.config if let cachesDir = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first { cacheConfig.diskCacheDirectory = cachesDir + "/YourEnterpriseAppImageCache" }
方向2:保留Documents目录,但添加「不备份标记」
如果因为业务需求必须把图片存在Documents,那一定要给这些文件加上NSURLIsExcludedFromBackupKey属性,告诉系统这些文件不需要备份,这样系统就不会因为备份优先级的问题主动删除它们。
简便实现(SDWebImage 5.x+)
SDWebImage从5.x版本开始内置了这个配置,直接开启即可:
SDImageCacheConfig *cacheConfig = [SDImageCache sharedImageCache].config; cacheConfig.shouldDisableiCloudBackup = YES;
let cacheConfig = SDImageCache.shared.config cacheConfig.shouldDisableiCloudBackup = true
手动实现(旧版SDWebImage)
如果你的SDWebImage版本较低,可以写个工具方法给文件加标记,然后在下载完成后调用:
- (void)addNoBackupFlagToFile:(NSString *)filePath { NSURL *fileURL = [NSURL fileURLWithPath:filePath]; NSError *error = nil; // 设置不备份属性 [fileURL setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:&error]; if (error) { NSLog(@"Failed to set no-backup flag: %@", error.localizedDescription); } }
你可以在SDWebImage的下载完成回调里,拿到图片的本地路径后调用这个方法,或者批量遍历Documents下的图片目录统一设置。
额外优化建议
为了避免用户再遇到类似困惑,还可以加个小优化:
- 监听设备剩余存储空间,当剩余空间低于阈值(比如5GB)时,给用户弹出提示,说明设备空间不足可能会影响图片缓存,建议清理空间或选择性同步图片;
- 可以用
NSFileManager获取剩余空间,或者监听UIApplicationDidReceiveMemoryWarningNotification通知做相应处理。
内容的提问来源于stack exchange,提问作者skJosh
相关产品推荐
相关产品推荐

