一次审核被拒的经历-关于iCloud到底应该备份什么数据

前言

项目最近一次审核被拒了=。=
仔细看了一下后,发现是没有遵守“iOS Data Storage Guidelines”。
在此总结一下。

被拒原因

先看看被拒的反馈信息:

1
2
3
Apps must follow the iOS Data Storage Guidelines or they will be rejected

On launch and content download, your app stores 12.14 MB, which does not comply with the iOS Data Storage Guidelines.

大致意思就是App下载东西以后,在iCloud里面查看此App需要备份的体积变大了。

再根据 iOS Data Storage Guidelines的说明,得出几点重要信息:

  • 只有用户创建的,并且不能被App重现的文档、数据,才应该被保存在“<Application_Home>/Documents”路径下。
  • 可以重新产生、下载的数据可以放在“<Application_Home>/Library/Caches”目录下,如用于缓存的数据库文件。
  • 纯粹用于缓存的数据可以放在“<Application_Home>/tmp”目录下。
  • 可以通过对NSURL加参数,来保证特定的文件夹及其内容不被iCloud备份,也不会被清除,如Document文件夹。

所以可以初步得出被拒的原因是因为App中下载的文件也被包含在iCloud备份当中了,而Apple审核人员觉得这些文件不应该被备份。

真正应该备份的数据

所以,真正需要备份的文件是用户创建的,不能通过程序重新产生的,如记事本应用中用户创建的文本数据,绘画应用中用户画的画等。

解决当中遇到的坑

既然知道了原因,那就好办了。

根据iOS Data Storage Guidelines的简短说明,乍一看,<Application_Home>/Library/Caches是存放可以重新产生、下载的数据。

但是有个“陷阱”在这。

系统可能清空的目录

根据官方文档“File System Programming Guide”可以整理出一下两个系统可能会清除的目录:(在储存空间不够时)

  1. Library/Caches/
  2. tmp/

所以,像App下载的歌曲等资源文件是不能放在上面两个目录中的。

解决:

所以,为了保险起见,最靠谱的还是放在<Application_Home>/Documents中,并且通过设置,不让iCloud备份。

Apple已经提供了相应的函数,如下(iOS 5.1及以后的版本):

1
2
3
4
5
6
7
8
9
10
11
- (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;
}

特性

  • <Application_Home>/Documents根目录也可以通过上面的函数设置成不备份。(如应用AVPlayer)
  • 设置是递归的,所以其所有子目录和文件都不用再设置一次,都会自动不被备份。(测试有效,但是不确定=。=,参考:is-nsurlisexcludedfrombackupkey-recursive

总结

多看官方说明=。=

参考

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器