【问题标题】:iOS: Do not back up attribute?iOS:不备份属性?
【发布时间】:2013-04-26 14:40:41
【问题描述】:

我们的应用最近因违反iOS Data Storage Guidelines 关于在 iCloud 上备份文件而被拒绝。

我必须用do not back up 属性标记数据。

我将所有重要数据存储在 SQLite 数据库中,并将我的用户首选项存储在 UserDefaults.plist 中。我是否必须将我的 database.sqlite 文件标记为 do no back up

我问审阅者我是否要在我的 AppID 中禁用 iCloud 对我的情况有帮助吗?回复很含糊,并没有真正给我是或否的答案。

我的应用程序中的任何内容都不需要备份,我是否可以在我的 AppID 中禁用 iCloud 支持,而不必担心将文件标记为 do not back up??

这是审稿人的回复:

2.23

我们还发现您的应用未遵循 App Store 审核指南所要求的 iOS 数据存储指南。

特别是,我们发现在启动和/或内容下载时,您的应用会存储 4 MB。要检查您的应用存储了多少数据:

  • 安装并启动您的应用
  • 转到设置 > iCloud > 存储和备份 > 管理存储
  • 如有必要,点按“显示所有应用”
  • 检查应用的存储空间

iOS 数据存储指南指出,只有用户使用您的应用创建的内容,例如文档、新文件、编辑内容等,才应由 iCloud 备份。

您的应用程序使用的临时文件应仅存储在 /tmp 目录中;请记住在用户退出应用时删除存储在此位置的文件。

可以重新创建但必须保留以使您的应用正常运行的数据 - 或者因为客户希望它可以离线使用 - 应使用“不备份”属性进行标记。对于 NSURL 对象,添加 NSURLIsExcludedFromBackupKey 属性以防止相应文件被备份。对于 CFURLRef 对象,使用相应的 kCFURLIsExcludedFromBackupKey 属性。

如需更多信息,请参阅技术问答 1719:如何防止文件备份到 iCloud 和 iTunes?。

有必要修改您的应用程序以满足 iOS 数据存储指南的要求。 对于离散代码级别的问题,您可能希望咨询 Apple 开发人员技术支持。请务必:

  • 包括您的拒绝问题的完整详细信息
  • 准备任何符号化的崩溃日志、屏幕截图和步骤,以便在 DTS 工程师跟进时重现问题。

【问题讨论】:

  • 能否发表评论者的回复?
  • 我认为你不能再“禁用 iCloud”了。您需要将您的数据拆分为用户创建/修改的内容、动态下载的内容(并且可以重新下载)、临时的并且可以扔掉的内容以及应用程序安装附带的内容(并且可以重新安装)。只有第一个类别应该是“支持云的”,
  • @Hot Licks:在应用程序 ID 下配置门户的证书、标识符和配置文件部分,我可以将 iCloud 设置为启用或禁用。我想知道这是否会阻止 iCloud 备份,这样我就不必拆分文件了。此外,我无法使用开发配置文件执行此操作,因此无法进行测试。

标签: ios


【解决方案1】:

基本上,这取决于您存储的数据类型。

如果数据可以重新生成(例如,当用户在另一台设备上安装应用程序时),则不应备份。

否则,iCloud 备份是可以的,因为用户希望他的数据可用,即使在另一台设备上也是如此。

在第一种情况下,您基本上有两种方法可以实现这一目标......

要么使用NSURL 在文件上设置kCFURLIsExcludedFromBackupKey,要么将它们存储在不会备份的位置,例如<Application_Home>/Library/Caches。请注意,第二种解决方案更好,恕我直言。

有关信息,kCFURLIsExcludedFromBackupKey 可以这样使用:

NSURL * fileURL;

fileURL = [ NSURL fileURLWithPath: @"some/file/path" ];

[ fileURL setResourceValue: [ NSNumber numberWithBool: YES ] forKey: NSURLIsExcludedFromBackupKey error: nil ];

对于第二种情况,有时 Apple 审核人员认为您的数据可以重新生成,但实际上并非如此。然后你必须解释为什么必须备份数据。

【讨论】:

  • 非常感谢您的回复。因此,要“完全”禁用 iCloud,我只需将路径设置为文档目录?这是一个安全的假设吗?另外我听说这仅适用于 iOS 5.1 及更高版本。现在我支持 5.0 及更高版本,有什么理由不应该将截止设置为 5.1 并使用上面的代码?再次感谢!
  • 这是一个选项,但我认为您不应该将此类数据存储到“文档”文件夹中。如果您需要支持 iOS setResourceValue: 方法仅在 iOS 5.0 之后可用,kCFURLIsExcludedFromBackupKey 仅在 iOS 5.1 之后可用。
  • 谢谢!如果我必须这样做,那么能够在我的 App ID 中启用或禁用 iCloud 有什么意义?这难道没有目的吗?
  • 与您的应用程序支持 iCloud 无关。它只是完整的 iOS 备份,可以配置为使用 iCloud。所以只需使用我提到的两种解决方案之一。
  • @Macmade :我使用了你的第一个方法,但仍然被苹果拒绝。你能帮我解决这个问题吗?
【解决方案2】:

您可以调用以下函数将“map.sqlite”的路径作为 NSURL 传递:

NSURL *url = [NSURL fileURLWithPath:yourSQLitePath];
[self addSkipBackupAttributeToItemAtURL:url];
The function is provided in Apple as:

- (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;
}

【讨论】:

    【解决方案3】:

    Swift 5 版本:

    func addSkipBackupAttributeTo(url constURL: URL) {
        do {
            // Need a mutable URL to call setResourceValues
            var url = constURL
            var resourceValues = URLResourceValues()
            resourceValues.isExcludedFromBackup = true
            try url.setResourceValues(resourceValues)
        } catch {
            print("Unable to set isExcludedFromBackup on \(constURL)")
        }
    }
    

    URLResourceValues 会跟踪哪些值被修改并只将其写出,因此可以初始化一个新对象,设置一个键并使用它调用 setResourceValues。

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 2022-06-15
      相关资源
      最近更新 更多