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();"];
Я, вероятно, делаю там некоторые ненужные вещи, но это то, что, наконец, начало работать для меня. Надеюсь, поможет!