iOS 8中UIWebview无法良好显示嵌入的YouTube视频

3

我在UIWebview中无法播放嵌入的YouTube视频。

如果我使用了Youtube默认的嵌入格式,在UIWebview中什么也不会显示,只有空白。

NSString *htmlString = @"<html><body><iframe width=\"420\" height=\"315\" src=\"//www.youtube.com/embed/XNnaxGFO18o?rel=0\" frameborder=\"0\" allowfullscreen></iframe></body></html>";
[self.webView loadHTMLString:htmlString baseURL:nil];

我在谷歌上搜索并找到了以下代码可行。
NSString* embedHTML = @"\
<html><body style=\"margin:0;\">\
<<div class=\"emvideo emvideo-video emvideo-youtube\"><embed id=\"yt\" src=\"http://www.youtube.com/embed/bPM8LKYMcXs?hd=1\" width=\"320\" height=\"250\"></embed></div>\
</body></html>";
[self.webView loadHTMLString:embedHTML baseURL:nil];

然而,这里有一个问题。如果我点击播放按钮,它没有反应。我必须点击几次播放按钮并等待一段时间,然后它开始旋转并播放。
所以我有两个问题。
1)你有更好的方法在UIWebView中播放嵌入的YouTube视频吗? 2)如何在点击播放按钮后立即播放视频?
谢谢。
1个回答

1
创建一个普通的 html 文件,将其命名为 youtubeEmbedding.html 并将其添加到你的项目中,在 youtubeEmbedding.html 中只需将下面的代码添加到 .html 文件中。
<!DOCTYPE html>
<html>
<head>
    <style>body{margin:0px 0px 0px 0px;}</style>
</head>
<body>
    <div id="player"></div>
    <script>
        var tag = document.createElement('script');
        tag.src = 'http://www.youtube.com/player_api';

        var firstScriptTag = document.getElementsByTagName('script')[0];
        firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
        firstScriptTag.requestFullScreen();
        var ytplayer = null;

        function onYouTubePlayerAPIReady() 
        {
            ytplayer = new YT.Player(
                                     'player',
                                     {
                                     videoId:'%@',
                                     width:'%0.0f',
                                     height:'%0.0f', %@
                                     playerVars:
                                     {
                                     'controls': %d,
                                     'playsinline' : 0,
                                     'rel':0,
                                     'showinfo':0
                                     },
                                     });
        }


    function onPlayerReady(event)
    {
        event.target.playVideo();
    }

    function stopVideo()
    {
        if (ytplayer)
        {
            ytplayer.stopVideo();
            ytplayer.clearVideo();
        }
        return 'STOPPED';
    }

    function playVideo()
    {
        if (ytplayer)
        {
            ytplayer.playVideo();
        }
        return 'PLAY';
    }

    function pauseVideo()
    {
        if (ytplayer)
        {
            ytplayer.pauseVideo();
            ytplayer.clearVideo();
        }
        return 'PAUSED';
    }

    function getPlayerState()
    {
        return ytplayer.getPlayerState();
    }

    function isPlaying()
    {
        return (myPlayerState == YT.PlayerState.PLAYING);
    }
    function isPaused()
    {
        return (myPlayerState == YT.PlayerState.PAUSED);
    }
    function onPlayerError(event)
    {
        alert("Error");
    }
    </script>
</body>

在使用Web视图的控制器中,只需按以下方式操作。
- (void)viewDidLoad
{
   BOOL autoPlay = NO;
   // Do any additional setup after loading the view, typically from a nib.
   NSString *youTubeVideoHTML  = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"youtubeEmbedding" ofType:@"html"] encoding:NSUTF8StringEncoding error:nil];
   NSString *autoPlayString    =  autoPlay ? @"events: {'onReady' : onPlayerReady }," : @""; //customise it weather u want to autoplay or not
   NSURL *url = [NSURL URLWithString:@"https://www.youtube.com/watch?v=AYo72E7ZMHM"];
   NSString *lastComponent = [url query];
   NSString *videoId   = [lastComponent  stringByReplacingOccurrencesOfString:@"v=" withString:@""]; //get  the video id from url
   NSInteger controls  = 1; //i want to show controles for play,pause,fullscreen ... etc
   NSString *html      = [NSString stringWithFormat:youTubeVideoHTML, videoId, CGRectGetWidth(_webView.frame), CGRectGetHeight(_webView.frame), autoPlayString, controls]; //setting the youtube video width and height to fill entire the web view 
  _webView.mediaPlaybackRequiresUserAction = NO;
  _webView.delegate = self; //not needed
  [_webView loadHTMLString:html baseURL:[[NSBundle mainBundle] resourceURL]]; //load it to webview

}


//for playing action 
- (IBAction)playAction:(id)sender 
{
  [_webView stringByEvaluatingJavaScriptFromString:@"ytplayer.playVideo()"];
}

如果您有任何问题,请评论,希望这能对您有所帮助.. :)


奇怪,UIWebView是空白的。我打印出HTML,它有正确的内容。 - user890207
@user890207 在新项目中测试它 - Shankar BS
是的,这很奇怪。自从昨天起,即使是我的旧代码也能正常工作。看来谷歌做了一些更改。谢谢! - user890207

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接