iOS AirPlay: mon application est uniquement avertie d'un affichage externe lorsque la mise en miroir est activée?

J'essaie d'activer le support AirPlay dans mon application. Je ne fais pas de video Je veux utiliser l'affichage externe comme un "deuxième affichage".

Voici mon problème: si je choisis "AppleTV" sur mon button AirPlay, mon application ne sera pas notifiée. La seule fois où mon application est notifiée est lorsque je quitte mon application, allez sur le button AirPlay au niveau de l'OS, choisissez "AppleTV" et activez Mirroring. Si j'éteins la mise en miroir, mon application est alors informée que l'affichage externe est parti.

Alors:

  1. Pourquoi mon application n'est-elle pas avertie lorsque je sélectionne un écran externe dans mon application?
  2. Pourquoi mon application est-elle avertie de la présence d'un affichage externe lorsque j'active la mise en miroir … et pas avant? Je suis évidemment en train de mal comprendre quelque chose, mais il semblerait que la mise en miroir devrait informer mon application que l'affichage externe est parti (plutôt que maintenant disponible, puisque le operating system devrait maintenant utiliser cet affichage externe pour la mise en miroir).

Exemple de code ci-dessous. Merci d'avance pour votre aide!

- (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]; } 

C'est correct, malheureusement. L'affichage secondaire (l'écran airplay) est uniquement disponible avec la mise en miroir.

Voici une application qui montre comment implémenter ceci: https://github.com/quellish/AirplayDemo

En regardant votre code, vous DEVRIEZ get UIScreenDidConnectNotification quand un user va dans le menu AirPlay et active la mise en miroir pendant que votre application est active. Le "button Airplay", que ce soit un MPVolumeView ou un controller de film, ne contrôle pas la mise en miroir (et donc la fonctionnalité d'affichage externe). La sortie video et audio est malheureusement séparée de la mise en miroir et la mise en miroir ne peut être activée ou désactivée qu'à l'aide de l'interface user de mise en miroir du système.

Bottom line: Vous ne pouvez pas activer cet écran AirPlay à partir de votre application.

Enfin trouvé la réponse, vous devez avoir activé la mise en miroir afin d'get la nouvelle notification d'écran, mais vous devez ensuite replace l'écran avec votre deuxième contenu d'écran. Très perturbant!

Voir cet exemple:

Les écrans UIScreen renvoient toujours 1 écran

Maintenant, le pire. Vous pouvez append un button AirPlay dans votre application en utilisant ceci:

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

Cependant, vous ne pouvez pas activer la mise en miroir à partir de ce sélecteur! Et il n'y a pas de façon programmatique d'activer la mise en miroir.

Comment puis-je activer AirPlay Screen Mirroring sur l'iPhone 4S par programmation

Apparemment, la seule façon d'avoir une deuxième expérience d'écran est d'indiquer à votre user comment activer AirPlay à partir de la barre multitâche et assurez-vous qu'ils sont activés.

Il ne semble pas possible de l'intérieur de l'application, malheureusement. Seul le son de l'airplay peut être activé depuis l'intérieur de l'application. Voici un exemple d'application utilisant le second écran avec OpenGL et sons http://developer.apple.com/library/ios/samplecode/GLAirplay/Introduction/Intro.html