在UIWebView中如何判断YouTube视频何时开始播放

3

我已经制作了一个播放YouTube视频的类(感谢这个网站上热心人的帮助)。

现在我想知道如何找出YouTube视频何时开始播放。我想知道这一点,以便在视频被要求播放和实际播放之间显示“请稍候,正在加载…”指示器。

我使用stringByEvaluatingJavaScriptFromString:来开始播放视频,并且当然,在我触发javascript命令以使视频播放和视频实际播放之间存在轻微延迟。

我熟悉YouTube视频和javascript,所以我一直在查看这个链接:https://developer.apple.com/library/mac/documentation/AppleApplications/Conceptual/SafariJSProgTopics/Tasks/ObjCFromJavaScript.html ,因为我想知道UIWebView内部的javascript事件监听器是否能够检测到YouTube视频何时开始播放(监听onStateChange事件)并触发Objective C方法。

这可行吗?UIWebViews是否以与Web浏览器相同的方式运行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

许多感谢。
1个回答

4
我相信通过新的JavaScriptCore框架,这可以在iOS7上运行(尽管我没有亲自测试过)。
但是,我测试过并且似乎运作正常的方法是:
不要注册不同事件变化的侦听器,而是使用一个定时器每秒钟查询一次播放器的状态。
首先,您可以在播放器类上定义一些状态(与Youtube的状态相对应)(在头文件中)。
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;

你可能需要通过 switchif 语句来决定下一步的操作:

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

请问如何获取玩家实例?谢谢。 - Alan Feng
1
@AlanFeng 玩家实例位于 JS 端,但似乎 Google 现在提供了一个用于在 iOS 嵌入 YouTube 视频的库,这似乎为我们简化了一些事情(尚未测试)。 - Alladinian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接