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;

此外,您还可以查看UIScreenDidConnectNotificationUIScreenDidDisconnectNotification 通知。有了所有这些,您就可以判断您是否已连接到 AirPlay、AirPlay 镜像是否处于活动状态、AirPlay 播放(非镜像)是否处于活动状态,或者您是否正在使用任何没有镜像的外部屏幕。

【讨论】:

isAirPlayMirroringActive 不工作,但其他工作就像一个魅力,谢谢。是因为[UIScreen screen] count 一直是1,可能以前不一样吧。【参考方案2】:

我不相信有任何公共 API 可以解决这个问题。我猜,在 Apple 看来,这不是您的应用程序关心的问题。用户可以使用应用程序的屏幕做什么:他们可以截屏并通过电子邮件发送给每个人,或者只需将电线插入投影仪并将其显示在建筑物的一侧。试图在应用程序中阻止这些是不可能的。

不过,您可以使用 Apple 的 Configurator 工具来实现其中的一些功能。它允许您配置公司拥有的 iOS 设备,以仅允许某些主机使用 AirPlay。它还可以防止屏幕截图和其他可能有用的东西。我不知道你是否能得到你正在寻找的东西,但如果你对要安装此应用程序的设备有一定程度的控制,这可能是值得关注的。

【讨论】:

感谢重播 - 是的,我们已经通过应用程序做了类似的事情,这允许客户公司限制某些功能,包括 AirPlay,但是要求只允许直接有线显示(而不是空中)。请注意,我们正在处理设备上可能包含的高度敏感信息,因此不幸的是,在这种情况下,它不一定适合默认的“用户应该能够做他们想做的事”场景。 另外,我不一定要使用公共 API,只是一种“Apple 合法”的检测方式 - 因为它将通过 Apple 的代码审查流程。

以上是关于iOS 是不是提供任何功能来检测外部屏幕是“硬连线”电视输出/HDMI 还是“网络”Airplay 显示器/设备?的主要内容,如果未能解决你的问题,请参考以下文章

如何HACK无线家用警报器?

使用 iOS Swift 检测外部屏幕

检测用户是不是在 iOS 上触摸过屏幕

用于检测设备是不是水平的 iOS 代码

检测地址栏是不是在 iOS 中显示

如何可靠地检测 iOS 9 上是不是连接了外部键盘?