iOS:不备份属性?

时间:2013-04-26 14:40:42

标签: ios

我们的应用最近因违反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

我们还发现您的应用不符合iOS数据存储指南,这是App Store审核指南所要求的。

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

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

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

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

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

有关详细信息,请参阅技术问答1719:如何阻止文件备份到iCloud和iTunes?

有必要修改您的应用以满足iOS数据存储指南的要求。 对于离散的代码级问题,您可以咨询Apple Developer技术支持。请务必:

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

3 个答案:

答案 0 :(得分:31)

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

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

否则,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审核人员认为您的数据可以重新生成,而不是。然后你必须解释为什么必须备份数据。

答案 1 :(得分:3)

您可以调用以下函数来传递&#34; map.sqlite&#34;的路径。作为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;
}

答案 2 :(得分:0)

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。