0

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

每个视频片段都是一个带有名为_videoFilePath(property NSString* videoFilePath)的 ivar 的 Objective-C 对象

视频下载完成后,文件路径已正确设置。对于预装的剧集,它在启动时使用如下代码设置一次:

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

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

我注意到有些用户在升级我的应用程序后可以播放预装的视频。我目前正在对此进行调查,因此我从设备中删除了该应用程序,安装了 1.0 版(从 Xcode->Run),将 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 上的完整路径来确认这一点,但我想我明白了。仍然欢迎回答和评论。

4

1 回答 1

0

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

-pathForResource:ofType:

每一次。

于 2012-09-03T03:22:14.367 回答