iOS AirPlay:我的应用程序仅在镜像打开时才收到外部显示器通知?
Posted
技术标签:
【中文标题】iOS AirPlay:我的应用程序仅在镜像打开时才收到外部显示器通知?【英文标题】:iOS AirPlay: my app is only notified of an external display when mirroring is ON? 【发布时间】:2012-01-26 19:09:41 【问题描述】:我正在尝试在我的应用中启用 AirPlay 支持。我不做视频;我想将外接显示器用作“第二个显示器”。
这是我的问题:如果我从 AirPlay 按钮中选择“AppleTV”,我的应用不会收到通知。我的应用程序唯一收到通知是当我离开我的应用程序时,转到操作系统级别的 AirPlay 按钮,在那里选择“AppleTV”并打开镜像。如果我关闭镜像,我的应用会被告知外接显示器已消失。
所以:
-
为什么当我选择外部显示器时我的应用程序没有收到通知
在我的应用中?
为什么我的应用会收到通知
当我打开镜像时外接显示器......而不是之前?我显然误解了一些东西,但似乎打开镜像应该通知我的应用程序外部显示器已经消失(而不是现在可用,因为操作系统现在应该使用该外部显示器进行镜像。)
下面的代码示例。提前感谢您的帮助!
- (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];
【问题讨论】:
【参考方案1】:这是正确的,不幸的是。辅助显示器(播放屏幕)仅适用于镜像。
这是一个展示如何实现此功能的应用程序: https://github.com/quellish/AirplayDemo
查看您的代码,当用户进入播放菜单并在您的应用处于活动状态时打开镜像时,您应该会收到 UIScreenDidConnectNotification。 “Airplay 按钮”,无论是 MPVolumeView 还是电影控制器,都不能控制镜像(因此也不能控制外部显示功能)。不幸的是,视频和音频输出与镜像是分开的,并且只能使用系统范围的镜像 UI 打开或关闭镜像。
底线:您无法在应用内打开该 AirPlay 屏幕。
【讨论】:
谢谢。糟糕:看起来 Apple 在这方面的 UI 做得很糟糕。 还是这样吗?我看到这个帖子已经很老了,我正在寻找一种方法。【参考方案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 并确保他们打开镜像。
【讨论】:
【参考方案3】:不幸的是,从应用程序内部似乎不可能。只能从应用程序 afaik 中打开播放声音。这是一个使用带有 OpenGL 和声音的第二个屏幕的示例应用程序 http://developer.apple.com/library/ios/samplecode/GLAirplay/Introduction/Intro.html
【讨论】:
以上是关于iOS AirPlay:我的应用程序仅在镜像打开时才收到外部显示器通知?的主要内容,如果未能解决你的问题,请参考以下文章
AppDelegate 方法仅在应用程序已打开时从通知中调用