Callkit扬声器bug / WhatsApp如何修复它?

时间:2018-03-08 09:59:27

标签: ios swift xcode whatsapp callkit

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

然而,WhatsApp在开始时扬声器关闭,3秒后激活它并开始工作。有没有人遇到类似的东西,可以给我一个解决方案吗?

Youtube video link to demonstrate my problem

5 个答案:

答案 0 :(得分:3)

Apple工程师提出了一种解决方法,它应该修复callkit而不是正确激活音频会话:

  

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

来自:https://forums.developer.apple.com/thread/64544#189703

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

答案 1 :(得分:0)

参考Abnormal behavior of speaker button on system provided call screen

以前的版本也遇到了同样的问题。所以这不是电话套件上发生的新问题。 此问题必须从iOS解决。我们无法控制这一点。

请浏览苹果开发者论坛

CallKit/detect speaker set

[CALLKIT] audio session not activating?

答案 2 :(得分:0)

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

当我使用CallKit + WebRTC

  1. 我配置了AVAudioSessionModeDefault模式。

  2. Alloc CXProvider和reportNewIncomingCallWithUUID

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

  4. 稍后我将setMode返回到AVAudioSessionModeDefault,扬声器运行良好。

答案 3 :(得分:0)

以上答案是正确的,“语音聊天”模式破坏了一切。

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

答案 4 :(得分:0)

我已按照以下步骤解决了该问题。

  • 在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()}
    
  • 呼叫接通后,我将AudioSession类别重置为默认值。

    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 @Алексей Смольский的帮助。