如何在不将其备份到 iCloud 的情况下为我的应用程序提供演示数据?

Posted

技术标签:

【中文标题】如何在不将其备份到 iCloud 的情况下为我的应用程序提供演示数据?【英文标题】:How can I provide demo data with my app without backing it up to iCloud? 【发布时间】:2013-10-07 20:07:43 【问题描述】:

我从一月份开始在 App Store 中有一个应用程序,它会在首次启动时将数据库文件复制到“文档”目录。

此数据库用于存储用户创建的“预设”。每个预设最多可以有 129 张照片。

在开始时,该应用程序带有一个“默认预设”,用户可以使用它来了解并开始使用该应用程序。这个预设对用户来说就像是一个“礼物”,如果他不再想要了,他可以直接删除它。

在更新 2.0.2 时,此架构中没有任何更改,但 Apple 现在拒绝了我的更新。

2.23 - 应用程序必须遵循 ios 数据存储指南,否则它们将 被拒绝

我不知道如何解决这个问题。问题似乎是苹果认为“临时”的默认预设被备份到了 iCloud。此预设不是临时的。它必须持久化,并且是数据库的一部分。

我也不能用“不备份”标记数据库,因为这样用户创建的“预设”不会被备份,这将是可怕的。

有人知道如何解决这个问题吗?

【问题讨论】:

【参考方案1】:

您需要将文件标记为not backup to iCloud。

如果不这样标记文件,它将有资格备份到 iCloud。 Apple 最近开始强制执行此操作。

如果应用生成大量数据,在应用启动时,他们会拒绝它。 Apple 的理由是,任何可以重新生成的数据都不应该备份到 iCloud。

为防止这种情况,Apple 建议:

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL

    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

    NSError *error = nil;
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                                  forKey: NSURLIsExcludedFromBackupKey error: &error];
    if(!success)
        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
    
    return success;

除了 iCloud 的全面遗漏之外,您唯一剩下的就是将您的用户生成内容与可重新创建的内容分开。

【讨论】:

我的问题是这个初始内容与用户的内容在同一个数据库中。所有照片都存储在数据库中。这是一个更新,所以我现在不能把它分开,或者标记整个数据库。 数据库中只有这些吗?用户内容? 不幸的是,是的。所有图片都存储在数据库中,在首次启动时复制时已经具有“默认预设”。 另一个想法,虽然有风险,但我脑海中闪过的想法是最初从 iCloud 中排除数据库,然后(在应用程序使用 4 分钟后等)删除标志。他们的测试人员肯定不会注意到这个开关 ;-) YMMV。 好吧..如果我在应用设置中添加一个选项,用户可以在其中启用或禁用“备份”选项(默认关闭)?【参考方案2】:

“不备份”是文件级属性。所以也许只用那个属性标记你的“礼物”文件?

【讨论】:

因为是更新,所有文件都存储在同一个数据库中,所以“礼物”和用户的内容在同一个地方。【参考方案3】:

不幸的是,指南对此非常明确 - 只有用户生成的数据可以存储在 Documents 目录中并备份到 iCloud。

但是,您似乎可以阻止备份特定文件: https://developer.apple.com/library/ios/qa/qa1719/_index.html#//apple_ref/doc/uid/DTS40011342

您将不得不找到一种方法将您的预设数据与用户的数据存储区分开,并将预设数据标记为“不备份”

【讨论】:

【参考方案4】:

我的一个应用程序也遇到了同样的问题。我必须生成另一个版本的数据库并将其存储到 Caches 文件夹中,并将其标记为不符合 iCloud 备份条件。然后将所有用户生成的内容存储到文档文件夹中的另一个数据库中,该文件夹实际上会备份到 iCloud。

【讨论】:

以上是关于如何在不将其备份到 iCloud 的情况下为我的应用程序提供演示数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不将其添加到目录的情况下在多个团队中安装机器人?

如何在不将其添加到子视图的情况下截取 uiview?

如何在不将批处理文件复制到 c 中的 7zip 文件夹的情况下运行 7zip 批处理

如何在不重新启动 apache 的情况下为站点重新加载 apache 配置?

为我的应用程序 iOS sdk 关闭 iCloud 备份

如何在不将其注册为机器人的情况下创建不和谐机器人?