2013-11-27 2 views
3

Я создал класс, который воспроизводит видео на YouTube (благодаря помощи со стороны людей этого сайта).Зная, когда начинается воспроизведение видеоролика YouTube из UIWebView

Теперь мне интересно, как я узнаю, когда начнется воспроизведение видео на YouTube. Я хочу знать это, поэтому я могу показать индикатор «Подождите, загрузите ...» между видео, которое будет сказано, чтобы играть, и на самом деле он играет.

Я запускаю воспроизведение видео с использованием stringByEvaluatingJavaScriptFromString:, и, конечно, между мной уходит небольшая задержка с помощью команды javascript для воспроизведения видео и воспроизведения на самом деле.

Я знаком с видео YouTube и JavaScript, поэтому Ive смотрел на это: [https://developer.apple.com/library/mac/documentation/AppleApplications/Conceptual/SafariJSProgTopics/Tasks/ObjCFromJavaScript.html], потому что мне интересно, если Javascript слушатель события внутри UIWebView может обнаружить, когда видео YouTube начинает играть (прослушивание для onStateChange события) и запустите метод Objective C.

Возможно ли это? Как UIWebViews запускает javascript так же, как веб-браузер?

Есть ли более простой/лучший способ сделать это?

Вот мой 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 

Большое спасибо.

ответ

4

Я считаю, что это может работать на iOS7 через новый JavaScriptCore framework (хотя я лично его не тестировал).

Что я проверил, хотя и это, кажется, работает хорошо такой подход:

Вместо регистрации слушателя на различные изменения событий, вы могли бы иметь таймер, который запросы состояние игрока каждый второй.

Во-первых, вы могли бы определить некоторые государства по классу игрока (что будет соответствовать Youtube's states) (в заголовочном файле):

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 
}; 

Тогда вы могли бы иметь readonly свойство, чтобы получить состояние (также в заголовке файл):

@property (nonatomic, readonly) YoutubeVideoState state; 

, который будет реализован, как:

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

Теперь вы можете просто спросить от экземпляра, чтобы получить текущее состояние каждого вызова таймера, как:

YoutubeVideoState currentState = myPlayerInstance.state; 

и, возможно, принять решение о вашем следующем действии через switch или if заявление:

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

этой прекрасно работает! большое спасибо! – Jimmery

+0

Добро пожаловать, рад, что помог вам :) – Alladinian

+0

Спасибо. Работал и для меня тоже !!!! –

Смежные вопросы