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

san*_*iva 21 iphone objective-c ios

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

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

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

Ste*_*ter 18

这正是你要找的 - https://github.com/StevePotter/AirPlayDetector

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

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

[AirPlayDetector defaultDetector].isAirPlayAvailable
Run Code Online (Sandbox Code Playgroud)

请享用!


amb*_*ght 8

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

所有你可以用公共API做的是检查是否有可用的无线路由,它里面包含了单曲:(在当你有一个简单的例子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;
}
Run Code Online (Sandbox Code Playgroud)

(实际上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;
}
Run Code Online (Sandbox Code Playgroud)

(答案AirPlayDetector不能保证Airplay可用 - 所有这一切都会检查MPVolumeView的routeSelection按钮的alpha值,无论如何在无线路由可用时都会显示,例如蓝牙.它将完全相同volumeView.areWirelessRoutesAvailable;)


Mic*_*cky 7

从iOS 7开始,您可以注册MPVolumeViewWirelessRoutesAvailableDidChangeNotification.