So erhalten Sie NSNotifications von der eingebetteten YouTube-Videowiedergabe von UIWebView
Habe ich nicht erhalten keine Benachrichtigungen für MPMoviePlayerController
. Was mache ich falsch?
Ich verwende folgende Logik.
Bin ich Anfang zu spielen Sie youtube-video in UIWebView
. UIWebView
ruft eine standard -MPMoviePlayerController
. Ich keine Kontrolle MPMoviePlayerController
weil ich nicht instanziieren MPMoviePlayerController
.
Mir laufen die youtube-Clips mit autoplay (1 Sekunde Verzögerung):
[self performSelector:@selector(touchInView:) withObject:b afterDelay:1];
Mein code ist:
- (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];
}
UPDATE: ich bin momentan dabei, application, Spiele, youtube-video. Sie können führen Sie Wiedergabelisten und sehen Sie erste video. Beim ersten video beendet, das zweite video beginnt automatisch Abspielen und so weiter.
Muss ich eine ios-Version 4.1 und höher.
UPDATE2: @H2CO3 ich versuche, Ihr url-Schema, aber es nicht funktioniert. Delegate-Methode nicht aufgerufen, auf Ereignis exit. Ich habe meine html-url anmelden.
Es ist:
<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
@Till, ich cann ' T gefangen UIMoviePlayerControllerDidExitFullscreennotification, aber ich fand MPAVControllerItemPlaybackDidEndnotification. MPAVControllerItemPlaybackDidEndnotification wird angezeigt, wenn video-Wiedergabe beendet ist.
Aber ich verstehe nicht, wie fange ich onDone Benachrichtigungen?
InformationsquelleAutor der Frage Voloda2 | 2011-12-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine dokumentierten Benachrichtigungen der
UIWebView
eingebetteten Video-player.In der Tat, die geschlossene Umsetzung innerhalb der
UIWebView
unterscheidet sich von der öffentlichenMPMoviePlayerController
in vielen Aspekten (z.B. DRM).Den wichtigsten Klassen für die Wiedergabe einer video-Inhalte in die
UIWebView
genanntMPAVController
undUIMoviePlayerController
. Letzteres lässt den Spieler erscheinen wie dieMPMoviePlayerController
fullscreen-interface.Falls Sie es Wagen, das Risiko einer Ablehnung durch Apple, es gibt tatsächlich Möglichkeiten, um doch noch erreichen, was Sie suchen.
HINWEIS
Diese ist nicht dokumentiert und ist Gegenstand einer Pause auf jeder und jedem neuen iOS-release. Es funktioniert aber auf iOS4.3, 5.0 und 5.01, 5.1 und 6.0 und es kann Arbeit auf andere Versionen als gut.
Ich bin nicht in der Lage, dies zu testen-Lösung auf iOS 4.1 und 4.2, so dass bis zu Ihnen zu tun. Ich stark vermuten, dass es funktionieren wird.
Fullscreen Zustand
Beispiel: wenn Sie beabsichtigen, zu reagieren auf die Benutzer Tippen auf die GETAN - Taste, können Sie in der Lage sein, es zu tun auf diese Weise:
UPDATE Die alte version dieser Antwort empfohlen
UIMoviePlayerControllerDidExitFullscreenNotification
in der Erwägung, dass diese neue version (aktualisiert für iOS6) empfiehlt die Verwendung vonUIMoviePlayerControllerWillExitFullscreenNotification
.C-Sprache Level:
Objective-C Ebene:
Habe ich den Entwurf sowohl C-Level und Objective-C-Level-Optionen, weil der beste Weg, um wirklich herauszufinden, über all dies ist mit dem C-Niveau (CoreFoundation) Funktionen, wie gezeigt, am Ende meiner Antwort. Wenn der Absender eine Benachrichtigung nicht verwenden Objective-C (NSNotifications), Sie kann tatsächlich nicht in der Lage sein, um Sie zu fangen mit dem NSNotification-mechanik.
Wiedergabe
Zur Untersuchung der Wiedergabe, halten Sie Ausschau nach
"MPAVControllerPlaybackStateChangedNotification"
(wie oben aufgeschrieben) und untersuchen Sie dieuserInfo
die könnte wie folgt Aussehen:Weitere Reverse-Engineering -
Für reverse engineering und Erkundung der Benachrichtigungen gesendet werden, verwenden Sie den folgenden Codeausschnitt.
InformationsquelleAutor der Antwort Till
In iOS 4.3+, die Sie verwenden können, die
UIMoviePlayerControllerDidEnterFullscreenNotification
undUIMoviePlayerControllerDidExitFullscreenNotification
Benachrichtigungen:InformationsquelleAutor der Antwort ChrisJP
Soweit ich weiß, werden die details der Implementierung der UIWebView (und alle system-Klassen von Apple) sind nicht als verlässlich angesehen werden, wenn Sie eine Cocoa Touch-Anwendungen. Vielleicht ist es der Fall, dass ein UIWebView ' s video-player ist nicht eine standard-Klasse MPMoviePlayerController und es könnte eine völlig andere delegation/notification-system, das nicht sein soll, zugänglich durch den Benutzer.
Ich schlage vor, Sie verwenden das HTML5-element und erkennen, dass der "onended" Ereignis an diesem tag:
In der Tat, von der endMovie JavaScript-Funktion, können Sie umleiten, um eine gefälschte URL, die Sie fangen können, die in Ihrem -webView:shouldStartLoadWithRequest: (UIWebViewDelegate) - Methode bekommt so mitgeteilt, dass das video beendet:
Hoffe, das hilft.
InformationsquelleAutor der Antwort
Basiert auf der @H2CO3 Antwort, aber mit der iframe-API. Es war die einzige Art, wie ich es Arbeit bilden könnte.
Diese keine private API, die macht es mehr zukunftssicher.
Hier ist der code zum einbetten Ihrer Youtube-Videos. Überprüfen Sie die API-Schnittstelle für noch mehr Möglichkeiten zum anpassen.
Und dies ist, wie Sie benachrichtigt werden, dass das video endete (UIWebViewDelegate-Methode).
InformationsquelleAutor der Antwort Fábio Oliveira
in ViewDidLoad fügen Sie den folgenden code
Sind die folgenden Methoden für die Anzeige der Meldung/Funktionen für den jeweiligen Prozess der Eingabe/beenden/aus Vollbild
InformationsquelleAutor der Antwort Prabhu Natarajan
Dies funktioniert für mich in iOS 6.1, die es versteckt/entfernt andere windows, wenn die AVPlayerItemDidPlayToEndTimeNotification empfangen wird:
InformationsquelleAutor der Antwort sandeepmistry
InformationsquelleAutor der Antwort Ritesh Arora
Für iOS8 (Auch ich habe ein eingebettetes video, das ist nicht ein youtube-video) die einzige Lösung, die ich bekommen konnte, um zu arbeiten, war zu fangen, entweder eine
viewWill/DidLayoutSubviews
und als zusätzlichen bonus, den Sie nicht brauchen, ändern Sie die HTML-oder verwenden Sie keine privaten APIs :Also im Grunde:
In meinem Fall meine web-Ansicht innerhalb einer
UITableViewCell
also musste ich einen Weg finden, um die Kommunikation zwischen der Zelle und der view-controller, und vermeiden auch mit einem BOOL-flag habe ich dieses:InformationsquelleAutor der Antwort Aviel Gross
Eigentlich für das reverse-engineering-Zwecke, können Sie auch verwenden, Cocoa-API
wie
In diesem Fall erhalten Sie alle Benachrichtigungen
InformationsquelleAutor der Antwort Serg Dort