2012-01-26 14 views
6

Sto provando ad abilitare il supporto AirPlay nella mia app. Non sto facendo video; Voglio usare il display esterno come "secondo display".iOS AirPlay: la mia app riceve notifica di un display esterno solo quando il mirroring è attivo?

Ecco il mio problema: se scelgo "AppleTV" dal mio pulsante AirPlay, la mia app non viene notificata. L'unica volta che la mia app viene notificata è quando abbandona la mia app, vai al pulsante AirPlay a livello di sistema operativo, scegli "AppleTV" e attiva Mirroring. Se spengo il mirroring, la mia app viene quindi informata che il display esterno è sparito.

Quindi:

  1. Perché non la mia app per sapere quando prendo un display esterno da all'interno della mia app?
  2. Perché la mia app viene informata della presenza di uno schermo esterno quando si attiva il mirroring su ... e non prima? Sono ovviamente equivoco qualcosa, ma sembrerebbe come accendere il mirroring su dovrebbe informare il mio app che il display esterno è andato (piuttosto che ora disponibile, dal momento che il sistema operativo dovrebbe essere utilizzando display esterno che per il mirroring.)

Esempio di codice di seguito. Grazie in anticipo per qualsiasi aiuto!

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    // Override point for customization after application launch. 

    // Is there already an external screen? 
    if (UIScreen.screens.count > 1)] 
    { 
      [self prepareExternalScreen:UIScreen.screens.lastObject]; 
    } 

    // Tell us when an external screen is added or removed. 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(externalScreenDidConnect:) name:UIScreenDidConnectNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(externalScreenDidDisconnect:) name:UIScreenDidDisconnectNotification object:nil]; 

    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    self.window.rootViewController = self.viewController; 

    // Add AirPlay control to view controller. 
    MPVolumeView* airplayButtonView = [[MPVolumeView alloc] init]; 
    airplayButtonView.frame = CGRectMake(300, 300, 50, 50); 
    airplayButtonView.backgroundColor = [UIColor blackColor]; 
    airplayButtonView.showsVolumeSlider = NO; 
    airplayButtonView.showsRouteButton = YES; 

    [self.viewController.view addSubview:airplayButtonView]; 


    [self.window makeKeyAndVisible]; 

    return YES; 
} 

#pragma mark - External screen handling 

- (void)externalScreenDidConnect:(NSNotification*)notification 
{ 
    [self prepareExternalScreen:notification.object]; 
} 

- (void)externalScreenDidDisconnect:(NSNotification*)notification 
{ 
    // Don't need these anymore. 
    self.externalWindow = nil; 
} 

- (void)prepareExternalScreen:(UIScreen*)externalScreen 
{ 
    NSLog(@"PREPPING EXTERNAL SCREEN."); 
    self.viewController.view.backgroundColor = [UIColor blueColor]; 
    CGRect frame = externalScreen.bounds; 
    self.externalWindow = [[UIWindow alloc] initWithFrame:frame]; 
    self.externalWindow.screen = externalScreen; 
    self.externalWindow.hidden = NO; 
    self.externalWindow.backgroundColor = [UIColor redColor]; 
} 

risposta

8

Questo è corretto, sfortunatamente. Il display secondario (la schermata di airplay) è disponibile solo con mirroring.

Ecco un'applicazione che mostra come implementare questa: https://github.com/quellish/AirplayDemo

Guardando il codice, si dovrebbe essere sempre l'UIScreenDidConnectNotification quando un utente va al menu di airplay e accende il mirroring, mentre la vostra applicazione è attiva. Il "Pulsante Airplay", sia che si tratti di un MPVolumeView o di un controller di film, non controlla il mirroring (e quindi la funzionalità di visualizzazione esterna). Le uscite video e audio sono purtroppo separate dal mirroring e il mirroring può essere attivato o disattivato solo tramite l'interfaccia utente di mirroring del sistema.

Bottom line: non è possibile attivare la schermata di AirPlay dall'interno dell'app.

+1

Grazie. E schifo: sembra che Apple abbia fatto un lavoro terribile con l'interfaccia utente su questo. –

+0

È ancora così? Vedo che questo post è piuttosto vecchio e sto cercando un modo. – VaporwareWolf

2

Finalmente trovata la risposta, è necessario avere il mirroring abilitato per ottenere la nuova notifica sullo schermo, ma poi si dovrebbe sovrascrivere lo schermo con il secondo contenuto dello schermo. Molto confuso!

Vedi questo esempio:

UIScreen screens always return 1 screen

Ora, la parte peggiore. È possibile aggiungere un pulsante AirPlay all'interno della vostra applicazione utilizzando questo:

MPVolumeView *volumeView = [ [MPVolumeView alloc] init] ; 
[view addSubview:volumeView]; 

Tuttavia non è possibile attivare il mirroring da questo selettore! E non esiste un modo programmatico per attivare il mirroring.

How can I turn on AirPlay Screen Mirroring on the iPhone 4S programmatically

Quindi a quanto pare l'unico modo per avere una seconda esperienza schermo è quello di istruire l'utente come accendere AirPlay da multitasking bar e assicurarsi che si rivolgono specchio.

Problemi correlati