【问题标题】:onYouTubeIframeAPIReady does not fire in WKWebView in iOS applicationonYouTubeIframeAPIReady 在 iOS 应用程序的 WKWebView 中不会触发
【发布时间】:2019-10-22 18:19:55
【问题描述】:

我试图确保用户在转到下一个屏幕之前已经观看了整个 YouTube 视频。

我从 SO 中的另一个回复中得到了这个设计,在那里我可以看到实际播放了多少视频。问题是,我只收到“##### Outside!”的通知。处理程序。

所有其他正在发送的消息都不起作用,因为(我认为)onYouTubeIframeAPIReady 函数永远不会执行。

这是一个活生生的例子,效果很好:http://jsfiddle.net/sg6zkrmp/

所以我不明白为什么它在这里不适合我。

   func setUpUI() {
        let js = """
            var player, timer, timeSpent = [], display = document.getElementById('display');

            function onYouTubeIframeAPIReady() {
                window.webkit.messageHandlers.clickListener.postMessage('API Ready!');
                player = new YT.Player( 'player', {
                    events: { 'onStateChange': onPlayerStateChange }
                });
            }

            function onPlayerStateChange(event) {
                window.webkit.messageHandlers.clickListener.postMessage('a change occurred');
                if(event.data === 1) { // Started playing
                    if(!timeSpent.length){
                        for(var i=0, l=parseInt(player.getDuration()); i<l; i++) timeSpent.push(false);
                    }
                    timer = setInterval(record,100);
                } else {
                    clearInterval(timer);
                }
            }

            function record(){
                window.webkit.messageHandlers.clickListener.postMessage('Recording!');
                timeSpent[ parseInt(player.getCurrentTime()) ] = true;
                showPercentage();
            }

            function showPercentage(){
                var percent = 0;
                for(var i=0, l=timeSpent.length; i<l; i++){
                    if(timeSpent[i]) percent++;
                }
                percent = Math.round(percent / timeSpent.length * 100);
                window.webkit.messageHandlers.clickListener.postMessage('Give me that percentage!!');
            }
            window.webkit.messageHandlers.clickListener.postMessage('##### Outside!');
        """
        let script = WKUserScript(source: js, injectionTime: .atDocumentEnd, forMainFrameOnly: false)

        let webConfiguration = WKWebViewConfiguration()
        webConfiguration.allowsInlineMediaPlayback = true
        webConfiguration.userContentController.addUserScript(script)
        webConfiguration.userContentController.add(self, name: "clickListener")
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        webView.backgroundColor = .red

     .......

        let html = """
           <iframe id="player" src="https://www.youtube.com/embed/DjB1OvEYMhY?enablejsapi=1"></iframe>
           <p id="display"></p>
        """
        webView.loadHTMLString(html, baseURL: nil)
    }
    .......
       func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
    {
        print("------> ", message.body)
    }
}

顺便说一句,当视图加载时,我可以看到打印了多次而不是一次的消息:

------>  ##### Outside!
------>  ##### Outside!
------>  ##### Outside!
------>  ##### Outside!
------>  ##### Outside!
------>  ##### Outside!

【问题讨论】:

    标签: swift youtube embed wkwebview


    【解决方案1】:

    好吧,我为任何感兴趣的人买了它。我只需要将它添加到我的 html 中:

    let html = """
               <script src="https://www.youtube.com/iframe_api"></script>
               <iframe id="player" src="https://www.youtube.com/embed/DjB1OvEYMhY?enablejsapi=1&controls=0&playsinline=1"></iframe>
               <p id="display"></p>
            """
    

    现在它工作得非常好。

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多