【发布时间】:2015-06-09 22:34:44
【问题描述】:
我们有一个使用 PhoneGap / Cordova 4.3.0 构建的 iOS 应用。此应用通过在config.xml 文件中使用<content src="http://example.com/foo" /> 直接加载外部网站。所有功能都包含在本网站中,因此我们实际上并未使用任何本地 HTML 或 JS 文件。
作为应用功能的一部分,我们必须播放一些视频。由于该应用程序也设计为离线工作,因此我们希望在本地缓存这些视频。因此,我们使用 FileTransfer 插件将它们与其他资源(如图像或 PDF)一起下载到设备。下载文件后,我们将使用file:// 协议获取 URL。我们还可以选择使用cdvfile:// 协议。当我们使用cdvfile:// URL 显示图像时,图像会正确显示。但是,视频根本不播放。
要播放视频,我们使用标准 HTML5 视频标签:
<video width="auto" height="100%" controls="controls" autoplay="true">
<source src="..." type="video/mp4" />
</video>
视频本身正在运行,并且可以从外部源正确播放(例如,如果我们从服务器而不是本地文件系统访问它们,它们就会播放)。我意识到这个问题与网络相关的概念有关,例如同源策略和访问本地文件系统的限制。但是,同时我必须想知道为什么图像在这些相同的约束下工作正常。
到目前为止我所尝试的:
- 使用
file://和cdvfile://URL 作为视频的src。这不会产生任何视觉效果。屏幕只是黑屏。 - 使用
iframe并将src设置为视频 URL。使用file://时,还是黑屏。但是在使用cdvfile://时,出现了iOS视频播放界面,有播放键和全屏键,但是视频不播放,也没有时间线。 - 将一个名为
video.html的本地文件添加到cordova,该文件将URL 作为参数并呈现video标记,该URL 为src。计划是将此文件作为iframe包含在内,但显然我无法将iframe添加到本地文件中。我尝试了各种可能指向该特定video.html文件的 URL(尽管实际上我不确定这是否可行)。我试过的有:cordova.file.applicationDirectory + 'www/video.html'、http://localhost/www/video.html、cdvfile://localhost/www/video.html。 - 我寻找了一些可以播放视频的 cordova 插件,但我没有找到一个适用于 iOS 的插件。大多数插件似乎都是针对 Android 的。
现在,我可能以错误的方式处理这件事。在我看来,cordova 的“标准用例”是您将 HTML/JS/CSS 文件存储在本地。像我正在使用的外部内容可能有点不寻常。我将解释使我使用此功能的此应用程序的要求。
- 该应用程序应该是为多个平台构建的(尽管我们是从 iOS 开始的)。因此我们使用 PhoneGap。
- 它应该可以在线和离线访问,尽管所有内容都来自服务器(本地不生成任何内容)。这就是我们下载内容并将其保存在本地的原因。
- 它还应该即时自动更新自身的任何部分,而无需从 App Store 进行更新。这就是我们使用外部页面的原因——因为它有一个
cache.manifest,它允许我们控制对 Web 应用程序代码的更新,同时允许它在本地缓存。这可能是需要考虑的最重要的事情,因为如果我们想在 Cordova 中本地保留一些文件,我们将不得不在 Javascript 中重新实现此缓存功能(使用尽可能薄的层)。
无论如何,我主要关心的是如何让这些视频正常工作。我愿意尝试最骇人听闻的解决方法!如果当前的开发决策确实无法实现,那么也许您可以给我一些提示,告诉我应该如何构建应用程序以使其工作并仍然满足我的要求。
非常感谢!
【问题讨论】:
-
我建议使用远程调试器并查看网络中发生的情况。也许 mime 文件类型不正确。
-
您是否在任何地方使用
.toURL()?如果是这样,请尝试替换为.toNativeURL() -
我已经尝试了这些建议,我的发现是:@SergeySnegirev 我已经调试了传入的文件。哑剧类型还可以。文件已成功下载到设备。但是,我无法调试通过
file://或cdvfile://协议发出的请求,因为它们实际上并不通过网络。 @FlyingLemon 我试过.toURL()、.toNativeURL()和.toInternalURL()。前两个给我一个file://URL,而最后一个给我一个cdvfile://URL。cdvfile://网址适用于图片,但不适用于视频。 -
@Grampa 我发现其他人也有类似的问题,尝试使用文件插件的dev分支,文件传输插件 和 媒体插件。
-
@FlyingLemon 谢谢你的建议。我刚刚尝试使用文件和文件传输插件的 dev 分支(我根本没有使用媒体插件)。但是,如果我使用此分支,则构建会失败,因为依赖于 CDVFilesystemURL 接口,无法找到该接口。我研究了一下插件代码,确实,这个接口只存在于文件插件的发布版本中。开发分支最后一次更新是在 11 个月前,所以可能代码太旧而无法使用。
标签: javascript ios cordova html5-video phonegap-build