2013-12-05 3 views
2

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

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

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

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

ОБНОВЛЕНИЕ: Я нашел обходное решение, где я использую player.getIframe().contentDocument.querySelector('video').pause(), но это не идеально.

ответ

2

У меня возникли проблемы с этим. После охоты вокруг 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]; 

Вы можете игнорировать стайлинг материал в строке preparedHTML , Важными аспектами являются:

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

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

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

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

Смежные вопросы