Y a-t-il une notification pour détecter un temps D'antenne dans L'objectif-C?

J'utilise MPVolumeView pour montrer L'icône de temps D'antenne et cela fonctionne très bien.

mais je dois montrer une animation quand Airplay network arrive, et cacher cette animation quand airplay network se cache.

y a-t-il une notification qui me préviendra quand la diffusion commencera et se terminera?

20
demandé sur Johannes Fahrenkrug 2012-02-14 09:36:19

5 réponses

C'est exactement ce que vous êtes à la recherche pour - https://github.com/StevePotter/AirPlayDetector

il s'agit d'une classe unique qui fournit une propriété pour déterminer si les appareils de diffusion sont actifs. Et une notification lorsque la disponibilité change.

L'utiliser est simple. Comme, pour déterminer la disponibilité, vous écrivez:

[AirPlayDetector defaultDetector].isAirPlayAvailable

Profitez-en!

18
répondu Steve Potter 2012-05-14 15:19:50

pour être précis: Pour vérifier exactement pour airplay avec L'API publique: NO

Tout ce que vous pouvez faire avec L'API publique est de vérifier routes sans fil disponiblesMPVolumeView exemple accroché quelque part à votre vue, vous pouvez simplement appeler volumeView.areWirelessRoutesAvailable;)

si vous êtes curieux comment vérifier si exactement airplay est disponible avec privé 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;
}

Et MPVolumeViewMPAVRoutingController instance comme son ivar, donc le -areWirelessRoutesAvailable est juste un accesseur exactement pour [volumeView->_routingController wirelessDisplayRoutesAvailable])

AVAudioSession expose currentRoute pour vous, de sorte que vous ne pouvez vérifier si airplay est active facilement avec:

- (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;
}

(la réponse AirPlayDetector ne garantit pas que Airplay est disponible - tout ce qu'il fait, il vérifie la valeur alpha du bouton routeSelection de MPVolumeView, qui s'affichera dans tous les cas quand les routes sans fil sont disponibles, bluetooth par exemple. Il permettra de faire exactement la même chose que volumeView.areWirelessRoutesAvailable;)

6
répondu ambientlight 2014-07-30 19:29:14

Il ya un Mpvolumeviewwirelessroutsavailable Didchangenotification depuis iOS 7 vous pouvez vous inscrire pour.

6
répondu Alf 2014-11-17 14:03:09

Il peut être fait beaucoup plus facile avec ReactiveCocoa. Check it out:

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);
        }];
    }
}
3
répondu Roman B. 2013-05-25 15:19:23

6 ans plus tard. Je pense que Sankar Siva n'a pas demandé détection, mais activer une voie de diffusion.

j'ai augmenté @Alf parce qu'il m'a placé dans la bonne direction, mais il ne répond pas à la question.

MPVolumeViewWirelessRoutesAvailableDidChangeNotification tire quand MPVolumeView détecte un nouvel itinéraire.

d'autre part, MPVolumeViewWirelessRouteActiveDidChangeNotification déclenche quand une nouvelle route est prise, par exemple: quand vous sélectionnez votre Apple TV par exemple.

Pas besoin de privé de l'API.

0
répondu Martin 2018-01-17 10:50:54