J'ai vu beaucoup de messages ici sur ce problème, mais je n'ai toujours pas trouvé de réponse parfaite à ce problème.
J'ai donc une vue de table, et chaque cellule a un bouton de lecture à l'intérieur. Lorsque l'utilisateur appuie sur le bouton de lecture, j'ajoute un UIWebView
à cette cellule et je joue une vidéo YouTube.
static NSString *youTubeVideoHTML = @"<html>\
<body style=\"margin:0;\">\
<iframe class=\"youtube-player\" type=\"text/html\" width=\"%0.0f\" height=\"%0.0f\" src=\"http://www.youtube.com/embed/%@\" frameborder=\"0\">\
</iframe>\
</body>\
</html>";
- (void)playVideoWithId:(NSString *)videoId {
NSString *html = [NSString stringWithFormat:youTubeVideoHTML, self.frame.size.width, self.frame.size.height, videoId];
[self loadHTMLString:html baseURL:nil];
}
Le problème:
Ce code ne lit pas la vidéo comme je le souhaite, il suffit de lancer le lecteur YouTube et de l'afficher avec le bouton de lecture rouge YouTube. Ce n'est que lorsque l'utilisateur touche le bouton rouge que la vidéo commence à jouer.
L'utilisateur doit donc appuyer sur deux boutons jusqu'à ce que la vidéo démarre - pas la meilleure expérience utilisateur ...
Comme je l'ai dit, j'ai vu de nombreux messages sur ce problème, certains ne fonctionnent pas du tout, et certains fonctionnent, mais avec certains problèmes qui me dérangent.
L'une des solutions de travail que j'ai trouvées était dans ce post par @ilias, il montre comment faire fonctionner cela en chargeant le HTML à partir d'un fichier (au lieu d'une chaîne comme je le fais), problème avec cette approche est que pour chaque vidéo que je joue, je dois:
chargez le fichier htm -> intégrez l'ID de la vidéo dedans -> écrivez le fichier sur le disque -> seulement maintenant je peux lire la vidéo.
Chose étrange, cette solution ne fonctionne que lorsque vous chargez la demande de vue Web à partir d'un fichier, si j'essaie de charger la demande à partir d'une chaîne égale au contenu du fichier, cela ne fonctionne pas.
Apparemment, le problème était lié à l'URL de base nulle, lorsque je l'ai changé pour resourceURL, la lecture automatique a fonctionné.
[self loadHTMLString:html baseURL:[[NSBundle mainBundle] resourceURL]];
Le code complet pour les vidéos YouTube en lecture automatique (encore une fois, ce code est principalement basé sur ce message Je viens de le changer pour le charger à partir d'une chaîne au lieu d'un fichier):
static NSString *youTubeVideoHTML = @"<!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); var player; function onYouTubePlayerAPIReady() { player = new YT.Player('player', { width:'%0.0f', height:'%0.0f', videoId:'%@', events: { 'onReady': onPlayerReady, } }); } function onPlayerReady(event) { event.target.playVideo(); } </script> </body> </html>";
- (void)playVideoWithId:(NSString *)videoId {
NSString *html = [NSString stringWithFormat:youTubeVideoHTML, self.frame.size.width, self.frame.size.height, videoId];
[self loadHTMLString:html baseURL:[[NSBundle mainBundle] resourceURL]];
}
La clé ici est de définir playsinline=1
dans votre lecteur iFrame et allowsInlineMediaPlayback = true
et mediaPlaybackRequiresUserAction = false
pour votre UIWebView
. Voici mon implémentation dans Swift:
// Set up your UIWebView
let webView = UIWebView(frame: self.view.frame) // or pass in your own custom frame rect
self.view.addSubview(webView)
self.view.bringSubviewToFront(webView)
// Set properties
webView.allowsInlineMediaPlayback = true
webView.mediaPlaybackRequiresUserAction = false
// get the ID of the video you want to play
let videoID = "zN-GGeNPQEg" // https://www.youtube.com/watch?v=zN-GGeNPQEg
// Set up your HTML. The key URL parameters here are playsinline=1 and autoplay=1
// Replace the height and width of the player here to match your UIWebView's frame rect
let embededHTML = "<html><body style='margin:0px;padding:0px;'><script type='text/javascript' src='http://www.youtube.com/iframe_api'></script><script type='text/javascript'>function onYouTubeIframeAPIReady(){ytplayer=new YT.Player('playerId',{events:{onReady:onPlayerReady}})}function onPlayerReady(a){a.target.playVideo();}</script><iframe id='playerId' type='text/html' width='\(self.view.frame.size.width)' height='\(self.view.frame.size.height)' src='http://www.youtube.com/embed/\(videoID)?enablejsapi=1&rel=0&playsinline=1&autoplay=1' frameborder='0'></body></html>"
// Load your webView with the HTML we just set up
webView.loadHTMLString(embededHTML, baseURL: NSBundle.mainBundle().bundleURL)
Voici la solution complète:
//
// S6ViewController.m
//
//
// Created by Ökkeş Emin BALÇİÇEK on 11/30/13.
// Copyright (c) 2013 Ökkeş Emin BALÇİÇEK. All rights reserved.
//
#import "S6ViewController.h"
@interface S6ViewController ()
@end
@implementation S6ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self playVideoWithId:@"sLVGweQU7rQ"];
}
- (void)playVideoWithId:(NSString *)videoId {
NSString *youTubeVideoHTML = @"<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); var player; function onYouTubePlayerAPIReady() { player = new YT.Player('player', { width:'768', height:'1024', videoId:'sLVGweQU7rQ', events: { 'onReady': onPlayerReady } }); } function onPlayerReady(event) { event.target.playVideo(); } </script> </body> </html>";
NSString *html = [NSString stringWithFormat:youTubeVideoHTML, videoId];
UIWebView *videoView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)];
videoView.backgroundColor = [UIColor clearColor];
videoView.opaque = NO;
//videoView.delegate = self;
[self.view addSubview:videoView];
videoView.mediaPlaybackRequiresUserAction = NO;
[videoView loadHTMLString:youTubeVideoHTML baseURL:[[NSBundle mainBundle] resourceURL]];
}
@end
- (void)playVideoWithId:(NSString *)videoId {
NSString *youTubeVideoHTML = @"<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); var player; function onYouTubePlayerAPIReady() { player = new YT.Player('player', { width:'768', height:'1024', videoId:'%@', events: { 'onReady': onPlayerReady } }); } function onPlayerReady(event) { event.target.playVideo(); } </script> </body> </html>";
NSString *html = [NSString stringWithFormat:youTubeVideoHTML, videoId];
UIWebView *videoView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 300)];
videoView.backgroundColor = [UIColor clearColor];
videoView.opaque = NO;
//videoView.delegate = self;
[self.view addSubview:videoView];
videoView.mediaPlaybackRequiresUserAction = NO;
[videoView loadHTMLString:html baseURL:[[NSBundle mainBundle] resourceURL]];
}
J'ai fait quelques corrections au code ci-dessus.
Utilisez le code suivant pour lire une vidéo YouTube dans le UIWebView
Ici, nous avions besoin d'un "lien d'intégration":
Vous obtiendrez une sortie comme -
<iframe width="640" height="390" src="https://www.youtube.com/embed/xtNXZA4XMBY" frameborder="0" allowfullscreen></iframe>
copiez le lien dans le champ "src", c'est votre lien d'intégration
Il suffit maintenant de mettre ce lien intégré à la place de "YOU_TUBE LINK" dans le code suivant:
NSString *htmlString = [NSString stringWithFormat:@"<html><head><meta name = \"viewport\" content = \"initial-scale = 1.0, user-scalable = yes, width = 320\"/></head><body style=\"background:#00;margin-top:0px;margin-left:0px\"><div><object width=\"320\" height=\"480\"><param name=\"movie\" value=\"YOUTUBE_LINK\"></param><param name=\"wmode\" value=\"transparent\"></param><embed src=\"YOUTUBE_LINK\"type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"320\" height=\"480\"></embed></object></div></body></html>"];
[self.webView_youTube loadHTMLString:htmlString baseURL:nil];