Youtube iFrame API pauseVideo - undefined в UIWebView

Я разрабатываю приложение для iPad, которое содержит одно или несколько видео YouTube, встроенных в UIWebView. Я использую Youtube iframe API. Видео отображается хорошо, и пользователь может нормально использовать обычные средства управления. Тем не менее, я хочу приостановить видео, когда произойдет внешнее событие.

Я пытаюсь сделать это, используя stringByEvaluatingJavascripFromString с помощью "player.pauseVideo()". Однако при проверке появляется, что player.pauseVideo - undefined.

Странно это только кажется проблемой в UIWebView (или, возможно, только в iOS). Если я загружаю ту же страницу в настольный браузер player.pauseVideo работает нормально. Кроме того, когда я проверяю объект игрока в браузере, он говорит, что это объект "Y", но в UIWebView это объект "S", и большинство его методов имеют обфускации имен.

Любая помощь будет оценена.

UPDATE: я нашел обходной путь, где я использую player.getIframe().contentDocument.querySelector('video').pause(), но это не идеально.

Ответ 1

У меня были проблемы с этим. После охоты вокруг SO и повторного чтения API iFrame YouTube несколько раз, вот что я придумал, чтобы приостановить видео YouTube, загруженные в iFrame в UIWebView.

У меня есть несколько UIWebViews в разбитом на страницы UIScrollView, поэтому у меня есть метод, в котором я формирую HTML-строку для загрузки в UIWebView:

NSString *urlString = [NSString stringWithFormat:@"https://www.youtube.com/embed/%@",videoID];

preparedHTML = [NSString stringWithFormat:@"<html><body style='background:none; text-align:center;'><script type='text/javascript' src='http://www.youtube.com/iframe_api'></script><script type='text/javascript'>var player; function onYouTubeIframeAPIReady(){player=new YT.Player('player')}</script><iframe id='player' class='youtube-player' type='text/html' width='%f' height='%f' src='%@?rel=0&showinfo=0&enablejsapi=1' style='text-align:center; border: 6px solid; border-radius:5px; background-color:transparent;' rel=nofollow allowfullscreen></iframe></body></html>", 628.0f, 352.0f, urlString];

Вы можете игнорировать элементы стиля в подготовленной строке HTTML. Важными аспектами являются:

  • Использование API для создания объекта "YT.player". В какой-то момент у меня было только видео в теге iFrame и это помешало мне ссылаться на объект "player" позже с помощью JS.
  • Я видел несколько примеров в Интернете, где первый тег script (тот, у которого есть тег iframe_api src) опущен, но мне определенно нужно, чтобы это работало.
  • Создание переменной "player" в начале API script. Я также видел несколько примеров, которые пропустили эту строку.
  • Добавление тега id в iFrame для ссылки в API script. Я почти забыл эту часть.
  • Добавление "enablejsapi = 1" в конец тега iFrame src. Это повредило меня некоторое время, поскольку я изначально имел это как атрибут тега iFrame, который не работает/не работает для меня.

Когда мне нужно приостановить видео, я просто запустил это:

[webView stringByEvaluatingJavaScriptFromString:@"player.pauseVideo();"];

Я, наверное, кое-что делаю там, которые не нужны, но это то, что, наконец, начало работать для меня. Надеюсь, это поможет!