11

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

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

我一直在看问题是我正在使用的文件之一不符合存储要求。

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

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

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

代码如下:

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

文件大小为 23MB

有任何想法吗?

4

2 回答 2

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

此功能确保文件(以 URL 形式提供)不被 iCloud 备份。

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

于 2014-04-08T12:33:19.463 回答
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 审阅者认为您的数据可以重新生成,但事实并非如此。然后你必须解释为什么必须备份数据。

于 2015-04-07T07:53:31.593 回答