简介
在日常 iOS 开发中,我们都会接触到数据持久化接口,如用于保存用户偏好数据的 NSUserDefaults
,增删文件的 FileManager
,以及操作结构化数据的数据库技术 Core Data。这些数据在本地的保存都是按照 iOS 的文件系统的规则存放在对应的目录中。这篇文章目的是记录我在阅读完苹果文档后得到的一些要点概要。
沙盒文件系统
每一个 app 都有各自独立的沙盒(sandbox)容器,容纳了 app bundle、数据储存容器以及 icloud 储存容器。这样设计的好处是安全:既可以隔绝其他 app 非法读写自己的数据,也防止了自己的文件操作对系统其他地方有干涉。
app 的文件系统结构
既然沙盒里面也做了不同目录的功能分类,下面来简明了解下各自的作用:
MyApp.app
就是平时编译打包出来的 app bundle,包括 app 的可执行文件以及运行所需的资源文件。在运行时,我们不能对此目录进行写入。苹果在安装 app 时会对 bundle 进行签名,之后每次启动 app 时会先验证签名,如果验证失败就无法启动。因为写入操作会改变签名,因此写入后 app 就无法再启动。
Documents/
会被 iCloud 同步或 iTunes 备份的目录。苹果建议这个目录用来存放能够暴露给用户的文件——用户在使用 app 过程中可以创建和修改的文件。例如绘图应用里用户创建的画板文件,日志应用里创建的文档。
另外,系统还可能生成 Documents/Inbox/ 目录,用于保存来自其他 app 或者 UIDocumentInteractionController
打开的文件。例如邮件附件,如果你的 app 可以处理附件的文件格式,
打开附件时就会被复制到 Documents/Inbox/ 下。要注意的是,用户可以读取或者删除此目录下的文件,但不可以修改或者创建。因此如果用户需要修改,需要先行把文件复制到其他可行的目录下。
Library/
同样是会被 iCloud 同步或 iTunes 备份的目录(除了 Caches 子目录)。区别在于苹果建议这个目录存放那些用于支持应用运行而同时不应该暴露给用户的文件。根据用途,苹果建议放在不同子目录下:
Library/Application Support/
存放支撑 app 正常功能模块运作的文件,如运行日志,配置文件,模板,bundle 或 Documents/Inbox/ 修改过的文件等。苹果建议使用公司或应用的倒写域名作为子文件夹存放资料。
Library/Caches/
存放 app 的暂存文件。这个目录的文件不会被 iCloud 同步或 iTunes 备份,适合存放可以从服务器上重新下载的数据,如音乐应用的本地歌曲储存。要注意的是,在设备还原时,系统会清空此目录;而在设备储存容量不足时,系统在少数情况里,在 app 没运行的情况下删除此目录。
Library/Preferences/
存放 app 的偏好文件,默认情况下是使用 NSUserDefaults
产生的 plist 文件。app 不应该自行在此目录下创建文件,而应该通过 NSUserDefaults
来读写偏好。
tmp/
用来存放生命周期更短的临时文件。系统在 app 进程被停掉时很有可能会清空目录,因此只适合用来存放只在 app 当前运行进程下用到的文件。显然,此目录不会被 iCloud 同步或 iTunes 备份。
后记
笔记很简略,但可以用作对文档所述要点的归纳整理。对系统默认目录的特性了解,有利于在开发过程中需要进行数据持久化时心中有数,做出合理的决定。
网友评论