2.23:应用必须遵循iOS数据存储指南,否则将被拒绝

时间:2014-03-02 23:06:12

标签: ios objective-c storage route-me

通过将应用程序上传到应用商店,我发现了这个错误。

  

2.23:应用必须遵循iOS数据存储指南,否则将被拒绝

我一直在看错了我正在使用的其中一个文件不符合存储要求。

更具体地说,它是一个用于使用route-me库加载地图离线模式的sqlite。

我正在使用sqlite在离线模式下加载地图,似乎这张地图在iCloud中存储为备份,所以我正在跳过存储限制。

不知道如何说这个副本不是在iCloud中创建的。

代码如下:

[[RMDBMapSource alloc] initWithPath: @ "map.sqlite"]; 

文件大小为23MB

任何想法?

2 个答案:

答案 0 :(得分:23)

很可能您将“map.sqlite”存储在应用程序的Documents目录中。 Sqlite文件通常被复制到Documents目录,以便它们是可写的。但是,默认情况下,iOS会尝试将Documents目录中的所有文件复制或备份到iCloud(如果启用了iCloud备份)。因此,根据Apple的指南,您可以执行以下操作,以便iCloud不会从您的Documents目录备份您的数据库文件。

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

NSURL *url = [NSURL fileURLWithPath:yourSQLitePath];
[self addSkipBackupAttributeToItemAtURL:url];

该功能在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不备份文件(以URL提供)。

您还可以将数据库文件放在Documents目录中的单独目录中,并通过调用此函数将整个子目录标记为“不备份”。希望它有所帮助。

答案 1 :(得分:0)

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

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

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

相关问题