ohD*_*ear 54 filesystems file-io ios
我的第一个应用程序更新昨晚刚刚上线,我得到一个投诉,更新导致用户创建的数据(其中一些)消失.我已经能够重现这个问题,但不知道为什么.
在Documents目录中,我保存了一个密钥文件,它告诉我所有用户文件的"标题"及其文件名(完整路径).然后,所有用户的文件也在Documents目录中.
当更新发生时,密钥文件仍然存在(至少,我认为这是因为数据显示在应用程序的第一个屏幕 - 应用程序完全退出并在更新后重新启动,对吧?),但是当用户尝试时导航到实际文件中,没有数据,用户输入的任何新数据永远不会保存.
当我意外地使用无效的文件名(其中包含不正确的字符)时,它的行为与调试时完全相同 - 它从未保存过.但是通过更新,这些文件已在旧版本中正确保存,但在新版本中以某种方式失败.
这是我的第一个应用程序和我的第一个更新,我在这里很茫然.我暂时从应用程序中取出应用程序(不知道你不能简单地恢复到旧版本!哎呀!)并且会非常感谢关于在哪里/如何查找问题以及如何编写的任何想法一个不会丢失数据的GOOD更新.(到目前为止,我发现的只是"在Documents目录中保存数据",这就是我已经在做的事情.)
我确实将原始应用程序保存在自己的项目中,我可以再次返回并继续工作.当我开始处理更新时,我复制了整个目录,我想知道这是否会出现问题?我确实更改了包含所有XCode文件的目录的名称,并使用了Project> Rename函数.这会有什么影响吗?
应用程序(原始版本和更新版本)在4.2及更高版本上运行,如果这很重要的话.
解析度:
我相信我已经找到了这个问题.就像我在问题开头附近说的那样,我在用户密钥文件中保存了用户文件的全部路径.显然,更新后的完整路径不保证是相同的(我确定这是在某处记录的,但我没有碰到它).
因此,用户文件HAD已被传输到更新的新文档目录,但我在旧的绝对路径中寻找它们,即不在我的沙箱中.
通过在应用程序的didFinishLaunching中放置一个循环来解决文件路径的违规文件(那个,我一直在本地寻找并且它仍在工作)并将它们切换到只有fileNAMES.每当执行文件操作时,都必须以编程方式找到并添加Documents路径.
对于它的价值,对我来说实际上很好的是没有办法在商店中恢复到以前的二进制文件,因为重新安装原始版本不会解决用户的问题,但我相信它至少有,至少原来.我确实希望有一种方法可以禁止更新,但仍允许新购买(因为问题不影响新购买).但是,可能不是一个普通的情况.
And*_*rew 57
只是为了让互联网路人更加了解这一点.是的,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 YourApp.app
通过引用整个URL,你会看到类似的东西,
〜/资源库/应用程序支持/ iPhone模拟器/**ios_version /应用/ 6AA4B05C-8A38-4469-B7BE-5EA7E9712510 /文档/ MyVeryImportantUserData.txt
但是,当您更新应用时,应用将尝试的新网址将是:
〜/资源库/应用程序支持/ iPhone模拟器/**ios_version /应用/ CB43C5F3-D720-49C3-87D4-EBE93FFD428B /文档/ MyVeryImportantUserData.txt
这是空的.
相反,您应该始终通过在获得文档目录文件路径前缀后保存文件路径来创建动态引用.
/**
Returns the path to the application's Documents directory.
*/
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
Run Code Online (Sandbox Code Playgroud)
对于原始海报,您可以通过发布新更新来保存用户丢失的数据,其中您修改了代码以获取绝对URL并通过字符串的文档部分修剪所有内容.然后你可以在文件路径前加上正确的文档目录url,应用程序就可以找到数据了.