目前在做一个新闻客户端,遇到这样一个需求。
如果是可以听的新闻,在用户启动音频播放器后,如果用户从当前VC返回,会有一个弹窗保持音频播放并可以弹回播放页面。
如果用户接下来打开外部网站的新闻,而刚好新闻中有视频,在用户播放视频时,由于是外部网站,播放动作无法捕获,造成APP中视频和音频同时播放的BUG。
目前的解决方案是在加载含有视频外部网站时,通过添加一段JS代码,来获取播放动作,从而在用户开始播放视频后,进行下一步的操作。
ps:只能对网页中有video标签的情况生效,若视频中的视频是通过iframe加载的,则暂时没有相应的解决方案。
先放JS代码 videohandler.js:
(function () {
var scheme ='videohandler://';
var videos = document.getElementsByTagName('video');
for (var i =0; i < videos.length; i++) {
videos[i].addEventListener('play', onPlay,false);
videos[i].addEventListener('ended', onEnded,false);
videos[i].addEventListener('webkitbeginfullscreen', onBeginFullScreen,false);
videos[i].addEventListener('webkitendfullscreen', onEndFullScreen,false);
}
function onPlay() {
window.location = scheme + 'video-play';
}
function onEnded() {
window.location = scheme + 'video-ended';
}
function onBeginFullScreen() {
window.location = scheme + 'video-beginfullscreen';
}
function onEndFullScreen() {
window.location = scheme + 'video-endfullscreen';
}
})();
将JS文件放在Resources文件夹下
生成插入js代码的String的函数
- (NSString *)myVideoHandlerJavaScriptString
{
staticNSString *videoHandlerString;
if (!videoHandlerString) {
NSString *videoHandlerPath = [[NSBundlemainBundle] pathForResource:@"videohandler"
ofType:@"js"];
NSError *error =nil;
videoHandlerString =
[NSStringstringWithContentsOfFile:videoHandlerPath
encoding:NSUTF8StringEncoding
error:&error];
if (error) {
NSLog(@"videohandler.js加载失败");
}
}
return videoHandlerString;
}
在WebView加载完成后注入js代码
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"webViewDidFinishLoad");
NSString *videoHandlerString = [selfmyVideoHandlerJavaScriptString];
if (videoHandlerString) {
[webView stringByEvaluatingJavaScriptFromString:videoHandlerString];
}
[self.loadStateBackViewremoveFromSuperview];
}
最后在代理中监控状态
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
if ([request.URL.schemeisEqualToString:@"videohandler"]) {
NSLog(@"%@", request.URL);
returnNO;
}
returnYES;
}
完成之后就可以在监控到相应动作之后进行逻辑操作。