iOS AirPlay:我的应用程序仅在镜像开启时通知外部显示器?

时间:2012-01-26 19:09:42

标签: ios airplay

我正在尝试在我的应用中启用AirPlay支持。我不是在做视频;我想将外部显示器用作“第二显示器”。

这是我的问题:如果我从AirPlay按钮选择“AppleTV”,我的应用程序不会收到通知。我的应用程序获得通知的唯一一次是当我离开我的应用程序时,转到操作系统级别的AirPlay按钮,在那里选择“AppleTV”并打开镜像。如果我关闭镜像,我的应用程序会被告知外部显示器已经消失。

所以:

  1. 当我从中选择外部显示器时,为什么我的应用程序不会收到通知 在我的应用程序中?
  2. 为什么我的应用会收到有关存在的通知 我开镜像时的外部显示......而不是之前?我显然误解了一些东西,但看起来像镜像应该通知我的应用程序外部显示器已经消失(而不是现在可用,因为操作系统现在应该使用外部显示器进行镜像。)
  3. 下面的代码示例。在此先感谢您的帮助!

    - (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 个答案:

答案 0 :(得分:8)

不幸的是,这是正确的。辅助显示屏(airplay屏幕)仅适用于镜像。

这是一个显示如何实现此功能的应用程序: https://github.com/quellish/AirplayDemo

查看您的代码,当用户进入播放菜单并在您的应用处于活动状态时打开镜像时,您应该获取UIScreenDidConnectNotification。 MPVolumeView或电影控制器的“Airplay按钮”不控制镜像(因此也不控制外部显示功能)。不幸的是,视频和音频输出与镜像分开,只能使用系统范围的镜像UI打开或关闭镜像。

底线:您无法在应用内打开AirPlay屏幕。

答案 1 :(得分:2)

终于找到了答案,你必须启用镜像才能获得新的屏幕通知,但是你应该用你的第二个屏幕内容覆盖屏幕。非常混乱!

见这个例子:

UIScreen screens always return 1 screen

现在,最糟糕的部分。您可以使用以下内容在应用内添加AirPlay按钮:

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

但是,您无法从此选择器启用镜像!并且没有以编程方式打开镜像。

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

显然,获得第二个屏幕体验的唯一方法是指导您的用户如何从多任务栏打开AirPlay并确保它们开启镜像。

答案 2 :(得分:0)

不幸的是,似乎不可能从应用程序内部。只有airplay声音可以从app afaik内部打开。这是一个使用第二个屏幕与OpenGL和声音http://developer.apple.com/library/ios/samplecode/GLAirplay/Introduction/Intro.html

的示例应用程序