我的应用程序捆绑了两个预装的视频,用户可以通过应用内购买购买更多。
每个视频集都是一个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上的完整路径来确认这一点,但我想我明白了。 答案和评论仍然受到欢迎。
答案 0 :(得分:0)
因此,正如我在经过一番思考后意识到的那样,捆绑资源的完整路径似乎在应用程序的每次升级时都会略有变化;具体来说,是“长,自动生成的数字和字母随机字符串”中间目录。我的错误是在第一次安装时保存(即硬编码)路径,并在应用升级后使用该值。 我解决了它没有缓存路径而是使用
-pathForResource:ofType:
每一次。