iOS设置应用的Documents & Data是否会显示错误的存储占用数据?
问题解答
一、遗漏的排查点
- 全量扫描关联的所有App Group共享容器:除了你主动使用的Shared Group Container,还要确认依赖的第三方SDK自动注册的App Group容器,比如推送、统计类SDK常会申请独立共享容器存储数据,这部分占用不会默认计入你主动查询的单个共享容器大小
- 排查系统生成的专属文件:通过Xcode下载的应用容器不会包含三类系统生成文件:应用崩溃日志堆栈缓存、权限相关持久化配置文件、开启iCloud同步后的本地镜像缓存,这三类都会被计入Documents & Data
- 核对稀疏文件/磁盘块占用偏差:Xcode下载容器时会自动解压缩、去除稀疏文件标记,部分被系统标记为可清除的缓存文件不会被完整下载到本地,Mac上统计的是文件逻辑大小,不是磁盘实际块占用大小
- 排查旧版本残留文件:测试设备上反复安装不同版本应用时,系统未清理干净的旧版本Documents、Caches目录残留会被合并计入当前应用的Documents & Data
二、系统计算Documents & Data的规则
iOS系统统计的Documents & Data不是仅包含应用沙盒内的用户生成文件,完整统计范围如下:
应用沙盒内除
Bundle目录(即应用安装包本身)之外的所有目录占用 + 所有关联App Group共享容器的全量占用 + 系统为该应用生成的专属缓存/日志/权限配置文件占用 + 开启iCloud同步后的本地镜像缓存占用 + 应用生成的剪贴板/拖拽互操作临时缓存占用
- 统计时按磁盘块实际占用计算,不是文件逻辑大小,比如1KB的文件占用4KB磁盘块时会按4KB统计
- 系统标记为可清除的
purgeable缓存文件,在磁盘空间充足时会被全额计入,空间不足自动清理后才会扣除 - 被
NSURLIsExcludedFromBackupKey标记的文件仍会被计入Documents & Data,仅不会被iCloud备份
三、定位额外空间占用来源的方法
- 直接在设备端查看容器大小:打开Xcode的
Window>Devices and Simulators,选中对应设备和应用后点击Show Container,直接统计设备端实时容器大小,不要下载到本地后再统计 - 嵌入运行时遍历代码:在应用内添加目录递归统计逻辑,遍历所有沙盒目录和关联App Group容器,统计每个文件的实际磁盘占用,示例代码片段:
// 计算路径的实际磁盘占用 + (unsigned long long)diskUsageAtPath:(NSString *)path { NSFileManager *fm = [NSFileManager defaultManager]; BOOL isDir = NO; if (![fm fileExistsAtPath:path isDirectory:&isDir]) return 0; if (!isDir) { NSDictionary *attr = [fm attributesOfItemAtPath:path error:nil]; return attr.fileSystemFileSize ? attr.fileSystemFileSize : attr.fileSize; } unsigned long long total = 0; NSDirectoryEnumerator *enumerator = [fm enumeratorAtPath:path]; for (NSString *subpath in enumerator) { NSString *fullPath = [path stringByAppendingPathComponent:subpath]; NSDictionary *attr = [fm attributesOfItemAtPath:fullPath error:nil]; total += attr.fileSystemFileSize ? attr.fileSystemFileSize : attr.fileSize; } return total; }
- 重置对比测试:在测试设备上删除应用后重新安装,对比安装前后的Documents & Data大小变化,确认是否为旧版本残留文件导致的偏差
内容的提问来源于stack exchange,提问作者Sam J.
相关产品推荐
相关产品推荐

