一个 App 与文件系统的交互完全限制在 app's sandbox directory
中,具体目录结构如下。注意沙盒并不是 Data Container
而是包括 Bundle Container
等一系列目录,这些目录将一个 App 限制在一定的范围内。
图 1 - 沙盒目录
常用目录解释
Bundle Container
Bundle Container 下就是 App 本身。
APPName.app
模拟器下的目录:
1 | /Users/qiweipeng/Library/Developer/CoreSimulator/Devices/1679AE2F-140F-400A-B21E-DF9A94CE842E/data/Containers/Bundle/Application/76D971A9-3397-4814-A043-80EA68438B78/Demo.app |
其中,Demo.app
上一级目录,即 76D971A9-3397-4814-A043-80EA68438B78
每次 App 运行都会改变(具体可以观察那个文件夹,每次 command + R
的时候,那个文件夹名就会变一下),这是为了安全考虑。
这个目录包含应用和它的所有资源,只可以读取,无法修改和写入。不会被备份。
Data Container
图 2 - 模拟器下的 Data Container
这些目录中:
- Documents 文件夹和 Library 文件夹(但是除了 Caches 文件夹)会被 iTunes 或者 iCloud 备份;
- tmp 文件夹中的数据当程序关闭就会被清除;
- Caches 文件夹当手机空间不足时候很可能就会被清空;
Documents
这个目录存储用户生成的内容,应该并且只应该把希望暴露给用户的文件放在这里,如软件的备份文件,用户可以访问并可以转存。或者如 Mindnode
中的每个思维导图的文件,这是用户生成的也是用户希望可以自己看到并掌控的文件。
这个目录会被 iTunes 或者 iCloud 备份,因此不会丢失。
Library
这个目录放的应该是非用户的数据,用户不需要看到。这个目录中除了 Caches
目录的其他目录会被 iTunes 或者 iCloud 备份。
Preference:
- 这里面应该存放应用的偏好设置,比如某个按钮的开关状态,这是不会被删除且会被备份的;
Caches:
- 这里存放缓存数据,比如网络加载的图片等;
- 缓存数据在 iOS 5.0 以后,只有当手机空间不足的时候,系统才会主动去清理,并且当应用运行的时候一定不会清理;
tmp
这了的文件是应用运行过程中的临时文件,当应用程序不再运行的时候系统就会删除这里的文件。这个目录不会被备份。
路径的获取方式
1 | // 1. 获取 App 包路径 |