Есть ли уведомление для обнаружения AirPlay в Objective-C?
Я использую MPVolumeView для показа значка Airplay, и он отлично работает.
Но мне нужно показать анимацию, когда появляется сеть Airplay, и скрыть эту анимацию, когда скрывается сеть трансляции.
Есть ли уведомление, которое сообщит мне, когда начинается и заканчивается Airplay?
Ответы
Ответ 1
Это именно то, что вы ищете - https://github.com/StevePotter/AirPlayDetector
Это один класс, который предоставляет свойство для определения того, активны ли устройства трансляции. И уведомление при изменении доступности.
Использование просто. Например, чтобы определить доступность, вы пишете:
[AirPlayDetector defaultDetector].isAirPlayAvailable
Наслаждайтесь!
Ответ 2
Если быть точным:
Чтобы точно проверить трансляцию с публичным API: НЕТ
Все, что вы можете сделать с помощью общедоступного API, - это проверить наличие доступных беспроводных маршрутов, в том числе его трансляцию: (В простом случае, когда экземпляр MPVolumeView
подключен где-то к вашему представлению, вы можете просто позвонить volumeView.areWirelessRoutesAvailable;
)
Если вам интересно, как проверить, действительно ли доступен эфир, частный 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 доступен - все, что он делает, проверяет альфа-значение кнопки MPVolumeView routeSelection, которая будет отображаться в любом случае, когда доступны беспроводные маршруты, например, bluetooth. будет делать то же самое, что и volumeView.areWirelessRoutesAvailable;
)
Ответ 3
Там есть MPVolumeViewWirelessRoutesAvailableDidChangeNotification, так как iOS 7 вы можете зарегистрировать для.
Ответ 4
Это можно сделать гораздо проще с ReactiveCocoa. Проверьте это:
MPVolumeView *myVolumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(0, 0, 180, 22)];
for (UIView *view in myVolumeView.subviews) {
if ([view isKindOfClass:[UIButton class]]) {
[[RACAbleWithStart(view, alpha) distinctUntilChanged] subscribeNext:^(id x) {
NSLog(@"airplay button visibility changed %@", x);
}];
[[RACAbleWithStart(view, frame) distinctUntilChanged] subscribeNext:^(id x) {
NSLog(@"airplay button connection changed %@", x);
}];
}
}
Ответ 5
6 лет спустя.
Я думаю, что Санкар Шива не просил обнаружить, но для активации маршрута трансляции.
Я поднял @Alf, потому что он поставил меня в правильном направлении, но он не отвечает на вопрос.
MPVolumeViewWirelessRoutesAvailableDidChangeNotification
срабатывает, когда MPVolumeView обнаруживает новый маршрут.
С другой стороны, MPVolumeViewWirelessRouteActiveDidChangeNotification
срабатывает при новом маршруте, например: при выборе Apple TV, например.
Нет необходимости в частном API.