Я не получал никаких уведомлений для MPMoviePlayerController
. Что я делаю не так?
Я использую следующую логику.
Я начинаю воспроизводить видео на YouTube в UIWebView
. 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, но она не работает. Метод делегата не вызывал событие выхода. Я добавил свой 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
}
ОБНОВЛЕНИЕ3 @Till, я не могу поймать UIMoviePlayerControllerDidExitFullscreenNotification, но нашел MPAVControllerItemPlaybackDidEndNotification. MPAVControllerItemPlaybackDidEndNotification появляется по окончании воспроизведения видео.
Но я не понимаю, как мне получать уведомления OnDone?