如何从UIWebView嵌入式YouTube视频播放中接收NSNotifications

沃达达2

我没有收到有关的任何通知MPMoviePlayerController我究竟做错了什么?

我使用以下逻辑。

我开始在中播放youtube视频UIWebViewUIWebView称为标准MPMoviePlayerController我没有控制,MPMoviePlayerController因为我没有实例化MPMoviePlayerController

我以自动播放的方式运行youtube的剪辑(延迟1秒):

[self performSelector:@selector(touchInView:) withObject:b afterDelay:1];

我的代码是:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadStateDidChange:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackDidFinish:) name:MPMoviePlayerDidExitFullscreenNotification object:nil];

    [self embedYouTube];
}

- (void)loadStateDidChange:(NSNotification*)notification
{
    NSLog(@"________loadStateDidChange");
}

- (void)playbackDidFinish:(NSNotification*)notification
{
    NSLog(@"________DidExitFullscreenNotification");
}

- (void)embedYouTube
{
    CGRect frame = CGRectMake(25, 89, 161, 121);
    NSString *urlString = [NSString stringWithString:@"http://www.youtube.com/watch?v=sh29Pm1Rrc0"];

    NSString *embedHTML = @"<html><head>\
    <body style=\"margin:0\">\
    <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \
    width=\"%0.0f\" height=\"%0.0f\"></embed>\
    </body></html>";
    NSString *html = [NSString stringWithFormat:embedHTML, urlString, frame.size.width, frame.size.height];
    UIWebView *videoView = [[UIWebView alloc] initWithFrame:frame];
    videoView.delegate = self;

    for (id subview in videoView.subviews)
        if ([[subview class] isSubclassOfClass: [UIScrollView class]])
            ((UIScrollView *)subview).bounces = NO;

            [videoView loadHTMLString:html baseURL:nil];
    [self.view addSubview:videoView];
    [videoView release];
}

- (void)webViewDidFinishLoad:(UIWebView *)_webView 
{
    UIButton *b = [self findButtonInView:_webView];
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(touchInView:) object:b];
    [self performSelector:@selector(touchInView:) withObject:b afterDelay:1];
}

- (UIButton *)findButtonInView:(UIView *)view 
{
    UIButton *button = nil;

    if ([view isMemberOfClass:[UIButton class]]) {
        return (UIButton *)view;
    }

    if (view.subviews && [view.subviews count] > 0) 
    {
        for (UIView *subview in view.subviews) 
        {
            button = [self findButtonInView:subview];
            if (button) return button;
        }
    }
    return button;
}

- (void)touchInView:(UIButton*)b
{
    [b sendActionsForControlEvents:UIControlEventTouchUpInside];
}

更新:我正在创建播放youtube视频的应用程序。您可以运行播放列表,您将看到第一个视频。当第一个视频结束时,第二个视频开始自动播放,依此类推。

我需要支持ios 4.1及更高版本。

UPDATE2: @ H2CO3我正在尝试使用您的url方案,但是它不起作用。退出事件未调用委托方法。我将我的html网址添加到日志中。它是:

<html><head>    <body style="margin:0">    
<script>function endMovie() 
{document.location.href="somefakeurlscheme://video-ended";} 
 </script>      <embed id="yt" src="http://www.youtube.com/watch?v=sh29Pm1Rrc0"        
 onended="endMovie()" type="application/x-shockwave-flash"  
 width="161" height="121"></embed>  
 </body></html>

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
  if ([[[request URL] absoluteString] hasPrefix:@"somefakeurlscheme://video-ended"]) 
  {
    [self someMethodSupposedToDetectVideoEndedEvent];
    return NO; // prevent really loading the URL
   }
  return YES; // else load the URL as desired
}

UPDATE3 @直到,我无法捕获UIMoviePlayerControllerDidExitFullscreenNotification,但是找到了MPAVControllerItemPlaybackDidEndNotification。播放视频结束时,将显示MPAVControllerItemPlaybackDidEndNotification。

但是我不明白如何捕获onDone通知?

UIWebView嵌入式电影播放器没有发送记录的通知

实际上,文档中使用的封闭式实现在许多方面(例如DRM)UIWebView与公众有所不同MPMoviePlayerController

用于播放视频内容的最重要的类UIWebView称为MPAVControllerUIMoviePlayerController后者使播放器看起来像MPMoviePlayerController全屏界面。

