iCloud +在iPhone Documents文件夹中存储媒体

和许多开发者一样,我最近也收到了一封来自苹果的电子邮件,声称我们应该将数据从文档目录移动到另一个文件夹,以便更加精简地备份到iCloud。

在最近的testing中,似乎[你的应用程序]在其“文档”文件夹中存储了相当数量的数据。

由于每天通过Wi-Fi为每个用户的iOS设备执行iCloud备份,因此通过最大限度地减less应用存储的数据量来确保最佳的用户体验非常重要。

instapaper成名的Marco Arment很好的解决了这个问题,那就是存储可下载文件的推荐位置在/ Library / Caches中。 但是问题是,当操作系统决定设备在存储上运行时,/ tmp和/ Caches都可以被“清除”。 如果您的应用程序已被清理,那么由您的应用程序下载并存储在您的用户的数据将消失。 当然,用户会责怪你而不是苹果。

该怎么办?

iOS 5.0.1引入了一个标志来解决这个问题:

https://developer.apple.com/library/ios/#qa/qa1719/_index.html

他们的build议是在/ Library / like / Library / PrivateDocs中创build一个文件夹,并将文件放在那里。 但是,除了/ Library / Cache或tmp中的文件,默认情况下都会备份“/不备份”标志。 使用以下命令在PrivateDocs文件夹中设置标志:

#include <sys/xattr.h> - (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL { const char* filePath = [[URL path] fileSystemRepresentation]; const char* attrName = "com.apple.MobileBackup"; u_int8_t attrValue = 1; int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0); return result == 0; } 

Library/Caches可能是很多应用程序的一个很好的答案。 特别是当应用程序能够正常工作时,caching的数据将会丢失,清除caching也不会破坏用户可能selectcaching的数据的所有logging,以及可以从中重新获取的数据。

对于不包含在Caches数据的应用程序考虑Library/Application Support

http://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW1

应用支持:

使用此目录来存储除与用户文档相关的所有应用程序数据文件。 例如,您可以使用此目录来存储由应用程序pipe理的应用程序创build的数据文件,configuration文件,模板或其他固定或可修改的资源。 应用程序可以使用这个目录来存储最初包含在应用程序包中的资源的可修改副本。 游戏可以使用这个目录来存储由用户购买并从服务器下载的新级别。

这个目录中的所有内容都应该放在一个自定义子目录中,其名称是应用程序的包标识符或您的公司的名称。

在iOS中,此目录的内容由iTunes备份。


不幸的是,应用程序支持目录仍然备份,属于苹果新的数据存储准则 。 根据评论者对备份文件大小的select的敏感程度,这可能仍然会导致拒绝。