15

我有一个应用程序,可让您下载可以扩展您的应用程序使用的“模块”。
当用户下载一个模块时,我从服务器获取一个 ZIP 文件并将其解压缩到他的 Caches 文件夹中。(每个 zip 的大小都可以从 60k 到 2MB)。

不幸的是,有超过300 个模块可用,许多用户至少将其中的 50-60 个下载到他们的设备上。

最近,我收到很多抱怨说模块只是从用户设备上消失了,所以我做了一些调查,并在 Apple 的文档中发现了以下措辞。

iOS 会在必要时从 Caches 目录中删除您的文件,因此如果数据文件被删除,您的应用程序将需要正常降级。

还有以下文章进一步解释了这种情况:http: //iphoneincubator.com/blog/data-management/local-file-storage-in-ios-5

我的问题是,我没有优雅降级的实际方法,因为我不能自动让用户下载这么多模块。这可能需要几个小时,具体取决于互联网连接和模块的大小。

所以我有几个问题:

  1. 你们中是否有人不得不处理类似的情况,如果是,如何处理?
  2. 有谁知道 iOS 何时清除缓存?什么被认为是“低空间”警告?这样我至少可以给用户一个警告,说他没有足够的空间来安装新模块。
  3. 有没有办法在缓存文件夹被清除之前收到某种警告?

这是苹果公司的一个非常令人沮丧的举动,我真的看不到出路。真的很想听听你的一些想法。

4

1 回答 1

11

编辑:经过一些测试,这似乎工作得很好并且没有被清除。

这还没有 100% 得到证实,但它在我们的基本测试中运行良好(我会在结果出来时发布更全面的结果)。似乎将数据保存到应用程序的“应用程序支持”文件夹可以解决这些问题,因为该文件夹没有被清除。

文档状态:

使用应用程序支持目录常量NSApplicationSupportDirectory,附加您的<bundle_ID>for: 您的应用程序为用户创建和管理的资源和数据文件。您可以使用此目录来存储应用程序状态信息、计算或下载的数据,甚至是您代表用户/自动保存文件管理的用户创建的数据。`

您可以按如下方式访问该文件夹(按照苹果官方文档的要求,注意附加捆绑包 ID):

[[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[[NSBundle mainBundle] bundleIdentifier]]

希望这对任何人都有帮助,正如我所说,我将在周末发布更全面的测试结果。

编辑 2: 添加此行以防止从应用程序支持同步临时内容非常重要。我在 applicationDidFinishLaunching 的末尾使用它:

[[NSURL URLWithString:NSApplicationSupportDir] setResourceValue:@(YES) forKey:NSURLIsExcludedFromBackupKey error:nil];
于 2012-07-12T14:01:42.830 回答