ios - 第一次应用程序更新,用户数据丢失(存储在 Documents 目录中)

标签 ios file-io filesystems

我的第一个应用程序更新昨晚刚刚上线,我收到投诉说更新导致用户创建的数据(其中一些)消失了。我已经能够重现该问题,但无法说明原因。

在 Documents 目录中,我保存了一个关键文件,它告诉我所有用户文件的“标题”及其文件名(完整路径)。那么用户的所有文件也在Documents目录下。

当更新发生时, key 文件仍然存在(至少,我认为这是因为数据显示在应用程序的第一个屏幕上 - 应用程序在更新后会完全退出并重新启动,对吧?),但是当用户尝试导航到实际文件,没有数据,用户输入的任何新数据都不会保存。

当我不小心使用了无效的文件名(其中包含不正确的字符)时,它的行为与调试时完全一样 - 它从未保存过。但是随着更新,这些文件在旧版本中已正确保存,但在新版本中却以某种方式失败。

这是我的第一个应用程序,也是我的第一个更新,我在这里不知所措。我暂时停止销售该应用程序(不知道你不能简单地恢复到旧版本!哎呀!)并且非常感谢任何关于在哪里/如何寻找问题以及如何编写的想法不会丢失数据的良好更新。 (到目前为止,我所发现的只是“将数据保存在 Documents 目录中”,这是我已经在做的事情。)

我确实将原始应用程序保存在自己的项目中,我可以返回并重新开始工作。当我开始进行更新时,我复制了整个目录,我想知道这是否可能是问题所在?我确实更改了包含所有 XCode 文件的目录的名称,并使用了项目>重命名功能。这会以某种方式产生这种效果吗?

如果重要的话,该应用程序(原始和更新)在 4.2 及更高版本上运行。

解决方案:

我相信我已经解决了这个问题。就像我在问题开头所说的那样,我将用户文件的完整路径保存在我的 key 文件中。显然,更新后不能保证完整路径相同(我确定这在某处有记录,但我没有遇到过)。

因此,用户文件已传输到更新的新文档目录,但我在旧的绝对路径中寻找它们,即不在我的沙箱中。

通过在应用程序的 didFinishLaunching 中放置一个循环来提取有问题的文件路径文件(那个,我一直在本地寻找并且它仍在工作)并将它们切成文件名来修复。每当执行文件操作时,都必须以编程方式找到并添加文档路径。

就其值(value)而言,实际上对我来说有好处,因为没有办法恢复到商店中以前的二进制文件,因为重新安装原始版本不会解决用户的问题,但我相信它有,至少在最初。我真希望有一种方法可以禁止更新,但仍然允许新的购买(因为这个问题不影响新的购买)。不过,这种情况可能还不够常见。

最佳答案

只是为了让互联网路人对此有更多了解。是的,OP 在最后回答了他自己的问题。您永远不应在文档目录中存储文件的绝对 URL,这样做可能会导致数据丢失。这是因为当您更新应用程序时,通过更改 .plist 文件中的版本号,iOS 会使用不同的十六进制名称为该应用程序创建一个新目录。现在您的绝对 URL 引用了错误的位置,并且不会返回正确的文件。

在部署到设备之前,您可以在自己的计算机上看到它,方法是导航到

~/Library/Application Support/iPhone Simulator/*ios_version*/Applications/

在那里你会看到名称如下的文件夹:

6AA4B05C-8A38-4469-B7BE-5EA7E9712510 CB43C5F3-D720-49C3-87D4-EBE93FFD428B

这些文件夹内将是 iOS 应用程序的标准文件系统布局。即

文件 图书馆 tmp 你的App.app

通过引用整个 URL,您会看到类似这样的内容

~/Library/Application Support/iPhone Simulator/*ios_version*/Applications/6AA4B05C-8A38-4469-B7BE-5EA7E9712510/Documents/MyVeryImportantUserData.txt

但是,当您更新应用时,应用将尝试的新 URL 将是:

~/Library/Application Support/iPhone Simulator/*ios_version*/Applications/CB43C5F3-D720-49C3-87D4-EBE93FFD428B/Documents/MyVeryImportantUserData.txt

这是空的。

相反,您应该始终通过仅在获得文档目录文件路径前缀后保存文件路径来进行动态引用。

/**
 Returns the path to the application's Documents directory.
 */
- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

对于原始发布者,您可以通过发布新的更新来保存您的用户丢失的数据,您在其中修改代码以获取绝对 url 并通过字符串的文档部分修剪所有内容。然后,您可以在文件路径前加上适当的文档目录 url,应用程序就会找到数据。

关于ios - 第一次应用程序更新,用户数据丢失(存储在 Documents 目录中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5607655/

相关文章:

iOS,通过代码更改启动画面

java - 协助编写 servlet 的文件编写器方法

java - 使用java就地修改文件内容

java - 小 LibGdx 加载文件时遇到问题

file - 使用 DOS(命令提示符)将所有文件和文件夹从一个驱动器复制到另一个驱动器

linux - Linux 中的不间断写入

PHP警告: mkdir(): Not a directory when creating directory

iphone - 在 iOS 中获取 CGImageRef 的平均 RGB 颜色

ios - 回收标签栏空间

ios - 如何在uitextview或uiimage中点按突出显示特定句子