通过将应用程序上传到应用商店,我发现了这个错误。
2.23:应用必须遵循iOS数据存储指南,否则将被拒绝
我一直在看错了我正在使用的其中一个文件不符合存储要求。
更具体地说,它是一个用于使用route-me库加载地图离线模式的sqlite。
我正在使用sqlite在离线模式下加载地图,似乎这张地图在iCloud中存储为备份,所以我正在跳过存储限制。
不知道如何说这个副本不是在iCloud中创建的。
代码如下:
[[RMDBMapSource alloc] initWithPath: @ "map.sqlite"];
文件大小为23MB
任何想法?
答案 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审核人员认为您的数据可以重新生成,而不是。然后你必须解释为什么必须备份数据。