应用升级后找不到资源文件?

时间:2012-08-28 07:17:03

标签: ios nsfilemanager foundation

我的应用程序捆绑了两个预装的视频,用户可以通过应用内购买购买更多。

每个视频集都是一个Objective-C对象,其中包含名为_videoFilePath的ivar(属性NSString* videoFilePath

视频完成下载后,将适当设置文件路径。对于预安装的剧集,它在启动时设置一次,代码如下:

NSString* fileName = [NSString stringWithFormat:@"Chapter_%03d", _episodeNumber];
self.videoFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"m4v"];

(剧集元数据在第一次运行时从捆绑的.plist初始化,并且该.plist的副本保存在/ Documents中并用于后续运行。这是因为元数据是读/写的,但捆绑的资源是只读)

我注意到有些用户可以在升级我的应用后播放预装的视频。我目前正在研究这个,所以我从设备中删除了应用程序,安装了1.0版本(从Xcode-> Run),Archived版本1.1作为AdHoc,并将其安装在顶部。 正如预期的那样,预装的剧集将无法播放。

所以这次我在Xcode上构建/运行1.1版,在AdHoc安装之上,启用了一些断点。

已购买(下载)的剧集将保存到缓存中,因此有效文件路径的存在不足以保证播放(可能会被系统删除)。所以我在尝试播放之前使用NSFileMananger检查文件是否存在,代码如下:

if (_videoFilePath) {
        // Video File Path is Set...

        if ([[NSFileManager defaultManager] fileExistsAtPath:_videoFilePath]) {
            // ...and file exists in system; 
            // Can Play:

            return YES;                
        }
        else{
            // ...but file has been deleted, possibly as a result of a 
            // restore from iTunes backup; 
            // Can Not Play:

            return NO;
        }
    }

断点显示fileExistsAtPath:测试失败;但是,控制台将_videoFilePath的值显示为:

/var/mobile/Applications/CEAA80EF-A85F-4C60-929D-9BA18E8D1702/[App Name]/Chapter_001.m4v

那么,是什么给出了?

注意:删除应用并重新安装1.1版似乎可以解决问题。 当您在1.0之上升级到1.1时,该错误才会显现。

附录

经过一段时间的思考(把事情写下来帮助),我想我已经弄明白了。资源的文件路径在第一次运行版本1.0时获取,并与其余元数据一起保存在/ Documents文件夹中。在升级时,我假设应用程序路径的“随机数字,字母和连字符”部分更改为其他内容,因此版本1.0中的“硬编码”路径将成为损坏的URL。必须NSLog在v1.0和v1.1上的完整路径来确认这一点,但我想我明白了。 答案和评论仍然受到欢迎。

1 个答案:

答案 0 :(得分:0)

因此,正如我在经过一番思考后意识到的那样,捆绑资源的完整路径似乎在应用程序的每次升级时都会略有变化;具体来说,是“长,自动生成的数字和字母随机字符串”中间目录。我的错误是在第一次安装时保存(即硬编码)路径,并在应用升级后使用该值。 我解决了它没有缓存路径而是使用

-pathForResource:ofType:

每一次。