重新安装应用程序后 NSBundle 文件引用丢失

Posted

技术标签:

【中文标题】重新安装应用程序后 NSBundle 文件引用丢失【英文标题】:NSBundle File References Lost After App Reinstalled 【发布时间】:2012-12-13 04:03:01 【问题描述】:

我将音频文件的用户偏好保存在NSUserDefaults 中,其 URL 构建如下:

soundURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/audioFile1.m4r", [[NSBundle mainBundle] resourcePath]]];

随后会像这样检索该偏好:

self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.audioURL error:&error];

这效果很好,直到最近当应用程序通过 TestFlight 进行临时部署以进行 beta 测试时,我都没有遇到任何问题。现在,重新安装应用程序后,声音不会播放。日志显示路径依赖于新安装时已更改的 GUID(或等效项):

file://localhost/var/mobile/Applications/D74D8B09-5B27-4EF9-A344-68304CFE5549/myApp.app/audioFile1.m4r

已存储在首选项中,但在后续安装中构建时的 URL 为:

file://localhost/var/mobile/Applications/5F607CD7-6E32-45F0-9897-0DDBACBDD6B0/myApp.app/audioFile1.m4r

所以我的问题是:我做错了吗?如果是这样,正确的方法是什么?为什么这只发生在 TestFlight 下?

【问题讨论】:

【参考方案1】:

您永远不会在您的文档目录中存储文件的绝对 URL。这是因为当您更新应用程序时,iOS 会为该应用程序创建一个具有不同十六进制名称的新目录。 现在您的绝对 URL 引用了错误的位置,并且不会返回正确的文件。

应用更新期间保存的文件

当用户下载应用更新时,iTunes 会将更新安装在 新的应用程序目录。然后它将用户的数据文件从旧的 在删除旧的应用程序之前安装到新的应用程序目录 安装。以下目录中的文件保证为 在更新过程中保留:

<Application_Home>/Documents

<Application_Home>/Library

虽然其他用户目录中的文件也可能被移动,但你 不应依赖它们在更新后出现。

详情请咨询iPhoneOSProgrammingGuide

【讨论】:

感谢您通知我。我以前没有遇到过。 @ZomZom: 很高兴老兄:)

以上是关于重新安装应用程序后 NSBundle 文件引用丢失的主要内容,如果未能解决你的问题,请参考以下文章

无法启动此程序,因为计算机中丢失VCRUNTIME140.dll 尝试重新安装此程序以解决此问题

计算机丢失Duilib.dll,尝试重新安装该程序以解决问题,怎么弄

计算机丢失Duilib.dll,怎么操作能重新安装该程序以解决问题

为啥我的非静态游戏对象在场景重新加载后会在脚本中丢失其引用?

打开QT_Creator提示计算机丢失python36.dll,请重新安装程序后重试

电脑缺失dll文件怎么办,我试过360也不行,也修复不了,重新安装程序也不行?