当Documents目录不是选项时,在哪里存储私有重要用户数据?

don*_*ile 6 filesystems iphone ipad ios

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

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

在这个技术问答中, Apple说这是保留下来的.根据我的理解,这意味着我可以安全地将重要的用户数据(如sqlite3数据库文件)放在此目录中.当用户更新到新版本时,将保留此目录中的内容,它将在更新后继续存在并可用:

应用程序可以在/ Library /中创建自己的目录,这些目录将保留在备份和更新中

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

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

但是,iOS应用程序编程指南中这个注释,它说明了一些完全不同的东西!在这里,他们说了Library目录:

<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.
Run Code Online (Sandbox Code Playgroud)

"不应该用于用户数据文件." (???)

但与此同时,他们承认它得到了iTunes的支持.好.那么我为什么不把用户数据文件放到那里呢?

/ Library/Caches使用此目录编写要在应用程序启动之间或应用程序更新期间保留的任何特定于应用程序的支持文件.(...)它还应该能够根据需要重新创建这些文件,因为iTunes会在完全恢复设备期间删除它们.

什么?!我应该将这些文件放在Library/Caches中.但是,如上所述,iTunes不会备份此目录.因此,这仅用于更新,而不用于备份.并且系统可以随时删除数据.

现在这让我很困惑.根据我的理解,我可以在邪恶和魔鬼之间做出选择:/ Library /中的数据不会在更新中存在,但会由iTunes备份./ Library/Caches中的数据确实存在更新,但不会被iTunes备份,并且系统可能会随时将其删除(因为它是"缓存").

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

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

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

Bre*_*don 4

我已经看到库/首选项(存储 NSUserDefaults 的位置)在恢复过程中被保留,所以我认为大部分库都被保留。不过,缓存目录可能被排除在外。

一般来说,只需使用 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"];
Run Code Online (Sandbox Code Playgroud)

实际上,这最终将成为沙箱中的“Library/Application Support/MyAppName”,但无论如何您都应该使用 API 以确保它能够面向未来。

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