20

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

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

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

我问审阅者我是否要iCloud在我的 AppID 中禁用它会对我的情况有所帮助,而回复是神秘的,并没有真正给我一个是或否的答案。

我的应用程序中的任何内容都不需要备份,我可以只禁用iCloud我的 AppID 中的支持,而不必担心将文件标记为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 工程师跟进时重现问题。
4

3 回答 3

32

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

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

否则,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 审阅者认为您的数据可以重新生成,但事实并非如此。然后你必须解释为什么必须备份数据。

于 2013-04-26T17:22:31.183 回答
3

您可以调用以下函数将“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;
}
于 2015-04-07T07:59:38.597 回答
0

斯威夫特 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 就可以了。

于 2020-09-24T15:45:03.907 回答