我正在将 CallKit 用于我的音频通话应用程序。 CallKit 中的扬声器按钮无法正常工作。它会自动打开和关闭。当我尝试禁用扬声器按钮时,我仍然可以通过扬声器听到声音。
我想要的是最初将通话设置为使用扬声器,然后允许用户根据他们在 CallKit UI 中的操作在听筒和扬声器之间切换。但是,当我禁用扬声器按钮以通过耳机播放时,它不起作用。这个问题有解决办法吗?
我发现 CallKit 扬声器 UI 问题仍未解决,因为有许多与同一问题相关的未解决问题。即使存在 UI 问题,我也希望根据用户的选择通过耳机或扬声器播放音频,无论按钮的 UI 状态如何。
下面是日志,我不确定这个
categoryChange
和 routeConfigurationChange
是如何被触发并将其从扬声器更新到接收器的。
下面是我用于配置音频会话的代码,我正在
func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession)
中激活音频会话
func configureAudioSession() {
let rtcAudioSession = RTCAudioSession.sharedInstance()
rtcAudioSession.lockForConfiguration()
do {
var categoryOptions: AVAudioSession.CategoryOptions = [.defaultToSpeaker, .allowBluetoothA2DP, .allowAirPlay, .allowBluetooth]
try rtcAudioSession.setCategory(.playAndRecord, with: categoryOptions)
try rtcAudioSession.setMode(.voiceChat)
} catch {
//Error
}
rtcAudioSession.unlockForConfiguration()
NotificationCenter.default.addObserver(self, selector: #selector(routeChange), name: AVAudioSession.routeChangeNotification, object: nil)
}
@objc private func routeChange(_ n: Foundation.Notification) {
let session = AVAudioSession.sharedInstance()
let currentRoute = session.currentRoute
if session.currentRoute.outputs.contains(where: { $0.portType == .headphones || $0.portType == .bluetoothHFP || $0.portType == .bluetoothA2DP }) {
try? session.overrideOutputAudioPort(.none)
} else {
try? session.overrideOutputAudioPort(.speaker)
}
}
你解决这个问题了吗?我也遇到同样的问题。