所以我的问题的确切答案:
(i) 除了切换到内置扬声器外,无法使用公共 API 以编程方式切换 audioRoutes。
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
(ii) 只有在激活 AudioRoute 的情况下才能检索 airplay-device 的名称。 Get name of AirPlay device using AVPlayer
因此,呈现自定义 UI 控件以选择播放的实用解决方案是:
要自定义MPVolumeView,您可以在此处禁用volumeSlider并自定义routeButton。但是,您没有其他选择可以在UIActionSheet 中的苹果兼容无线设备(airPlay、蓝牙等)列表中选择 airplayDevice,当您点击routeButton 时会弹出,但您可以观察用户何时会在那里进行选择通过订阅 audioRouteChangeNotification:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteHasChangedNotification:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];
(另请注意,如果您插入/拔出耳机,它也会触发此通知)
如果您有兴趣如何检索所有可用的音频路由并使用 私有 API 以编程方式切换:
MPMediaPlayer 框架包含一个私有类MPAVRoutingController,它可以让你做到这一点:
Class MPAVRoutingController = NSClassFromString(@"MPAVRoutingController");
Class MPAVRoute = NSClassFromString(@"MPAVRoute");
id routingController = [[MPAVRoutingController alloc] init];
NSArray* availableRoutes = [routingController performSelector:@selector(availableRoutes)];
BOOL isSwitchSuccesful = [[routingController performSelector:@selector(pickRoute:) withObject:availableRoutes.lastObject] boolValue];
(如果你想访问audioRoute信息并检查它是否是Airplay:Detecting airplayRoute)