iphone - 当 Documents 目录不是一个选项时,在哪里存储私有(private)重要用户数据?

标签 iphone ios ipad filesystems

我的应用程序使用 iTunes 文件共享,它会将 Documents 目录中的所有内容暴露给用户,使其容易被意外删除或操纵。

我花了几个小时阅读这些文档,但内容一团糟,我希望有人从经验中知道。首先,他们在一个地方说我应该将这些文件放在 Library 目录中。

In this technical Q & A苹果说这是保留的。根据我的理解,这意味着我可以安全地将重要的用户数据(如 sqlite3 数据库文件)放在该目录中。当用户更新到新版本时,该目录下的内容会被保留,更新后仍然可用:

applications can create their own directories in /Library/ and those directories will be preserved in backups and across updates

因此/Library/保留在备份和更新中。

对于英语不好的我来说,这意味着:是的,数据会保留下来。用户备份时不会丢失。用户更新时不会丢失。我在几本词典中查找了“保存”一词,我确信它的意思是“它会存活下来”。

但是,有 this note in the iOS Application Programming Guide这说明了完全不同的事情!在这里,他们谈到了图书馆目录:

<Application_Home>/Library/
You should not use this directory for user data files.
The contents of this directory (with the exception of the Caches
subdirectory) are backed up by iTunes.
Your application is generally
responsible for adding and removing
these files. It should also be able to
re-create these files as needed
because iTunes removes them during a
full restoration of the device.

“不应用于用户数据文件。” (???)

但与此同时,他们承认它由 iTunes 支持。好的。那为什么我不应该把用户数据文件放在那里呢?

/Library/Caches Use this directory to write any application-specific support files that you want to persist between launches of the application or during application updates. (...) It should also be able to re-create these files as needed because iTunes removes them during a full restoration of the device.

什么?!我应该将这些文件放在 Library/Caches 中。但是这个目录没有被 iTunes 备份,正如他们上面所说的。所以这只是为了更新而保存,而不是为了备份。并且数据可能随时被系统删除。

现在这让我很困惑。据我了解,我可以在邪恶与魔鬼之间做出选择:/Library/中的数据无法在更新后保留下来,但由 iTunes 备份。/Library/Caches 中的数据在更新后仍然存在,但没有被 iTunes 备份,并且它可能随时被系统删除(因为它是一个“缓存”)。

另一方面,技术问答建议将这些重要的用户数据放在/Library/中的自定义子文件夹中,例如/Library/PrivateDocuments。

与iOS应用程序编程指南相比,技术问答说:整个/Library目录在更新和备份期间始终被保留

所以现在,真的,两个文档中的一个一定是错误的。但是哪一个?真相是什么?请不要猜测!我正在从经验中寻找答案,我觉得除了发布应用程序和祈祷之外没有办法解决这个问题。也许有人想分享他/她真正有效的经验。

最佳答案

我见过 Library/Preferences(存储 NSUserDefaults 的地方)在恢复过程中被保留,所以我认为大部分 Library 都被保留了下来。不过,缓存目录可能被排除在外。

一般来说,只需使用 API 获取路径并相信 iTunes 会保留它们,除非它们旨在表示临时文件夹。这意味着您应该使用为您的应用程序命名的 NSApplicationSupportDirectory 的子目录:

NSArray * urls = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask];
NSAssert([urls count], @"Can't get app support directory");

NSURL * url = [urls objectAtIndex:0];
url = [url URLByAppendingPathComponent:@"MyAppName"];

在实践中,这最终将成为您沙箱中的“Library/Application Support/MyAppName”,但无论如何您都应该使用该 API 以确保它不会过时。

(如果您关心对 iOS 3 或 2 的支持,请使用 NSSearchPathForDirectoriesInDomains() 函数而不是 -URLsForDirectory:inDomains: 方法。)

关于iphone - 当 Documents 目录不是一个选项时,在哪里存储私有(private)重要用户数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6114628/

相关文章:

ios - UIWebView加载网站的桌面版而不是移动版

java - 我的目标是为多个平台开发——我应该使用 Java SE 还是 ME?

javascript - 使用 JavaScript 使用图像和文本更新页面后,iPad 上 Chrome 中的网站闪烁/闪烁/闪烁

iphone - AFNetworking 缺少哪些主要的 ASIHTTPRequest 功能?

ios - wifi 连接不良导致 iPad 应用程序崩溃

iphone - 在不上传二进制文件的情况下测试 iPhone 应用程序内购买(即没有 bundle ID)

iphone - 由于流延迟,AudioQueueBufferRef 为空

ios - 如何使用 AFNetworking 管理 session ?

ios - Xcode 4.5.x 版本编辑器显示 "No Editor"消息

iOS 结果类型 'Element' 与预期类型不匹配(Swift - Coredata)