解决页面退出 WebView 继续播放视频音乐的问题

前言

在iOS的开发中,使用webview/wkwebview加载H5页面,已经是司空见惯的行为了。本篇就源于在开发中解决页面跳转后 webview中视屏没有停止播放的问题。

解决方案

1、native调用js function

前端同事给一个Function 原生在合适的地方 直接调用

    [_wkweb evaluateJavaScript:@"pausePlay()" completionHandler:^(id _Nullable, NSError * _Nullable error) {

    }];

结果:失败。 因为这个包含video标签 不是直接在html文件中,在html中的iframe 标签中。不能直接通过document获取到。 这也导致了 我们同样不能自己添加注入WKUserScript 来实现我们的效果。

2、处理iframe嵌套问题

通过注入js,获取到iframe 内嵌html的操作对象 然后获取到我们想要的video标签 进行操作。

var frameDoc=document.getElementById('iframeId').contentWindow.document
var videos = document.getElementsByTagName("video");
  function pausePlay(){
    for(var i = 0; i < videos.length; i++){
        var video = videos[i];
        video.pause();
    }
}

结果:失败,iframe同源下才可进行上面的操作,我们前端提供的iframe 嵌套的是腾讯的视频。。。。此操作跨域,无解!!!!

3、寻求万能的百度(copy)

重新加载该 webView ,或者加载一个空的地址;缺点:如果该页没有视频,或者视频并没有播放,则没必要重新加载,这可能会带来其他不必要的问题


通过监听所有系统的 NSNotification
[[NSNotificationCenter defaultCenter] addObserverForName:@"UIWindowFirstResponderDidChangeNotification"
object:nil
queue:nil
usingBlock:^(NSNotification* notification) {
NSLog(@"Notification:\n"
"name: %@\n"
"object: %@\n"
"userInfo: %@",
notification.name,
notification.object,
notification.userInfo);
}];
发现当点击视频进行播放时,能接收到一个
name=UIWindowFirstResponderDidChangeNotification
的通知,userInfo 是 WKContent ,OK 可以依据该通知按照上述第二套方案进行有针对性的处理。

结果:失败。 通过结果测试,并不是点击视频播放才出发此类的通知事件,包括在h5面,各种跳转也会触发到此类通知 因为我们没有video的链接地址 不希望做无用的刷新。。。。所以再次无效。。。。

4、弯道超车

不愿意轻易放弃的我,通过各种抓包终于发现了后端下发的链接地址中,终于发现了只有包含video的iframe中标签 className 才是 video_iframe. 机智(无奈)的我只能投机取巧。。。。

/// 注入js代码
var length = document.getElementsByClassName("video_iframe").length;
function getVideoElementLength(){
    return length;
}

在合理的地方调用


    [_wkweb evalJavaScript:@"getVideoElementLength()" completion:^(id obj, NSError *error) {
        if(!error){
            bool h =  [obj boolValue]; /// true 则存在video.

        }
    }];

在页面离开的时候

 [_wkweb loadHTML:@""]; /// 刷新页面 无奈的停止 视频的播放

结果:目的和效果 似乎是达到了,目前还在寻求更好的解决方案。。。。

你可能感兴趣的:(iOS)