Documents目录不是一个选项时,在哪里存储私人重要的用户数据?

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

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

在这个技术问答中,苹果公司说这个问题得到了保留。 从我的理解,这意味着我可以放心地把重要的用户数据,如sqlite3数据库文件在这个目录中。 当用户更新到新版本时,该目录内的内容将被保留,并在更新之后生存并可用:

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

所以/ Library /被保存在备份和更新中。

对于我这个英文不好的人来说,这意味着:是的,数据会存活下来。 用户备份时不会丢失。 用户更新时不会丢失。 我在几本字典中查找了“保存”这个词,我相信这意味着“它会生存下去”。

但是, 在iOS应用程序编程指南中有这个说明,它告诉完全不同的东西! 在这里,他们对图书馆目录说:

<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使用此目录编写任何应用程序特定的支持文件,您希望在应用程序启动之间或在应用程序更新期间保留这些支持文件。 (…)它也应该能够根据需要重新创build这些文件,因为iTunes在完全恢复设备的过程中将其删除。

什么?! 我应该把这些文件放在Library / Caches中。 但是,如上所述,这个目录不是由iTunes备份的 。 所以这只是保存更新,而不是备份。 系统可能随时删除数据。

现在这完全混淆了我。 根据我的理解,我可以在邪恶和魔鬼之间做出select:数据在/ Library /不能保存更新,而是由iTunes支持。 数据在/库/caching不会更新,但不备份的iTunes,它可能会被系统删除(因为它是一个“caching”)随时。

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

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

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

我已经看到图书馆/首选项(NSUserDefaults存储在哪里)保存在恢复,所以我认为大部分库保存。 但是caching目录可能被排除在外。

通常,只需使用API​​来获取path并相信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"]; 

在实践中,这将最终成为沙箱中的“图书馆/应用程序支持/ MyAppName”,但是您仍然应该使用API​​来确保这一点能够保持未来。

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

你为什么不试试钥匙扣? 如果您的数据不是太广泛,它可以提供一个快速的方式来存储敏感信息

来自Apple的钥匙串文档

库文件夹内的内容(caching除外)由iTunes进行备份。

苹果所说的“不应该用于用户数据文件”。 (???)是不要使用这个文件夹的数据,你想通过iTunes在文件共享系统中查看。

所以,如果你想让用户通过iTunes访问数据,请写入/ Document文件夹

如果要隐藏用户写入到/ Library文件夹的数据