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。 要检查您的应用程序正在存储多less数据:
- 安装并启动您的应用程序
- 进入设置> iCloud>存储和备份>pipe理存储
- 如有必要,请点按“显示所有应用”
- 检查你的应用程序的存储
iOS数据存储指南指出,只有用户使用您的应用程序创build的内容,例如文档,新文件,编辑等应由iCloud备份。
应用程序使用的临时文件只能存储在/ tmp目录中; 请记住当用户退出应用程序时删除存储在这个位置的文件。
可以重新创build的数据必须持续保持应用程序的正常运行,或者因为客户期望它可供离线使用,则应标记为“不备份”属性。 对于NSURL对象,请添加NSURLIsExcludedFromBackupKey属性以防止备份相应的文件。 对于CFURLRef对象,使用相应的kCFURLIsExcludedFromBackupKey属性。
有关更多信息,请参阅技术问答1719:如何防止将文件备份到iCloud和iTunes?
有必要修改您的应用程序以符合iOS数据存储指南的要求。 对于不同的代码级问题,您可能希望咨询Apple开发者技术支持。 请确保:
- 包括拒绝问题的完整细节
- 准备任何符号化的崩溃日志,截图和步骤来重现DTS工程师跟进时的问题。
基本上,这取决于你正在存储的数据的种类。
如果可以重新生成数据(例如用户在另一台设备上安装应用程序),则不应备份数据。
否则,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 ];
对于第二种情况,有时候苹果的评论者认为你的数据可以重新生成,而不是。 那么你将不得不解释为什么要备份数据。
你可以调用下面的函数来传递你的“map.sqlite”的path为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; }