2014-09-10 6 views
12

Ich habe eine App, mit der Nutzer Videos aus UIWebview öffnen können, einschließlich Youtube-Videos. In iOS7 konnte ich eine Benachrichtigung erhalten, wenn es anfing zu spielen, oder wenn es Vollbild wurde, das ist für mich lebenswichtig, um bestimmte Optionen dem Benutzer zu zeigen und die Schnittstelle zu ändern.Ermitteln, wenn ein Webview-Video auf dem ios8 als Vollbild angezeigt wird

ich verwendet, um dieses zu verwenden:

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

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

Da jedoch iOS8 ich dies nicht erreichen können. Es ist so, als würde die Benachrichtigung nicht mehr von UIWebview-Videos ausgelöst. Es wird jedoch immer noch von normalen Videos, nicht Webview, wie ich getestet habe, ausgelöst.

Irgendeine Idee von dem, was sich geändert hat?

Antwort

19

Dies ist die Arbeit rund um die ich für diese gefunden ..

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(VideoExitFullScreen:) 
               name:UIWindowDidBecomeVisibleNotification 
               object:self.view.window]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(VideoEnterFullScreen:) 
               name:UIWindowDidBecomeHiddenNotification 
               object:self.view.window]; 
+3

Ich habe festgestellt, dass ** ** UIWindowDidBecomeVisibleNotification aufgerufen wird, wenn Das Video beginnt im Vollbildmodus. Und ** UIWindowDidBecomeHiddenNotification ** wird aufgerufen, wenn das Video verschwindet. –

+0

@IgorKulagin das ist richtig. – NorthBlast

+0

Sie sparen meine Nacht :) –

5

Für Swift & iOS 9:

NSNotificationCenter.defaultCenter().addObserverForName(
    UIWindowDidResignKeyNotification, 
    object: self.view.window, 
    queue: nil 
) { notification in 
    print("Video is now fullscreen") 
} 


NSNotificationCenter.defaultCenter().addObserverForName(
    UIWindowDidBecomeKeyNotification, 
    object: self.view.window, 
    queue: nil 
) { notification in 
    print("Video stopped") 
} 
0

Für swift:

NotificationCenter.default.addObserver(self, selector: #selector(xxx), name: NSNotification.Name.MPMoviePlayerDidExitFullscreen, object: nil)

+0

Dies funktioniert nicht mehr für iOS 9 usw. Es ist jetzt veraltet. – Tobonaut

0

@ NorthBlast Antwort funktioniert gut für die Erkennung von UIWindow erscheint oben auf der UIViewController, die die UIWebView enthält. Leider ist es schwer zu filtern, welche Art von UIWindow ist (seit, nun ... man kann nicht wirklich wissen, ob es ein Video oder eine andere Art von Fenster ist).

Es gibt 3 spezielle Fälle, die ich filtern bevorzugen, in denen Sie sicher sind, sie sind NICHT Video-Player-Fenster, das sind:

1) _UIAlertControllerShimPresenterWindow, die eine Art Fenster, das erscheint, wenn mit Warnungen (wie UIAlertView).

2) UITextEffectsWindow, die bei der Darstellung spezieller iOS-Fenster angezeigt wird (wie das Freigabefenster, UIActivityViewController).

3) UIRemoteKeyboardWindow erscheint beim Präsentieren der Tastatur (aus irgendeinem Grund erschien mir diese Klasse nur bei Verwendung von Swift, aber auf Objective-C tat es nicht ... keine Ahnung, warum das so ist).

So, um Benachrichtigungen zu abonnieren, verwende ich (wie @NorthBlast sagte):

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(windowDidBecomeActive:) 
              name:UIWindowDidBecomeVisibleNotification 
              object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(windowDidBecomeHidden:) 
              name:UIWindowDidBecomeHiddenNotification 
              object:nil]; 

Dann werden die Implementierungen:

- (void)windowDidBecomeActive:(NSNotification *)notification { 
    if ([self isVideoPlayerWindow:notification.object]) { 
     // Do what's needed if it is a video 
     // For example, on a live streaming radio app, I would stop the audio if a video is started 
    } 
} 

- (void)windowDidBecomeHidden:(NSNotification *)notification { 
    if ([self isVideoPlayerWindow:notification.object]) { 
     // Do what's needed if it is a video 
    } 
} 

- (BOOL)isVideoPlayerWindow:(id)notificationObject { 
    /* 
    Define non video classes here, add more if you need it 
    */ 
    static NSArray *nonVideoClasses = @[ 
     @"_UIAlertControllerShimPresenterWindow", 
     @"UITextEffectsWindow", 
     @"UIRemoteKeyboardWindow" 
    ]; 

    BOOL isVideo = YES; 
    for (NSString *testClass in nonVideoClasses) { 
     isVideo = isVideo && ! [notificationObject isKindOfClass:NSClassFromString(testClass)]; 
    } 

    return isVideo; 
}