iOS是否提供任何功能来检测外部屏幕是"硬连线"TV Out/HDMI还是"网络"Airplay显示器/设备?

Her*_*rwr 8 ios airplay

我一直在寻找一种方法来确定iOS外部屏幕是否有线连接或通过无线方式找不到任何明显的方法.

我在这里看过非官方的AirPlay规格,但看不到任何明显的检测方法.有没有人知道是否可以使用legal /'public'API完成此操作.

Joh*_*rug 6

是的,确实有办法.

在您的应用中的某个位置,创建一个实例MPVolumeView.在某些实例中保持变量.您不必将其作为子视图添加到任何内容,它只需要存在.

然后订阅MPVolumeViewWirelessRouteActiveDidChangeNotification类似:

  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(handleWirelessRouteActiveDidChangeNotification:)
                                               name:MPVolumeViewWirelessRouteActiveDidChangeNotification
                                             object:nil];
Run Code Online (Sandbox Code Playgroud)

添加这些方法以了解外部显示的状态:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

此外,您可以检查UIScreenDidConnectNotificationUIScreenDidDisconnectNotification通知.有了这一切,您可以判断您是否连接到AirPlay,AirPlay Mirroring是否处于活动状态,AirPlay播放(非镜像)是否处于活动状态,或者您是否使用任何没有镜像的外部屏幕.


Jes*_*sak 2

我不相信有任何公共 API 可以做到这一点。我猜想,在苹果看来,这不是你的应用程序关心的问题。这取决于用户如何处理应用程序的屏幕:他们可以截屏并通过电子邮件发送给每个人,或者只是将电线插入投影仪并将其显示在建筑物的一侧。试图在应用程序内阻止这些行为不太可能。

不过,您可以使用 Apple 的配置器工具来实现其中一些目的。例如,它允许您配置公司拥有的 iOS 设备,以仅允许对某些主机进行 AirPlay。它还可以阻止屏幕截图和其他可能有用的事情。我不知道您是否能准确获得您正在寻找的内容,但如果您对要安装此应用程序的设备有一定程度的控制,则可能需要考虑一下。