我一直在寻找一种方法来确定iOS外部屏幕是否有线连接或通过无线方式找不到任何明显的方法。
我已经看过非官方的AirPlay规格HERE,但看不到任何明显的方法来检测它。 有没有人知道是否可以使用合法/'公共'API来完成。
答案 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;
}
此外,您还可以查看UIScreenDidConnectNotification
和UIScreenDidDisconnectNotification
通知。有了这一切,您可以判断您是否连接到AirPlay,AirPlay Mirroring是否处于活动状态,AirPlay播放(非镜像)是否处于活动状态,或者您是否使用任何没有镜像的外部屏幕。
答案 1 :(得分:2)
我不相信有任何公共API。我猜想,在Apple看来,这不是你应用的关注点。这取决于用户对应用程序屏幕的处理方式:他们可以将其截图并通过电子邮件发送给所有人,或者只需将电线插入投影仪并将其显示在建筑物的侧面即可。试图在应用程序中阻止这些是不可能的。
然而,您可以使用Apple的Configurator工具实现其中一些功能。例如,它允许您配置公司拥有的iOS设备,以便仅允许AirPlay访问某些主机。它还可以阻止屏幕截图和其他可能有用的内容。我不知道你是否能得到你正在寻找的东西,但是如果你对这个应用程序安装的设备有一定程度的控制权,那么可能需要注意一下。