克魔助手
全部文章

iOS App 沙盒里存放了什么?

4 分钟阅读应用数据调试

每个 iOS App 都有一个沙盒:一棵只有它自己能读写、其他 App 无法访问的私有目录树。绝大多数「数据清不掉」「卸载重装后设置还在」「文件一夜之间消失」的问题,追查到最后都是数据放错了位置。

各个目录

Documents/:用户创建、丢失后会造成损失的内容。会备份到 iCloud 和电脑备份中。如果 App 做了声明,会出现在「文件」App 中。系统不会清理它。

Library/Application Support/:App 需要、但并非由用户直接创建的数据。会备份,系统不会清理。数据库应放在这里。

Library/Preferences/:UserDefaults 所在位置。会备份。只适合存放少量配置值,不应用于存储数据。

Library/Caches/:可重新生成的数据。不会备份。系统会在存储空间不足时清理它,且不会提前通知。下载的图片和接口响应适合放在这里;无法重新获取的数据则不应放在这里。

tmp/:临时空间。不会备份,清理频繁,可能在两次启动之间就被清空。任何需要在下一次运行时保留的数据都不应放在这里。

由此得出的规则

放在 Documents/ 中的缓存永远不会被清理。 如果用户反馈占用空间持续增长、清理缓存没有效果,请先确认缓存的实际位置。如果在 Documents/ 中,它实际上是一份被当作缓存的永久数据,而且还会被备份,导致用户的 iCloud 备份异常庞大。

放在 Caches/ 中的数据库可能会丢失。 这种情况不常发生,在测试期间更是从不出现,这正是该问题会进入生产环境的原因。它表现为「App 丢失了所有数据」,通常出现在存储空间紧张的设备上。

放在 tmp/ 中的内容随时可能被清除。 重启后从 tmp/ 继续的下载任务,有时会发现文件已经不存在了。

Documents/ 会被备份,因此应尽量控制其大小。 Documents/ 中 4 GB 的媒体缓存,会让用户的备份平白增加 4 GB,恢复设备也要多花一个小时。

直接查看沙盒

解决上述问题最快的方法是直接查看。通过受信任的 USB 连接,您可以浏览 App 的沙盒、解密导出其中保存的数据,并将文件下载到电脑。

这样,以下每个问题大约一分钟即可得到答案:

  • 缓存是否真的位于 Caches/,还是在某个永久目录中?
  • App 是否写入了新的响应,还是一直返回一个从未更新的旧响应?
  • 数据库文件的大小是否符合预期,还是某张表在持续增长却无人清理?
  • 迁移后的表结构是否与预期一致?
  • 下载的资源是否完整,还是被截断了?

否则,上面每一个问题都需要「添加日志,再发一个版本」才能回答。

复现用户的状态

这方面最有效的方法是:从用户设备导出其沙盒数据,导入到您自己设备上的同一个 App 中。这样,那个「只在某个账号上出现」的问题就能在您手边复现。

这也是最需要谨慎的操作,因此接下来的内容比前面的更重要。

这是用户的个人数据

App 沙盒中保存着聊天记录、照片、位置历史、令牌,以及该 App 存储的一切内容。导出这些数据不是一项没有后果的技术操作。

  • 只在您拥有或已获得明确授权检查的设备上操作。
  • 操作前告知设备所有者您要获取哪些数据以及原因。
  • 只获取足以回答问题的最小范围,例如单个文件,而非整个沙盒,除非确有必要。
  • 工单关闭后立即删除导出文件。存放在笔记本电脑上的沙盒导出文件,一旦设备丢失就会造成泄露。
  • 不要在未经处理的情况下将其作为附件上传到共享工单。

在这方面出问题的团队通常并无恶意,只是为了排查导出了一份数据,查完之后忘记了这个文件夹的存在。

补充:钥匙串不在沙盒中

凭证、令牌以及其他正确存储的敏感信息位于沙盒之外,不会随沙盒一起导出。如果您正在 Documents/ 中寻找会话令牌,要么它不在那里,要么这个 App 存在一个比您正在排查的问题更值得关注的安全隐患。