Есть ли уведомление об обнаружении AirPlay в Objective-C? - PullRequest
21 голосов
/ 14 февраля 2012

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

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

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

Ответы [ 5 ]

18 голосов
/ 14 мая 2012

Это именно то, что вы ищете - https://github.com/StevePotter/AirPlayDetector

Это единственный класс, который предоставляет свойство, чтобы определить, активны ли устройства трансляции. И уведомление об изменении доступности.

Использовать это просто. Мол, для определения доступности пишите:

[AirPlayDetector defaultDetector].isAirPlayAvailable

Наслаждайтесь!

8 голосов
/ 30 июля 2014

Если быть точным: Чтобы точно проверить трансляцию с публичным 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;)

7 голосов
/ 17 ноября 2014

Существует MPVolumeViewWirelessRoutesAvailableDidChangeNotification, поскольку в iOS 7 вы можете зарегистрироваться.

3 голосов
/ 25 мая 2013

Это можно сделать намного проще с 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);
        }];
    }
}
0 голосов
/ 17 января 2018

6 лет спустя.Я думаю, что Санкар Шива не просил обнаружение , но активировал маршрут трансляции.

Я поднял @Alf, потому что он поставил меня в правильном направлении,но он не отвечает на вопрос.

MPVolumeViewWirelessRoutesAvailableDidChangeNotification срабатывает, когда MPVolumeView обнаруживает новый маршрут.

С другой стороны, MPVolumeViewWirelessRouteActiveDidChangeNotification срабатывает при выборе нового маршрута, например: при выборенапример, ваш Apple TV.

Нет необходимости в частном API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...