如果您敢冒险遭到苹果公司的拒绝,则实际上还有一些方法可以实现您所寻找的目标。

注意此文档没有记录,并且在每个新的iOS版本中都会中断。但是,它确实适用于iOS4.3、5.0和5.01、5.1和6.0,并且可能也适用于其他版本。

我无法在iOS 4.1和4.2上测试此解决方案,因此您可以自行决定。我高度怀疑它会起作用。


全屏状态

例如,如果您打算对用户点击“完成”按钮做出反应,则可以通过以下方式进行操作:

更新 建议使用此答案的旧版本, UIMoviePlayerControllerDidExitFullscreenNotification 而此新版本(针对iOS6更新)建议使用 UIMoviePlayerControllerWillExitFullscreenNotification

C语言等级:

void PlayerWillExitFullscreen (CFNotificationCenterRef center,
                 void *observer,
                 CFStringRef name,
                 const void *object,
                 CFDictionaryRef userInfo)
{
    //do something...
}

CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), 
    NULL, 
    PlayerWillExitFullscreen, 
    CFSTR("UIMoviePlayerControllerWillExitFullscreenNotification"), 
    NULL,  
    CFNotificationSuspensionBehaviorDeliverImmediately);

Objective-C级:

- (void)playerWillExitFullscreen:(NSNotification *)notification
{
    //do something...
}

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerWillExitFullscreen:)
                                             name:@"UIMoviePlayerControllerWillExitFullscreenNotification" 
                                           object:nil];

我确实草拟了C级和Objective-C级选项,因为真正了解所有这些的最佳方法是使用C级(CoreFoundation)函数,如我的答案结尾所示。如果一个通知的发件人不使用的Objective-C(NSNotifications),你可能实际上没有使用NSNotification力学能够捕获它们。


播放状态

要检查播放状态,请注意"MPAVControllerPlaybackStateChangedNotification"(如上图所示),然后检查userInfo可能看起来像这样的内容:

{
    MPAVControllerNewStateParameter = 1;
    MPAVControllerOldStateParameter = 2;
}

进一步的逆向工程

要进行逆向工程并浏览所有发送的通知,请使用以下代码段。

void MyCallBack (CFNotificationCenterRef center,
                 void *observer,
                 CFStringRef name,
                 const void *object,
                 CFDictionaryRef userInfo)
{
    NSLog(@"name: %@", name);
    NSLog(@"userinfo: %@", userInfo);
}

CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), 
    NULL, 
    MyCallBack, 
    NULL, 
    NULL,  
    CFNotificationSuspensionBehaviorDeliverImmediately);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何杀死正在播放的嵌入式youtube视频

如何检查YouTube视频是否允许嵌入式播放

如何从嵌入式YouTube播放列表中禁用“相关视频”

如何在WKWebView中启用嵌入式YouTube视频?

如何恢复嵌入式YouTube视频?

阻止嵌入式YouTube视频自动播放?

多个YouTube视频嵌入式自动播放序列

删除嵌入式YouTube视频上的播放/暂停

嵌入式YouTube视频在密闭容器中继续播放

关闭模态后,如何停止播放嵌入式iframe youtube视频?

Selenium C#如何暂停/播放嵌入式youtube视频

在WPF应用程序中播放youtube。不支持嵌入式视频

使用YTPlayerView在iOS中播放嵌入式YouTube视频失败,出现限制错误

如何在外部播放器中播放嵌入式 Flash 视频?

如何停止自动播放嵌入式视频?

如何播放和暂停嵌入式Wirewax视频?

UIWebView嵌入式视频全屏问题

您如何使嵌入式Youtube播放器静音?

在Android中删除嵌入式YouTube视频的全屏按钮

如何在嵌入式YouTube视频中启用自动字幕?

改变嵌入式Youtube视频的宽高比

YouTube嵌入式视频无法启动

嵌入式YouTube视频无法加载

Youtube 嵌入式视频白色区域

从iframe代码获取嵌入式YouTube播放列表视频的当前时间戳

youtube嵌入式url设置无法自动播放视频

向右浮动时,嵌入式youtube视频将无法播放

使用jQuery从链接列表播放第一个youtube嵌入式视频

如何在UIWebView中自动播放YouTube视频