Callkit 扬声器错误 / WhatsApp 如何修复它



我有一个具有Callkit功能的应用程序。当我按下扬声器按钮时,它会闪烁并动画化到 OFF 状态(有时扬声器设置为 LOUD,但图标仍然关闭(。当我多次点击它时...可以清楚地看到,此功能的行为不正确。

但是,WhatsApp 一开始扬声器已关闭,并在 3+ 秒后激活它并正常工作。有没有人遇到过类似的事情,可以给我一个解决方案?

Youtube视频链接来演示我的问题

苹果工程师提出了一种解决方法,可以修复呼叫套件未正确激活音频会话的问题:

解决方法是在调用 -provider:performAnswerCallAction: 方法之前,在应用生命周期的早期配置应用的音频会话(调用configureAudioSession()(。例如,您可以在呼叫-[CXProvider reportNewIncomingCallWithUUID:update:completion:]之前立即呼叫configureAudioSession(),以确保在通知 CallKit 有关传入呼叫之前完全配置音频会话。

寄件人: https://forums.developer.apple.com/thread/64544#189703

如果这没有帮助,您可能应该发布一个示例项目,重现您的行为,以便我们能够进一步分析它。

上面的答案是正确的,"语音聊天"模式毁了一切。

WebRTC 的 Swift 4 示例。建立连接后呼叫下一个

let rtcAudioSession = RTCAudioSession.sharedInstance()
rtcAudioSession.lockForConfiguration()
do {
    try rtcAudioSession.setCategory(AVAudioSession.Category.playAndRecord.rawValue, with: 
    AVAudioSession.CategoryOptions.mixWithOthers)
    try rtcAudioSession.setMode(AVAudioSession.Mode.default.rawValue)
    try rtcAudioSession.overrideOutputAudioPort(.none)
    try rtcAudioSession.setActive(true)
} catch let error {
    debugPrint("Couldn't force audio to speaker: (error)")
}
rtcAudioSession.unlockForConfiguration()

您也可以使用 AVAudioSession.sharedInstance(( 代替 RTC

引用自系统提供的呼叫屏幕上扬声器按钮的异常行为

在以前的版本中也遇到了同样的问题。因此,这不是呼叫工具包上发生的新问题。此问题必须从iOS解决。我们无法控制这一点。

请浏览苹果开发者论坛

呼叫套件/检测扬声器组

[呼叫套件] 音频会话未激活?

也许你可以将Mode设置为AVAudioSessionModeDefault。

当我使用 CallKit + WebRTC 时

  1. 我配置 AVAudioSessionModeDefault 模式。

  2. Alloc CXProvider and reportNewIncomingCallWithUUID

  3. 使用WebRTC,在ICEC连接后,WebRTC将模式更改为AVAudioSessionModeVoiceChat,然后发生扬声器问题。

  4. 后来我将Mode设置回AVAudioSessionModeDefault,扬声器工作得很好。

我已经通过执行以下步骤解决了这个问题。

  • 在 CXAnswerCallAction 中,使用以下代码设置音频会话配置。

    RTCDispatcher.dispatchAsync(on: RTCDispatcherQueueType.typeAudioSession) {
    let audioSession = RTCAudioSession.sharedInstance()
    audioSession.lockForConfiguration()
    let configuration = RTCAudioSessionConfiguration.webRTC()
    configuration.categoryOptions = [AVAudioSessionCategoryOptions.allowBluetoothA2DP,AVAudioSessionCategoryOptions.duckOthers,
                                     AVAudioSessionCategoryOptions.allowBluetooth]
    try? audioSession.setConfiguration(configuration)
    audioSession.unlockForConfiguration()}
    
  • 呼叫连接后,我将音频会话类别重置为默认值。

    func configureAudioSession() {
    let session = RTCAudioSession.sharedInstance()
    session.lockForConfiguration()
    do {            
        try session.setCategory(AVAudioSession.Category.playAndRecord.rawValue, with: .allowBluetooth)
        try session.setMode(AVAudioSession.Mode.default.rawValue)
        try session.setPreferredSampleRate(44100.0)
        try session.setPreferredIOBufferDuration(0.005)
    } 
    catch let error {
        debugPrint("Error changeing AVAudioSession category: (error)")
    }
    session.unlockForConfiguration()}
    

感谢 SO @Алексей Смольский 的帮助。

相关内容

  • 没有找到相关文章

最新更新