Я пытаюсь убедиться, что пользователь просмотрел все видео на YouTube, прежде чем перейти к следующему экрану.
Я получил этот дизайн из другого ответа в SO, где я могу видеть, сколько видео действительно воспроизводилось,Проблема в том, что я получаю уведомления только за "##### Снаружи!"обработчик.
Все остальные отправляемые сообщения не работают, потому что (я думаю) функция 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!