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?
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!
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 MPVolumeView
MPAVRoutingController
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;
)
Il ya un Mpvolumeviewwirelessroutsavailable Didchangenotification depuis iOS 7 vous pouvez vous inscrire pour.
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);
}];
}
}
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.