我的应用捆绑了两个预装的视频,用户可以通过应用内购买购买更多。
每个视频片段都是一个带有名为_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 上的完整路径来确认这一点,但我想我明白了。仍然欢迎回答和评论。