2012-08-28 108 views
0

我的应用捆绑了两个预装的视频,用户可以通过应用内购买购买更多。应用程序升级后未找到资源文件?

每个视频节目是用称为_videoFilePath(属性NSString* videoFilePath)伊娃

当视频下载完成后,文件路径被适当地设定物镜-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。必须在v1.0和v1.1上NSLog完整路径来证实这一点,但我想我已经明白了。 答案和评论仍然受欢迎。

回答

0

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

-pathForResource:ofType: 

每次。