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?
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.
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 ofloadHTMLString:
for some reason I can't explain. Here is a working example: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...)