iOS 是不是提供任何功能来检测外部屏幕是“硬连线”电视输出/HDMI 还是“网络”Airplay 显示器/设备?
Posted
技术标签:
【中文标题】iOS 是不是提供任何功能来检测外部屏幕是“硬连线”电视输出/HDMI 还是“网络”Airplay 显示器/设备?【英文标题】:Does iOS provide any functionality to detect if external screen is a 'hardwired' TV Out / HDMI vs a 'network' Airplay display / device?iOS 是否提供任何功能来检测外部屏幕是“硬连线”电视输出/HDMI 还是“网络”Airplay 显示器/设备? 【发布时间】:2014-01-08 02:58:04 【问题描述】:我一直在寻找一种方法来确定 ios 外部屏幕是电缆连接还是无线连接,但找不到任何明显的方法。
我看过非官方的 AirPlay 规格 HERE,但看不到任何明显的检测方法。 有人知道这是否可以使用合法/“公共”API 来完成。
【问题讨论】:
你为什么想知道?无论如何,“硬连线”电视输出实际上是 AirPlay-over-a-wire。您到底想检测什么? 是的,我知道它本质上是相同的有线协议,但我们开发了一个安全敏感的应用程序,一些客户希望限制它只允许通过硬连线连接进行 Airplay 镜像 - 由于广为人知的不安全性通过 wifi 广播 Airpay 显示器的可能性以及未经授权的各方查看它的可能性。 【参考方案1】:是的,确实有办法。
在您的应用中的某处,创建一个MPVolumeView
的实例。在某些实例变量中保持不变。您不必将它作为子视图添加到任何东西,它只需要存在即可。
然后像这样订阅MPVolumeViewWirelessRouteActiveDidChangeNotification
:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleWirelessRouteActiveDidChangeNotification:)
name:MPVolumeViewWirelessRouteActiveDidChangeNotification
object:nil];
添加这些方法以了解外部显示器的状态:
- (BOOL)isAirPlayConnected
return _volumeView.isWirelessRouteActive;
- (BOOL)isAirPlayMirroringActive
if ([self isAirPlayConnected])
NSArray *screens = [UIScreen screens];
if ([screens count] > 1)
return [screens[1] mirroredScreen] == [UIScreen mainScreen];
return NO;
- (BOOL)isAirPlayPlaybackActive
return [self isAirPlayConnected] && ![self isAirPlayMirroringActive];
- (BOOL)isExternalPlaybackActive
if ([self isAirPlayPlaybackActive])
return YES;
else
NSArray *screens = [UIScreen screens];
if ([screens count] > 1)
return [screens[1] mirroredScreen] != [UIScreen mainScreen];
return NO;
此外,您还可以查看UIScreenDidConnectNotification
和UIScreenDidDisconnectNotification
通知。有了所有这些,您就可以判断您是否已连接到 AirPlay、AirPlay 镜像是否处于活动状态、AirPlay 播放(非镜像)是否处于活动状态,或者您是否正在使用任何没有镜像的外部屏幕。
【讨论】:
isAirPlayMirroringActive 不工作,但其他工作就像一个魅力,谢谢。是因为[UIScreen screen] count 一直是1,可能以前不一样吧。【参考方案2】:我不相信有任何公共 API 可以解决这个问题。我猜,在 Apple 看来,这不是您的应用程序关心的问题。用户可以使用应用程序的屏幕做什么:他们可以截屏并通过电子邮件发送给每个人,或者只需将电线插入投影仪并将其显示在建筑物的一侧。试图在应用程序中阻止这些是不可能的。
不过,您可以使用 Apple 的 Configurator 工具来实现其中的一些功能。它允许您配置公司拥有的 iOS 设备,以仅允许某些主机使用 AirPlay。它还可以防止屏幕截图和其他可能有用的东西。我不知道你是否能得到你正在寻找的东西,但如果你对要安装此应用程序的设备有一定程度的控制,这可能是值得关注的。
【讨论】:
感谢重播 - 是的,我们已经通过应用程序做了类似的事情,这允许客户公司限制某些功能,包括 AirPlay,但是要求只允许直接有线显示(而不是空中)。请注意,我们正在处理设备上可能包含的高度敏感信息,因此不幸的是,在这种情况下,它不一定适合默认的“用户应该能够做他们想做的事”场景。 另外,我不一定要使用公共 API,只是一种“Apple 合法”的检测方式 - 因为它将通过 Apple 的代码审查流程。以上是关于iOS 是不是提供任何功能来检测外部屏幕是“硬连线”电视输出/HDMI 还是“网络”Airplay 显示器/设备?的主要内容,如果未能解决你的问题,请参考以下文章