gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 07:36:22 27 4
gpt4 key购买 nike

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

我使用以下逻辑。

我开始在 UIWebView 中播放 youtube 视频。 UIWebView 调用标准的 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 及以上版本。

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

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

更新 3@Till,我无法捕捉到 UIMoviePlayerControllerDidExitFullscreenNotification,但我找到了 MPAVControllerItemPlaybackDidEndNotification。播放视频结束时出现 MPAVControllerItemPlaybackDidEndNotification。

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

最佳答案

UIWebView 嵌入式电影播放器​​没有发送任何记录在案的通知。

事实上,UIWebView 中使用的封闭实现在许多方面(例如 DRM)确实与公共(public) MPMoviePlayerController 不同。

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

如果您敢于冒被 Apple 拒绝的风险,实际上仍有一些方法可以实现您的目标。

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

我无法在 iOS 4.1 和 4.2 上测试此解决方案,所以这取决于您。我高度怀疑它会起作用。


全屏状态

例如,如果您打算在用户点击DONE 按钮时使用react,您可以这样做:

更新 建议使用此答案的旧版本 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);

关于ios - 如何从 UIWebView 嵌入式 YouTube 视频播放接收 NSNotifications,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8518719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com