在Objective-C中是否有任何检测AirPlay的通知?

时间:2012-02-14 05:36:19

标签: iphone objective-c ios

我使用MPVolumeView显示Airplay图标,它工作正常。

但是我需要在Airplay网络出现时显示动画,并在播放网络时隐藏该动画。

Airplay开始和结束时是否有通知让我知道?

5 个答案:

答案 0 :(得分:18)

这正是您所需要的 - https://github.com/StevePotter/AirPlayDetector

这是一个单独的类,它提供了一个属性来确定airplay设备是否处于活动状态。并在可用性发生变化时发出通知。

使用它很简单。比如,为了确定你写的可用性:

[AirPlayDetector defaultDetector].isAirPlayAvailable

享受!

答案 1 :(得分:8)

确切地说: 要使用公共API确切检查airplay:

您可以使用公共API执行的操作是检查可用的无线路由,其中包括airplay :(在简单的情况下,当您将MPVolumeView实例连接到您的某处时查看,您只需拨打volumeView.areWirelessRoutesAvailable;

即可

如果您很好奇如何使用私有API 检查是否可以使用airplay:

- (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,因此您可以通过以下方式检查airplay是否活跃:

- (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按钮的alpha值,无论何时无线路径都会显示是可用的,例如蓝牙。它将与volumeView.areWirelessRoutesAvailable;

完全相同

答案 2 :(得分:7)

您可以注册自iOS 7以来的MPVolumeViewWirelessRoutesAvailableDidChangeNotification。

答案 3 :(得分:3)

使用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);
        }];
    }
}

答案 4 :(得分:0)

6年后。 我认为Sankar Siva没有要求检测,而是要求激活播放播放路线。

我已经提升了@Alf,因为他让我朝着正确的方向前进,但他没有回答这个问题。

当MPVolumeView 检测到新路由时,

MPVolumeViewWirelessRoutesAvailableDidChangeNotification会触发。

另一方面,MPVolumeViewWirelessRouteActiveDidChangeNotification会在拍摄新路线时触发,例如:当您选择Apple TV时。

无需私有API。