2012年6月13日星期三

再看看iOS应用程序的目录系统

安装一个iOS程序程序时,安装程序代码创建一个应用程序的主目录,该目录中的应用程序,并创建其他一些关键的目录。每个iOS应用程序被限制只能操作自身主目录下的文件。一个应用程序通常禁止在其主目录之外的目录访问或创建文件,只能通过系统接口来访问一些外部内容(如联系人、音乐、图片等)。


iOS程序主目录下有下面几个标准目录

<Application_Home>/AppName.app  
       这个是应用程序自身
<Application_Home>/Documents/    
       使用这个目录来存储用户的文件和应用程序数据文件。关键数据是任何不能重新创建你的应用程序的数据,如用户生成的内容。此目录的内容,可以提供给用户通过文件共享。(此目录的内容在iTunes备份程序时会被备份。)
<Application_Home>/Documents/Inbox
        使用这个目录来访问外部程序传入的文件。(如果应用程序注册了特定的文件格式,在其他程序中的特定文件可以传于此应用程序打开)
<Application_Home>/Library/
<Application_Home>/Library/Application Support
       使用这个目录来存储应用程序的数据文件(应用程序创建的数据文件,配置文件,模板等)。(这个目录会被iTunes备份。)
<Application_Home>/Library/Caches
       使用这个目录保存应用程序的支持文件,这些文件会被重新创建。应用程序负责管理这个目录的内容,并根据需要添加和删除文件。此目录不会被iTunes备份,且在设备恢复时此目录会被删除。iOS 5以前该目录一般不会被删除。但在iOS 5及以后版本中,系统可能会在特定情况下删除此目录(如磁盘空间低时)
<Application_Home>/Library/Frameworks
       iOS程序基本不使用
<Application_Home>/Library/Preferences
       使用NSUserDefaults配置时,存储在该目录。(这个目录会被iTunes备份。)
<Application_Home>/tmp/
       临时文件目录,可以存储临时文件。应用程序负责管理这个目录的内容,不使用里面的文件时,需要负责删除。特定情况下会被系统删除。

到底该如何保存文件

  Documents目录
       一般来说Documents目录用来存储永久性数据,当iCloud出现后往Documents目录存数据变得很不一般, Documents目录下的所有文件都会被iCloud存储,通过iTunes下载的音乐、电影、铃声,通过APP Store下载的程序,电子书,iAp下载的付费内容也被存到iCloud。为了减少备份的数据大小,应用程序下载的且可以重新创建的内容就不建议放在documents目录。否则程序提交测试时就会因为这个原因被拒绝:“We found that your app does not follow the iOS Data Storage Guidelines, which is required per the App Store Review Guidelines.” 所以document目录下,我们只能用来存储用户生成的,无法被重建的文件。(比如用户书签、历史纪录等)
 /Library/Caches目录
       该目录不被Itunes和iCloud备份,所以一般程序下载的内容放置到该目录中(如电子书、图片等,QQ阅读下载的epub文件就放置到此目录中)。需要注意的是,当用户磁盘空间告急的时候,系统会删除该目录下的数据 。但是当软件版本升级时该目录会被保存。
 /Tmp 目录
      存放临时文件,当不使用时,程序需要负责删除。

       如果非要存储到documents目录,可以设置do not back up属性,但是只在iOS 5.0.1后有效。如果需要支持iOS5及以前的系统,下载的文件还是乖乖的放到/Library/Caches中吧。

升级程序时的文件处理

当用户下载一个App的升级时,iTunes会生成一个新的App目录并安装,然后移动原App下的用户数据到新的目录。移动完成后删除旧的App。以下两个目录下的文件保证会在更新的操作过程中移动:
<Application_Home>/Documents
<Application_Home>/Library
尽管App下的其他目录也许会被移动,但是不要做这个保证。

(说明:Documents、Library目录下的文件,在几率很低的有些情况下升级的时候也会丢失。原因不明。如果有清楚的,请告知。)

参考

  • https://developer.apple.com/icloud/documentation/data-storage/ (iOS Data Storage Guidelines)
  • https://developer.apple.com/library/ios/#qa/qa1719/_index.html (Technical Q&A QA1719 How do I prevent files from being backed up to iCloud and iTunes?)
  • http://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html (File System Programming Guide)
  • http://www.marco.org/2011/10/13/ios5-caches-cleaning
  • https://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/PerformanceTuning/PerformanceTuning.html#//apple_ref/doc/uid/TP40007072-CH8-SW8


如何检查程序iCloud中备份的大小
- Install and launch your app
- Go to Settings > iCloud > Storage & Backup > Manage Storage
- If necessary, tap "Show all apps"
- Check your app's storage
发表评论