How to get YouTube autoplay to work in UIWebView?

2019-02-11 05:36发布

Platform: iOS 6.1. Xcode 4.6.

I am using YouTube Javascript API and a UIWebView. I am able to manually tap on the video thumbnail to begin playback just fine. But, autoplay is not working. I am setting mediaPlaybackRequiresUserAction = NO for the web view as many have suggested. No luck.

Here is the code:

@interface VideoPlayerController : UIViewController <UIWebViewDelegate>
    @property(strong, nonatomic) IBOutlet UIWebView* webView;
@end

- (void) viewDidLoad
{
    [super viewDidLoad];    

    self.webView.delegate = self;

    NSString *template = [NSString stringWithContentsOfFile:
                       [[NSBundle mainBundle]
                        pathForResource:@"YouTubeTemplate" ofType:@"txt"]];
    NSString *htmlStr = [NSString stringWithFormat: template,
        200, 200,
        @"3G4exdlsRkY"];
    self.webView.mediaPlaybackRequiresUserAction = NO;
    [self.webView loadHTMLString:htmlStr baseURL:nil];
}

- (void) webViewDidFinishLoad:(UIWebView *)wv {
    self.webView.mediaPlaybackRequiresUserAction = NO;
}

The YouTubeTemplate.txt file is:

<html>
<head>
<script src="https://www.youtube.com/player_api"></script>
<style>
body, div {
    margin: 0px;
    padding: 0px;
}
</style>
</head>
<body>
  <div id="media_area"></div>
</body>
<script>
var ytPlayer = null;

function onYouTubePlayerAPIReady() {
    ytPlayer = new YT.Player('media_area', {height: '%d', width: '%d', videoId: '%@',
        events: {'onReady': onPlayerReady}
    });
}

function onPlayerReady(e) {
    e.target.playVideo();
}
</script>
</html>

So, basically, the UIWebView shows the video thumbnail. Then I have to tap on it to begin playback. Autoplay is not working. Any idea what I might be doing wrong?

2条回答
混吃等死
2楼-- · 2019-02-11 06:08

UIWebView does not respect autoplay because of Apple's concerns over mobile bandwidth use age (I.e a video begins playing when the page is loaded, and the user is on a cellular network, and it gobbles up their data). You'll either have to access the DOM (if possible on iOS, not sure) and trigger it manually or work around it.

查看更多
我只想做你的唯一
3楼-- · 2019-02-11 06:16

Yes, you can make it autoplay by setting mediaPlaybackRequiresUserAction to NO. This is a project based on your HTML file, and it does autoplay after the app launch.

https://dl.dropbox.com/u/17350105/YoutubeAutoPlay.zip

Edit
As @RajV mentioned in the comment, you should use loadRequest: instead of loadHTMLString: for some reason I can't explain. Here is a working example:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 150)];
    [webView setMediaPlaybackRequiresUserAction:NO];
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"YT_Player" ofType:@"html"] isDirectory:NO]]];
    [self.view addSubview:webView];
}

By the way, if you want to play youtube video inline, you can follow this answer I posted few days ago. (Oh, I just spent so many hours on Youtube iFrame API these days...)

查看更多
登录 后发表回答