12

我和许多开发人员一样,最近收到了一封来自 Apple 的电子邮件,其中说我们应该将我们的数据从文档目录移动到另一个文件夹,以便更简化地备份到 iCloud。

在最近的测试中,[您的应用程序] 似乎在其 Documents 文件夹中存储了大量数据。

由于每天都会通过 Wi-Fi 为每位用户的 iOS 设备执行 iCloud 备份,因此通过最大限度地减少应用程序存储的数据量来确保尽可能好的用户体验非常重要。

以 instapaper 闻名的Marco Arment对这个问题有很好的看法,即存储可下载文件的推荐位置是 /Library/Caches。然而,问题是 /tmp 和 /Caches 都可以在操作系统确定设备存储空间不足时被“清理”。如果您的应用程序被清理,那么您的应用程序下载并由您的用户存储的数据就会消失。自然,用户会责怪你而不是苹果。

该怎么办?

4

2 回答 2

15

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

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

他们的建议是在 /Library/ 中创建一个文件夹,例如 /Library/PrivateDocs ,然后将您的文件放在那里。但是,您还必须在它们上设置“不备份”标志,因为 /Library 中的每个文件(除了 /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;
}
于 2011-11-16T01:47:48.957 回答
3

Library/Caches对于许多应用程序来说可能是一个很好的答案。特别是当应用程序可以正常工作时,缓存数据丢失并且清除缓存也不会破坏用户可能选择缓存哪些数据以及可以从何处重新获取数据的所有记录。

对于具有不属于Caches考虑的数据的应用程序Library/Application Support

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

应用支持:

使用此目录来存储所有应用程序数据文件,但与用户文档相关联的文件除外。例如,您可以使用此目录来存储应用程序创建的数据文件、配置文件、模板或其他由应用程序管理的固定或可修改资源。应用程序可能使用此目录来存储最初包含在应用程序包中的资源的可修改副本。游戏可能会使用此目录来存储用户购买并从服务器下载的新关卡。

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

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


不幸的是,应用程序支持目录仍然被备份并且属于 Apple 的新数据存储指南。根据审阅者选择的关于总备份文件大小的敏感程度,这可能仍会导致拒绝。

于 2011-10-14T08:10:24.950 回答