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

3 ответов


Это верно, к сожалению. Вторичный дисплей (экран airplay) доступен только с зеркальным отображением.

вот это приложение, которое показывает, как реализовать это: https://github.com/quellish/AirplayDemo

глядя на ваш код, вы должны получать UIScreenDidConnectNotification, когда пользователь переходит в меню airplay и включает зеркальное отображение, пока ваше приложение активно. "Кнопка Airplay", wether MPVolumeView или контроллер фильма, не контролирует зеркальное отображение (и, следовательно, функциональность внешнего дисплея). Видео и аудио, к сожалению, отделены от зеркалирования, и зеркалирование может быть включено или выключено только с помощью системного интерфейса зеркалирования.

итог: вы не можете включить этот экран AirPlay из вашего приложения.


наконец-то найден ответ, вы должны включить зеркальное отображение, чтобы получить новое уведомление экрана, но затем вы должны перезаписать экран со вторым содержимым экрана. Очень запутанно!

посмотреть этот пример:

экраны UIScreen всегда возвращают 1 экран

теперь, худшая часть. Вы можете добавить кнопку AirPlay внутри вашего приложения, используя это:

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

однако вы не можете включить зеркальное отображение из этого выбора! И там нет программного способа включить зеркальное отображение.

как я могу включить зеркальное отображение экрана AirPlay на iPhone 4S программно

таким образом, по-видимому, единственный способ иметь второй опыт экрана, чтобы проинструктировать пользователя, как включить AirPlay из многозадачной панели и убедитесь, что они включают зеркало.


Это кажется невозможным изнутри приложения, к сожалению. Только airplay звук может быть включен изнутри приложения afaik. Вот пример приложения, использующего второй экран с OpenGL и звуками http://developer.apple.com/library/ios/samplecode/GLAirplay/Introduction/Intro.html