iOS AirPlay: мое приложение получает уведомление о внешнем дисплее только при включенном зеркальном отображении?

Я пытаюсь включить поддержку AirPlay в своем приложении. Я не снимаю видео; Хочу использовать внешний дисплей как «второй дисплей».

Вот моя проблема: если я выберу «AppleTV» с помощью кнопки AirPlay, мое приложение не получит уведомление. Единственное время, когда мое приложение получает уведомление, - это когда я выхожу из приложения, перехожу к кнопке AirPlay на уровне ОС, выбираю там «AppleTV» и включаю зеркалирование. Если я отключу зеркалирование, моему приложению сообщается, что внешний дисплей пропал.

Итак:

  1. Почему мое приложение не получает уведомление, когда я выбираю внешний дисплей из в моем приложении?
  2. Почему мое приложение получает уведомление о наличии внешний дисплей при включении зеркалирования ... а не раньше? Я явно что-то неправильно понимаю, но похоже, что включение зеркалирования должно сообщить моему приложению, что внешний дисплей исчез (а не теперь доступен, поскольку ОС теперь должна использовать этот внешний дисплей для зеркалирования).

Пример кода ниже. Заранее благодарю за любую помощь!

- (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];
}
6
задан Greg Maletic 26 January 2012 в 19:09
поделиться