可以将下载的图像/文件添加到我的应用程序包中吗?

Posted

技术标签:

【中文标题】可以将下载的图像/文件添加到我的应用程序包中吗?【英文标题】:Can downloaded images/files be added to my app bundle? 【发布时间】:2012-06-06 16:31:57 【问题描述】:

我有一个允许我下载字符(图像)、声音等的应用程序。当用户选择要下载的字符时,我可以将其存储在我的 App Bundle 的目录中吗?如果没有,存储我的内容(数据)的最佳位置在哪里?我在考虑文档目录,但后来我在某处看到 Apple 现在希望将数据存储在缓存目录中。

感谢您的帮助。

【问题讨论】:

***.com/questions/5619719/write-a-file-on-ios 【参考方案1】:

我可以将它存储在我的 App Bundle 的目录中吗?

不,您不能修改应用程序包。

如果不是,存储我的内容(数据)的最佳位置在哪里?

如果您的应用必须支持 iOS 5.0 或更早版本,您需要将应用数据存储在 Caches 目录中。但是,请记住,文件可能会在空间不足的情况下被删除,因此如果您的应用数据被删除,您的应用需要正常降级。

从 iOS 5.0.1 开始,您可以将数据文件存储在 Documents Directory 和 flag them as "do not back up" 中。通过标记文件,您的应用程序符合应用程序负责确保仅将用户数据而不是应用程序数据备份到 iCloud 和 iTunes 并避免 Apple 可能拒绝的准则。在这种情况下,文件不会在空间不足的情况下被删除。

从 iOS 5.1 开始,您可以将数据文件存储在 Documents Directory 中,并使用 NSURLIsExcludedFromBackupKeykCFURLIsExcludedFromBackupKey 文件属性从备份中排除文件。这些 API 中的任何一个都优于将它们标记为“不备份”。在这种情况下,您的应用符合 App Store 指南,并且在空间不足的情况下不会删除文件。

【讨论】:

【参考方案2】:

我知道这是一个相当长的讨论,但您可能应该阅读它。 :)

iOS Data Storage Guidelines 状态:

为确保备份尽可能高效,请务必按照以下准则存储您的应用数据:

    只有用户生成的或您的应用程序无法重新创建的文档和其他数据,才应存储在 /Documents 目录中,并由 iCloud 自动备份。

    李>

    可以再次下载或重新生成的数据应存储在 /Library/Caches 目录中。您应该放在 Caches 目录中的文件示例包括数据库缓存文件和可下载内容,例如杂志、报纸和地图应用程序使用的内容。

    仅临时使用的数据应存储在 /tmp 目录中。尽管这些文件没有备份到 iCloud,但请记住在完成后删除这些文件,以免它们继续占用用户设备上的空间。


如果您有 OS X 或 Unix 背景,很容易理解 Apple 的立场,即此类目录无法保证其中的数据将保留多长时间。

应用沙箱中的 tmp 目录与根 /tmp 目录不同的事实,应该不会影响您对该目录的看法.

如果您过去从未观察到文件已从这些目录中删除,则不能保证将来不会更改。特别是当更改符合文档时。这是一般规则。


Apple 文档中的更改/差距:

直到 2011 年 6 月 29 日,Apple 关于 /Documents 的文档说:

使用此目录来存储用户文档和应用程序数据文件。

这很清楚。难怪开发者不满意 iOS 5 中 Documents 目录的规则已经改变,没有任何合适的替代方案。

关于 /Library/Caches:

使用此目录可以编写任何您希望在应用程序启动之间或应用程序更新期间保留的特定于应用程序的支持文件。您的应用程序通常负责添加和删除这些文件。它还应该能够根据需要重新创建这些文件,因为 iTunes 会在设备完全恢复期间删除它们。


应用审核拒绝

开发人员报告说,在 Documents 目录中存储任何/部分/大量数据的应用被 App Review 拒绝。

App Review 团队不太可能详细了解哪些文件存储在哪个目录中,哪些是用户生成的,哪些是可以再次下载或重新生成的数据。一些开发者报告称,他们成功地回复了 App Review 团队,解释了他们的应用如何存储数据以及如何按照规则进行存储。

iTunes 和 iCloud 正在备份什么

应用主目录中的所有内容均已备份,但以下内容除外:

应用程序包本身 (.app) /tmp目录 /Library/Caches 目录

其他文档明确指出,应用程序支持目录也由 iTunes(可能是 iCloud)备份。在讨论中,一些开发人员建议应用程序支持目录会比缓存更安全(= 更永久)。对我来说,App Review 似乎会像处理 Documents 目录一样热情地处理存储在 Application Support 中的大量数据,因为这完全是关于 iCloud 存储的。

iOS 5 中的行为变化

从 iOS 5 开始,如果设备遇到磁盘空间不足警告,则 /Library/Caches 可能会在您的应用未运行时被清除。

您的应用不再有可以存储以下文件的目录:

未备份到 iTunes/iCloud 没有被清除的风险

【讨论】:

警告其他人,这里提到的目录(例如/Library/Caches/Documents 等)与您必须查找的抽象应用程序根目录相对。答案是使用NSSearchPathForDirectoriesInDomains 查找相应的目录。【参考方案3】:

根据 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. 

【讨论】:

是的,但我的数据不是临时的。它是用户下载的附加组件,无论是购买的还是免费的。那么我将在哪里存储用户选择的角色的数据呢? 我写了一个游戏,它会为用户统计数据生成数据,它还会为保存的游戏截取屏幕截图,以便用户知道他们离开的地方等等......当他们重新进入游戏时。如果这是您希望快速访问游戏后下载的数据,那么我会说将其存储在 /Documents

以上是关于可以将下载的图像/文件添加到我的应用程序包中吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 Google 图片搜索嵌入到我的 html5 网页中吗

C#,我可以将文件从流或其他文件保存到我的单个 exe 中吗?

如何将外部 .exe 添加到我的 C# 项目中?

我可以将 chrome 扩展应用程序嵌入到我的主要 AngularJS 应用程序中吗?

除了 Cocoapods 之外,还有其他方法可以将 Firebase 整合到我的 iOS 应用程序中吗?

可以将 DLL 合并到 .NET EXE 中吗? [复制]