API-интерфейс YouTube iFrame pauseVideo не определен в UIWebView

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

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

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

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

ОБНОВЛЕНИЕ: я нашел обходной путь, где я использую 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];

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

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

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

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

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

Другие вопросы по тегам