You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CallKit结合TokBox接听来电后扬声器自动激活且无法关闭问题求助

解决CallKit搭配TokBox时扬声器自动激活且无法关闭的问题

我之前帮朋友解决过几乎一模一样的问题!这大概率是CallKit和TokBox的音频会话配置冲突搞的鬼,给你几个亲测有效的解决方向:

  • 调整CallKit激活后的音频会话配置
    CallKit接管来电后会自动配置系统音频会话,默认可能会强制路由到扬声器。你需要在provider:didActivateAudioSession:方法里手动覆盖这个设置,确保音频会话的类别和模式符合语音通话的需求,同时禁用自动扬声器激活:

    func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
        do {
            // 设置音频会话为播放+录制,模式为语音聊天
            try audioSession.setCategory(.playAndRecord, mode: .voiceChat, options: [.allowBluetooth, .allowBluetoothA2DP])
            try audioSession.setActive(true)
            // 关键:禁用自动路由到扬声器,让音频默认走听筒
            try audioSession.overrideOutputAudioPort(.none)
        } catch {
            print("配置音频会话失败: \(error)")
        }
        // 等音频会话配置完成后,再初始化TokBox的会话
        yourTokBoxSessionInstance.start()
    }
    
  • 手动控制TokBox的音频路由
    TokBox的OTAudioDeviceManager可以直接控制音频输出路由,你需要在CallKit激活音频会话之后,强制设置默认路由为听筒,避免被系统的自动设置覆盖:

    // 在CallKit激活音频会话后调用
    OTAudioDeviceManager.shared().setAudioRoute(.receiver)
    

    同时可以监听TokBox的音频路由变化通知,确保路由状态和你的UI按钮同步:

    NotificationCenter.default.addObserver(self, selector: #selector(audioRouteChanged), name: NSNotification.Name.OTAudioRouteChanged, object: nil)
    
  • 修复扬声器按钮的点击逻辑
    当用户点击扬声器按钮时,需要同时更新系统音频会话和TokBox的路由设置,确保两者状态一致:

    @IBAction func toggleSpeaker(_ sender: UIButton) {
        sender.isSelected = !sender.isSelected
        let audioSession = AVAudioSession.sharedInstance()
        do {
            if sender.isSelected {
                // 切换到扬声器
                try audioSession.overrideOutputAudioPort(.speaker)
                OTAudioDeviceManager.shared().setAudioRoute(.speaker)
            } else {
                // 切回听筒
                try audioSession.overrideOutputAudioPort(.none)
                OTAudioDeviceManager.shared().setAudioRoute(.receiver)
            }
        } catch {
            print("切换扬声器失败: \(error)")
        }
    }
    

另外别忘了在Info.plist里添加必要的权限描述,比如NSMicrophoneUsageDescription(麦克风权限)和NSBluetoothAlwaysUsageDescription(如果需要支持蓝牙音频设备的话),否则音频会话配置可能会失败。

我朋友当时的问题就是CallKit激活时自动把音频路由到了扬声器,而TokBox没有正确响应这个变化,按照上面的步骤调整后就完全解决了,你可以试试看!

内容的提问来源于stack exchange,提问作者Abhishek Mitra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:24:03