前言
第一份正儿八经的实习工作--iOS开发。入职第一周,任务是研究一下iOS文件管理相关内容。文件的读写在iOS开发中用到的十分广泛,但是很多情况下开发者没有搞清楚应该如何在本地管理这些文件,以及特定的文件到底应该存储在哪。本文将参考官方文档和网上收集的博客做一个关于iOS文件系统的整理。
沙盒机制(sandbox)
iOS app 文件系统都被限制在app本身的沙盒(sandbox),所以一个app(一般来说)无法访问它自身container之外的文件。有一些例外会让app用公共的系统接口去访问外部文件,比如照片、联系人、音乐等。但那些操作由system frameworks掌控。
在安装一个app时,会创建很多的容器(containers),每一个容器扮演不同的角色。主要分为:
- Bundle Container
- Data Container
- iCloud Container
目录介绍
1. AppName.app 目录:
- 这是应用程序的程序包目录(app's bundle)。
- 该目录包含了应用程序本身的数据,包括资源文件和可执行文件等。
- 整个目录是只读的,可以访问存在app's bundel中的资源文件,不能写入这个目录。
- 这个目录的内容不会被iTunes备份,但是第一次从App Store购买的app会在iTunes执行同步。
2. Documents/:
- 这个目录用于存储所有用户产生的内容。
- (仅限于不可再生的文件,可再生的放在Library/Cache目录下)。
- 这个目录可用于文件分享,因此这个目录应该只包含希望给用户看到的文件。
- 这个目录下的内容会被iTunes备份。
3. Documents/Inbox:
- 该目录保存你的app由外部应用请求打开当前应用的文件。
- (比如我们的应用叫A,向系统注册了几种可打开的文件格式,B应用有一个A支持的格式的文件F,并且申请调用A打开F。由于F当前是在B应用的沙盒中,我们知道,沙盒机制是不允许A访问B沙盒中的文件,因此苹果的解决方案是讲F拷贝一份到A应用的Documents/Inbox目录下,再让A打开F。 )
- 你的app可以读取或者删除在这个目录下的文件,但是不能创建新文件或者写入已经存在的文件中。
- 如果用户想要编辑这个目录下的文件,你的app要在作出任何改变前移出这个目录。
- 这个目录下的内容被iTunes备份。
4. Library/ :
- 这是对于不是用户数据文件的顶层目录,通常将文件放在子目录下。
- iOS apps 经常用 Application support 和 Caches子目录。
- 你可以创建子目录,用library子目录存不想暴露给用户的文件。
- Library目录(除了Caches子目录)被iTunes备份。
- 这个目录下默认有两个子目录:Library/Caches 和 Libaray/Preferences
Library/Preferences:
包含应用程序的偏好设置文件。(您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类直接存在Library/Preferences目录下 plist中.)
Library/Caches :
主要是缓存文件,用户使用过程中缓存都可以保存在这个目录中。这个目录就用于保存那些可再生的文件,比如网络请求的数据。注意,应用程序通常还需要负责删除这些文件。
5. tmp/:
- 这个目录用于存放临时文件。保存应用程序再次启动过程中不需要的信息。
- app需要删除这些文件当他们不再需要的时候
- 系统也可能净化这个目录,当app不再运行的时候。
总结
为了防止同步或者备份时间太长或者占用太大存储空间,应该选择合适的文件存储的目录。
- Put user data in
Documents/
. 包括任何需要暴露给用户的文件,用户可以创建,导入,删除修改这些文件。 - put app-created support files in the Library/Application support/ 这个目录包含app运行需要的文件,但是这些文件又需要对用户隐藏。 这个目录也可以包括,data files, configuration files, templates and modified versions of resources loaded from the app bundle.
- 记住 Documents/ 和 Application Support/会默认被备份。可以用
[NSURL setResourceValue:forKey:error:]
using theNSURLIsExcludedFromBackupKey
key 防止文件被备份。任何可以被再次创建或者再次下载的文件不应该被备份。特别是大的多媒体文件,不应该被备份。 - put temporary data in the tmp/ directory. 记住删除这些文件当你使用完,可以节省用户的空间。
- put data cache files in the Library/Caches/ directory. Cache可以比temporary data长,但是比support file短。cache data 并不强制,但是通常使用cache为了提高performance。 例如:database cache file and transient, downloadable content. 注意系统可能会删除Caches/ directory to free up disk space.