Подтвердить что ты не робот

Есть ли уведомление для обнаружения AirPlay в Objective-C?

Я использую MPVolumeView для показа значка Airplay, и он отлично работает.

Но мне нужно показать анимацию, когда появляется сеть Airplay, и скрыть эту анимацию, когда скрывается сеть трансляции.

Есть ли уведомление, которое сообщит мне, когда начинается и заканчивается Airplay?

4b9b3361

Ответ 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.