Savoir quand une vidéo YouTube commence à jouer à partir d'une UIWebView

J'ai fait une classe qui joue des vidéos YouTube (grâce à l'aide des gens gentils de ce site).

Maintenant, je me demande comment je découvre quand une vidéo YouTube commence à jouer. Je veux savoir cela afin que je puisse afficher un indicateur "Please Wait, Loading …" entre la vidéo en train de jouer et la lecture en cours.

Je commence la lecture vidéo en utilisant stringByEvaluatingJavaScriptFromString: et bien sûr, il y a un léger retard entre moi en déclenchant la commande javascript pour obtenir la lecture vidéo et la lecture de la vidéo.

Je suis familier avec les vidéos YouTube et javascript, donc j'ai regardé ceci: [ https://developer.apple.com/library/mac/documentation/AppleApplications/Conceptual/SafariJSProgTopics/Tasks/ObjCFromJavaScript.html ] parce que je me demande si Un auditeur d'événement javascript à l'intérieur de UIWebView pourrait détecter quand une vidéo YouTube commence à jouer (écouter l'événement onStateChange ) et déclencher une méthode Objective C.

Est-ce possible? UIWebViews exécute-t-il javascript de la même manière qu'un navigateur Web?

Existe-t-il un moyen plus facile / meilleur de faire cela?

Voici ma classe youtube:

 // this is the only property declared in the .h file: @property (strong, nonatomic) UIView * view // the rest of this is the .m file: #import "MyYouTube.h" @interface MyYouTube() @property (strong, nonatomic) NSDictionary * contentData; @property (strong, nonatomic) UIWebView * webView; @property (nonatomic) int videoOffset; @end @implementation MyYouTube @synthesize view,contentData,webView,videoOffset; - (MyYouTube*) initIntoView: (UIView*) passedView withContent: (NSDictionary*) contentDict { NSLog(@"YOUTUBE: begin init"); self=[super init]; videoOffset=0; view=[[UIView alloc] initWithFrame:passedView.bounds]; [view setBackgroundColor:[UIColor blackColor]]; [view setAutoresizesSubviews:YES]; [view setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth]; contentData=contentDict; NSString * compiledUrl=[[NSString alloc] initWithFormat:@"http://_xxx_.com/app/youtube.php?yt=%@",[contentData objectForKey:@"cnloc"]]; NSURL * url=[[NSURL alloc] initWithString:compiledUrl]; NSURLRequest * request=[[NSURLRequest alloc] initWithURL:url]; webView=[[UIWebView alloc] initWithFrame:passedView.bounds]; [webView loadRequest:request]; [webView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; [[webView scrollView] setScrollEnabled:NO]; [[webView scrollView] setBounces:NO]; [webView setMediaPlaybackRequiresUserAction:NO]; [webView setDelegate:self]; NSLog(@"YOUTUBE: self: %@",self); NSLog(@"YOUTUBE: delegate: %@",webView.delegate); [view addSubview:webView]; NSLog(@"YOUTUBE: end init"); return self; } -(void)webViewDidFinishLoad:(UIWebView*)myWebView { NSLog(@"YOUTUBE: send play command"); [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"playVideo(%d)", videoOffset]]; } @end 

Merci beaucoup.

Je crois que cela pourrait fonctionner sur iOS7 via le nouveau framework JavaScriptCore (bien que je ne l'ai pas personnellement testé).

Ce que j'ai testé et cela semble fonctionner bien, c'est cette approche:

Au lieu d'enregistrer un auditeur sur différents changements d'événements, vous pouvez avoir une minuterie qui interroge l'état du joueur chaque seconde.

Tout d'abord, vous pouvez définir certains états sur la classe de joueur (correspondant aux états de Youtube ) (dans le fichier d'en-tête):

 typedef NS_ENUM(NSInteger, YoutubeVideoState){ YOUTUBE_VIDEO_STATE_UNSTARTED = -1, YOUTUBE_VIDEO_STATE_ENDED = 0, YOUTUBE_VIDEO_STATE_PLAYING = 1, YOUTUBE_VIDEO_STATE_PAUSED = 2, YOUTUBE_VIDEO_STATE_BUFFERING = 3, YOUTUBE_VIDEO_STATE_VIDEO_CUED = 5 }; 

Ensuite, vous pourriez avoir une propriété readonly pour obtenir l'état (également dans le fichier d'en-tête):

 @property (nonatomic, readonly) YoutubeVideoState state; 

Qui serait mis en œuvre comme suit:

 - (YoutubeVideoState)state { return (YoutubeVideoState)[[self.webView stringByEvaluatingJavaScriptFromString:@"getPlayerState()"] integerValue]; } 

Maintenant, vous pouvez simplement demander à votre instance de vous fournir l'état actuel dans chaque invocation de minuterie comme:

 YoutubeVideoState currentState = myPlayerInstance.state; 

Et peut-être décider de votre prochaine action via un switch ou une instruction if :

 if (currentState == YOUTUBE_VIDEO_STATE_PLAYING) { // Start your engines! }