我使用MPVolumeView显示Airplay图标,它工作正常。
但是我需要在Airplay网络出现时显示动画,并在播放网络时隐藏该动画。
Airplay开始和结束时是否有通知让我知道?
答案 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。