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

时间:2014-01-08 02:58:05

标签: ios airplay

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

我已经看过非官方的AirPlay规格HERE,但看不到任何明显的方法来检测它。 有没有人知道是否可以使用合法/'公共'API来完成。

2 个答案:

答案 0 :(得分:6)

是的,确实有办法。

在您的应用中的某个位置,创建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 Mirroring是否处于活动状态,AirPlay播放(非镜像)是否处于活动状态,或者您是否使用任何没有镜像的外部屏幕。

答案 1 :(得分:2)

我不相信有任何公共API。我猜想,在Apple看来,这不是你应用的关注点。这取决于用户对应用程序屏幕的处理方式:他们可以将其截图并通过电子邮件发送给所有人,或者只需将电线插入投影仪并将其显示在建筑物的侧面即可。试图在应用程序中阻止这些是不可能的。

然而,您可以使用Apple的Configurator工具实现其中一些功能。例如,它允许您配置公司拥有的iOS设备,以便仅允许AirPlay访问某些主机。它还可以阻止屏幕截图和其他可能有用的内容。我不知道你是否能得到你正在寻找的东西,但是如果你对这个应用程序安装的设备有一定程度的控制权,那么可能需要注意一下。