Если быть точным:
Чтобы точно проверить трансляцию с публичным API: NO
Все, что вы можете сделать с общедоступным API, - это проверить доступных беспроводных маршрутов , что включает в себя трансляцию: (В простом случае, когда у вас есть экземпляр MPVolumeView
, подключенный где-то на ваш взгляд, вы можно просто позвонить volumeView.areWirelessRoutesAvailable;
)
Если вам интересно, как проверить, доступна ли трансляция с помощью private API :
- (BOOL)isAirplayAvailable
{
Class MPAVRoutingController = NSClassFromString(@"MPAVRoutingController");
id routingController = [[MPAVRoutingController alloc] init];
NSArray* availableRoutes = [routingController performSelector:@selector(availableRoutes)];
for (id route in availableRoutes) {
NSDictionary* routeDescription = [route performSelector:@selector(avRouteDescription)];
if ([routeDescription[@"AVAudioRouteName"] isEqualToString:@"AirTunes"])
return true;
}
return false;
}
(На самом деле MPVolumeView
имеет экземпляр MPAVRoutingController
в качестве своего ivar, поэтому -areWirelessRoutesAvailable
- это просто средство доступа именно для [volumeView->_routingController wirelessDisplayRoutesAvailable]
)
Также AVAudioSession
предоставляет вам currentRoute
, так что вы можете легко проверить, активен ли трансляция с помощью:
- (BOOL)isAudioSessionUsingAirplayOutputRoute
{
AVAudioSession* audioSession = [AVAudioSession sharedInstance];
AVAudioSessionRouteDescription* currentRoute = audioSession.currentRoute;
for (AVAudioSessionPortDescription* outputPort in currentRoute.outputs){
if ([outputPort.portType isEqualToString:AVAudioSessionPortAirPlay])
return true;
}
return false;
}
(ответ о AirPlayDetector
не гарантирует доступности Airplay - все, что он делает, проверяет альфа-значение кнопки routeSelection в MPVolumeView, которая будет отображаться в любом случае, когда доступны беспроводные маршруты, например, через bluetooth. будет делать то же самое, что и volumeView.areWirelessRoutesAvailable;
)