Comment recevoir NSNotifications de UIWebView intégré vidéo YouTube de lecture
Je n'ai pas reçu de notifications pour MPMoviePlayerController
. Ce que je fais mal?
Je utiliser à la suite de la logique.
Je suis en commençant à lire des vidéos youtube en UIWebView
. UIWebView
appelle un standard MPMoviePlayerController
. Je n'ai pas de contrôle MPMoviePlayerController
parce que je n'ai pas instancier MPMoviePlayerController
.
Je run youtube du clip avec l'exécution automatique (1 seconde de retard):
[self performSelector:@selector(touchInView:) withObject:b afterDelay:1];
Mon code est:
- (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];
}
Mise à JOUR: je suis en création d'application qui joue de la vidéo de youtube. Vous pouvez exécuter la liste de lecture et vous permettra de voir la première vidéo. Lors de la première vidéo est terminée, la seconde de la vidéo commence à jouer automatiquement et ainsi de suite.
J'ai besoin de soutien ios 4.1 et supérieur.
UPDATE2: @H2CO3 je suis en train d'utiliser votre url, mais il ne fonctionne pas. Délégué de la méthode n'a pas appelé à la sortie de l'événement. J'ai ajouté mon code html url pour vous connecter.
Il est:
<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, je cann pas pris UIMoviePlayerControllerDidExitFullscreennotification, mais j'ai trouvé MPAVControllerItemPlaybackDidEndnotification. MPAVControllerItemPlaybackDidEndnotification s'affiche lorsque la lecture de la vidéo est terminée.
Mais je ne comprends pas comment faire des captures onDone notifications?
- Votre hypothèse de départ est incorrect.
UIWebView
ne pas utiliser la normeMPMoviePlayerController
pour la lecture.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas documenté les notifications envoyées par le
UIWebView
intégré de l'acteur de cinéma.En fait, le clos de la mise en œuvre utilisés dans le
UIWebView
ne diffèrent du publicMPMoviePlayerController
dans de nombreux aspects (par exemple, les DRM).Les classes les plus importantes utilisées pour la lecture de contenu vidéo à l'intérieur de cette
UIWebView
sont appelésMPAVController
etUIMoviePlayerController
. La dernière rend le joueur apparaissent comme lesMPMoviePlayerController
plein écran de l'interface.Dans le cas où vous osez le risque d'un rejet par Apple, il ya effectivement des façons de toujours obtenir ce que vous cherchez.
NOTE
Ce n'est pas documentée et est soumis à la pause sur chaque nouvelle version d'iOS. Il ne fait toutefois travailler sur iOS4.3, de la 5.0 5.01, 5.1 et 6.0 et il peut travailler sur d'autres versions.
Je ne suis pas en mesure de tester cette solution sur iOS 4.1 et 4.2, donc c'est à vous de le faire. Je soupçonne fortement que cela va fonctionner.
Plein Écran État
Si, par exemple vous avez l'intention de réagir à l'utilisateur en appuyant sur la FAIT bouton, vous pourriez être en mesure de le faire de cette façon:
Mise à JOUR L'ancienne version de cette réponse recommandé d'utiliser
UIMoviePlayerControllerDidExitFullscreenNotification
alors même que cette nouvelle version (mise à jour pour iOS6) recommande l'utilisation deUIMoviePlayerControllerWillExitFullscreenNotification
.C-Niveau De Langue:
Objective-C Niveau:
Je ne projet de les deux, de Niveau C et Objective-C au Niveau des options, parce que la meilleure façon de savoir ce qu'il en est d'utiliser le C-Level (CoreFoundation) fonctions comme indiqué en fin de ma réponse. Si l'expéditeur d'une notification de ne pas utiliser Objective-C (NSNotifications), vous peut fait de ne pas être en mesure de les piéger à l'aide de la NSNotification-mécanique.
L'État De Lecture
De l'examen de l'état de lecture, regarder dehors pour les
"MPAVControllerPlaybackStateChangedNotification"
(tel que rédigé ci-dessus) et d'examiner lauserInfo
qui peut ressembler à ceci:En Outre, L'Ingénierie Inverse
La rétro-ingénierie et l'exploration de toutes les notifications envoyées, utilisez l'extrait de code suivant.
Dans iOS 4.3+, vous pouvez utiliser le
UIMoviePlayerControllerDidEnterFullscreenNotification
etUIMoviePlayerControllerDidExitFullscreenNotification
notifications:UIMoviePlayerController
VaEnterFullscreenNotification
.UIMoviePlayerControllerWillEnterFullscreenNotification
etWillExit
notifications sous iOS 6, maintenant, mais je n'ai pas testé ces. Voir la accepté de répondre à cette question (par le Sol) qu'il a mis à jour, avec une explication plus détaillée.Autant que je sache, les détails de mise en œuvre de UIWebView (et de toutes les classes de système fait par Apple) ne doivent pas être invoqué lors d'une Cocoa Touch application. C'est peut-être le cas que d'une UIWebView du lecteur vidéo est pas un standard MPMoviePlayerController classe et qu'il pourrait avoir un tout autre délégation/système de notification, ce qui n'est pas censé être accessible par l'utilisateur.
Je vous conseille d'utiliser l'élément HTML5 et de détecter les "onended" l'événement de cette balise:
En fait, à partir de la endMovie fonction JavaScript, vous pouvez le rediriger vers un faux URL qui vous pouvez prendre dans votre-webView:shouldStartLoadWithRequest: (UIWebViewDelegate) méthode ainsi être averti que la vidéo est terminée:
Espère que cette aide.
onended
.Basé sur l' @H2CO3 réponse, mais avec le iframe API. C'était la seule façon que je pouvais le faire fonctionner.
Ce n'utilise pas les API privée qui le rend plus fiable pour l'avenir.
Voici le code à intégrer votre vidéo sur Youtube. Vérifier l'API pour plus de façons de personnaliser cette.
Et ce est la façon dont vous êtes averti que la vidéo terminée (UIWebViewDelegate méthode).
dans le ViewDidLoad ajoutez le code suivant
Les méthodes suivantes sont pour montrer le message/fonctions respectives processus d'entrée/sortie vers/à partir plein écran
Cela fonctionne pour moi sous iOS 6.1, il cache/supprime les autres windows lorsque le AVPlayerItemDidPlayToEndTimeNotification est reçu:
Pour iOS8 (j'ai Aussi une vidéo qui n'est pas une vidéo de youtube) la seule solution que j'ai pu obtenir pour fonctionner est de prendre l'un des
viewWill/DidLayoutSubviews
, et comme un bonus supplémentaire, vous n'avez pas besoin de modifier le code HTML ou utiliser un Api privées :Donc en gros:
Dans mon cas, mon point de vue est à l'intérieur d'un
UITableViewCell
j'ai donc dû trouver un moyen de communiquer entre la cellule et le point de vue du contrôleur, et également pour éviter à l'aide d'un BOOLÉEN drapeau je l'ai fait:En fait pour le reverse engineering, vous pouvez également utiliser les API Cocoa
comme
Dans ce cas, vous recevrez toutes les notifications