我有一个允许我下载字符(图像)、声音等的应用程序。当用户选择要下载的字符时,我可以将其存储在我的 App Bundle 的目录中吗?如果没有,存储我的内容(数据)的最佳位置在哪里?我在考虑文档目录,但后来我在某处看到 Apple 现在希望将数据存储在缓存目录中。
谢谢您的帮助。
我有一个允许我下载字符(图像)、声音等的应用程序。当用户选择要下载的字符时,我可以将其存储在我的 App Bundle 的目录中吗?如果没有,存储我的内容(数据)的最佳位置在哪里?我在考虑文档目录,但后来我在某处看到 Apple 现在希望将数据存储在缓存目录中。
谢谢您的帮助。
我可以将它存储在我的 App Bundle 的目录中吗?
不,您不能修改应用程序包。
如果没有,存储我的内容(数据)的最佳位置在哪里?
如果您的应用必须支持 iOS 5.0 或更早版本,您需要将应用数据存储在Caches
目录中。但是,请记住,文件可能会在空间不足的情况下被删除,因此如果您的应用数据被删除,您的应用将需要正常降级。
从 iOS 5.0.1 开始,您可以将数据文件存储在 Documents Directory 中并将它们标记为“不备份”。通过标记文件,您的应用程序符合应用程序负责确保仅将用户数据而不是应用程序数据备份到 iCloud 和 iTunes 并避免 Apple 可能拒绝的准则。在这种情况下,文件不会在空间不足的情况下被删除。
从 iOS 5.1 开始,您可以将数据文件存储在 Documents Directory 中,并使用文件属性NSURLIsExcludedFromBackupKey
或kCFURLIsExcludedFromBackupKey
文件属性从备份中排除文件。这些 API 中的任何一个都优于将它们标记为“不备份”。在这种情况下,您的应用程序符合 App Store 指南,并且文件不会在空间不足的情况下被删除。
iOS 数据存储指南指出:
为确保备份尽可能高效,请务必按照以下准则存储应用程序的数据:
只有用户生成的或应用程序无法重新创建的文档和其他数据,才应存储在 /Documents 目录中,并由 iCloud 自动备份。
可以再次下载或重新生成的数据应存储在 /Library/Caches 目录中。您应该放在 Caches 目录中的文件示例包括数据库缓存文件和可下载内容,例如杂志、报纸和地图应用程序使用的内容。
仅临时使用的数据应存储在 /tmp 目录中。虽然这些文件没有备份到 iCloud,但请记住在完成后删除这些文件,以免它们继续占用用户设备上的空间。
如果您有 OS X 或 Unix 背景,很容易理解 Apple 的立场,即此类目录无法保证其中的数据将保留多长时间。
应用程序沙箱中的tmp目录与根/tmp目录不同,这一事实不应影响您对该目录的看法。
如果您过去从未观察到文件从这些目录中删除,则不能保证将来不会更改。特别是当更改符合文档时。这是一般规则。
Apple 文档中的更改/差距:
直到 2011 年 6 月 29 日,Apple 关于 /Documents 的文档说:
使用此目录来存储用户文档和应用程序数据文件。
这很清楚。难怪开发人员会不高兴 iOS 5 中 Documents 目录的规则发生了变化,但没有任何合适的替代方案。
关于/库/缓存:
使用此目录来编写您希望在应用程序启动之间或应用程序更新期间保留的任何特定于应用程序的支持文件。您的应用程序通常负责添加和删除这些文件。它还应该能够根据需要重新创建这些文件,因为 iTunes 会在设备完全恢复期间删除它们。
应用审核拒绝
开发人员报告说,在 Documents 目录中存储任何/一些/很多数据的应用程序被 App Review 拒绝。
App Review 团队不太可能详细了解哪些文件存储在哪个目录中,哪些是用户生成的,哪些是可以再次下载或重新生成的数据。一些开发人员报告称,他们成功地回应了 App Review 团队,解释了他们的应用程序如何存储数据以及如何符合规则。
iTunes 和 iCloud 正在备份什么
备份应用程序主目录中的所有内容,但以下内容除外:
其他文档明确指出,应用程序支持目录也由 iTunes(可能是 iCloud)备份。在讨论中,一些开发人员建议应用程序支持目录会比缓存更安全(= 更永久)。在我看来,App Review 似乎会以与 Documents 目录相同的热情来处理存储在 Application Support 中的大量数据,因为它完全是关于 iCloud 存储的。
iOS 5 中的行为变化
从 iOS 5 开始,如果设备遇到磁盘空间不足警告,则 /Library/Caches 可能会在您的应用未运行时被清除。
不再有您的应用可以存储以下文件的目录:
根据 Apple 的指南,下载的内容不应存储在 Documents 目录中:
Only documents and other data that is user-generated, or that cannot otherwise be recreated by your application, should be stored in the <Application_Home>/Documents
改用 /Library/Caches 目录
Data that is used only temporarily should be stored in the <Application_Home>/tmp directory.