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

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

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

我一直在看什么是错误的是我正在使用的一个文件不符合存储要求。

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

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

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

代码如下:

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

文件大小是23MB

有任何想法吗?

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

你可以调用下面的函数来传递你的“map.sqlite”的path为NSURL:

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

该function在苹果提供:

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

该function确保文件(作为URL提供)不被iCloud备份。

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

基本上,这取决于你正在存储的数据的种类。

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

否则,iCloud备份是可以的,因为用户会希望他的数据可用,即使在另一台设备上。

在第一种情况下,你基本上有两种方法来实现这个…

您可以使用NSURL在您的文件上设置kCFURLIsExcludedFromBackupKey,或者将它们存储在不会备份的位置,如<Application_Home>/Library/Caches 。 请注意,第二个解决scheme是更好的,恕我直言。

有关信息,kCFURLIsExcludedFromBackupKey可以这样使用:

 NSURL * fileURL; fileURL = [ NSURL fileURLWithPath: @"some/file/path" ]; [ fileURL setResourceValue: [ NSNumber numberWithBool: YES ] forKey: NSURLIsExcludedFromBackupKey error: nil ]; 

对于第二种情况,有时候苹果的评论者认为你的数据可以重新生成,而不是。 那么你将不得不解释为什么要备份数据。