美文网首页
WKWebView音视频媒体播放处理

WKWebView音视频媒体播放处理

作者: 笑笑菜鸟 | 来源:发表于2021-05-11 15:00 被阅读0次

    1. 对WKWebViewConfiguration进行设置。

    实现媒体文件可以自动播放、使用内嵌HTML5播放等功能

    // 初始化配置对象
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    // 默认是NO,这个值决定了用内嵌HTML5播放视频还是用本地的全屏控制
    configuration.allowsInlineMediaPlayback = YES;
    // 自动播放, 不需要用户采取任何手势开启播放
    // WKAudiovisualMediaTypeNone 音视频的播放不需要用户手势触发, 即为自动播放
    configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
    configuration.allowsAirPlayForMediaPlayback = YES;
    configuration.allowsPictureInPictureMediaPlayback = YES;
        
    self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
    self.webView.navigationDelegate = self;
    NSURL *url =[NSURL URLWithString:@"测试网址"];
    [self.webView loadRequest:[NSURLRequest requestWithURL:url]];
    [self.view addSubview:self.webView];
    

    由于H5的video未设置autoplay、playsinline属性。我们需自己注入,才能实现效果。

    NSString *jSString = @"document.getElementsByTagName('video')[0].setAttribute('playsinline','');";
    NSString *jSString2 = @"document.getElementsByTagName('video')[0].autoplay=true;";
    //用于进行JavaScript注入
    WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jSString injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    WKUserScript *wkUScript2 = [[WKUserScript alloc] initWithSource:jSString2 injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    [configuration.userContentController addUserScript:wkUScript];
    [configuration.userContentController addUserScript:wkUScript2];
    

    2. 监听网页内播放器的回调

    利用HTML5 Audio/Video 事件

    HTML5 Audio/Video 事件代码可以由H5同事完成,也可以由App端注入。
    注入代码如下:

    NSString *jSString3 = @"document.getElementsByTagName('video')[0].addEventListener('canplay', function(e) {window.webkit.messageHandlers.readytoplay.postMessage(\"canplay\");})";
    NSString *jSString4 = @"document.getElementsByTagName('video')[0].addEventListener('pause', function(e) {window.webkit.messageHandlers.pause.postMessage(\"pause\");})";
    NSString *jSString5 = @"document.getElementsByTagName('video')[0].addEventListener('play', function(e) {window.webkit.messageHandlers.play.postMessage(\"play\");})";
    NSString *jSString6 = @"document.getElementsByTagName('video')[0].addEventListener('ended', function(e) {window.webkit.messageHandlers.ended.postMessage(\"ended\");})";
    WKUserScript *wkUScript3 = [[WKUserScript alloc] initWithSource:jSString3 injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    [configuration.userContentController addUserScript:wkUScript3];
    WKUserScript *wkUScript4 = [[WKUserScript alloc] initWithSource:jSString4 injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    [configuration.userContentController addUserScript:wkUScript4];
    WKUserScript *wkUScript5 = [[WKUserScript alloc] initWithSource:jSString5 injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    [configuration.userContentController addUserScript:wkUScript5];
    WKUserScript *wkUScript6 = [[WKUserScript alloc] initWithSource:jSString6 injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    [configuration.userContentController addUserScript:wkUScript6];
    

    App端接收js的代码如下:
    需遵守WKScriptMessageHandler协议

    @interface ViewController () <WKNavigationDelegate,WKScriptMessageHandler>
    @end
    

    再为WKWebViewConfiguration添加协议

    //添加一个协议
    [configuration.userContentController addScriptMessageHandler:self name:@"readytoplay"];
    [configuration.userContentController addScriptMessageHandler:self name:@"play"];
    [configuration.userContentController addScriptMessageHandler:self name:@"pause"];
    [configuration.userContentController addScriptMessageHandler:self name:@"ended"];
    

    使用以下方法即可获取播放器事件

    #pragma mark - WKScriptMessageHandler
    
    //! WKWebView收到ScriptMessage时回调此方法
    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
        if ([message.name caseInsensitiveCompare:@"readytoplay"] == NSOrderedSame) {
            NSLog(@"video is readytoplay");
        }
        if ([message.name caseInsensitiveCompare:@"play"] == NSOrderedSame) {
            NSLog(@"video is play");
        }
        if ([message.name caseInsensitiveCompare:@"pause"] == NSOrderedSame) {
            NSLog(@"video is pause");
        }
        if ([message.name caseInsensitiveCompare:@"ended"] == NSOrderedSame) {
            NSLog(@"video is ended");
        }
    }
    

    参考资料:
    HTML 音频/视频参考手册
    video 属性和事件用法大全

    注意:解决WKWebView中WKScriptMessageHandler方法引起内存不释放问题,请参考我的另一篇文章

    相关文章

      网友评论

          本文标题:WKWebView音视频媒体播放处理

          本文链接:https://www.haomeiwen.com/subject/wengdltx.html