【问题标题】:Callkit loudspeaker bug / how WhatsApp fixed it?Callkit 扬声器错误 / WhatsApp 如何修复它?
【发布时间】:2018-08-16 15:20:05
【问题描述】:

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

但是,WhatsApp 一开始就关闭了扬声器,并在 3 多秒后将其激活并开始工作。有没有人遇到过类似的情况,可以给我解决办法吗?

Youtube video link to demonstrate my problem

【问题讨论】:

  • 能否提供GitHub中的示例项目?
  • @Pan 问题解决了吗?
  • 不。仍然有这个问题......我为总共 800 个声望点做了赏金,但没有提供任何答案让我满意
  • @PanMluvčí 你找到解决方案了吗?我也面临同样的问题。
  • @GabrielGava nope...没有找到任何解决方案

标签: ios swift xcode whatsapp callkit


【解决方案1】:

苹果工程师提出了一个解决方法,应该修复 callkit 没有正确激活音频会话:

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

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

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

【讨论】:

    【解决方案2】:

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

    Swift 4 WebRTC 示例。 建立连接后调用 next

    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

    【讨论】:

    • 它的 .voiceChat 模式,将其更改为 .default,一切正常!不知道是什么原因造成的,但它是一个 CallKit 错误 imo
    【解决方案3】:

    来自Abnormal behavior of speaker button on system provided call screen的推荐

    以前的版本也遇到过同样的问题。所以这不是呼叫套件上发生的新问题。 此问题必须从 iOS 解决。我们对此没有任何控制权。

    请到苹果开发者论坛

    CallKit/detect speaker set

    [CALLKIT] audio session not activating?

    【讨论】:

    • 不。我没有像你说的那样冻结显示器。它可以工作,但我需要双击扬声器按钮来激活它并自行停用。
    • 我认为这不是 CallKit 功能的问题。您可以重新启动 iPhone,然后尝试。有时 iPhone 无法正常响应,因此您可以重新启动然后尝试。
    • 斯瓦蒂:我有 iph 5、6、6s,iphX。在所有这些设备上,您必须按两次才能看到有源扬声器及其行为不正确。所有其他按钮都可以正常工作,但扬声器效果不佳。
    • 是的...几乎相同的问题与相同的问题,但我看不到任何解决方案。
    • 伙计们....谢谢大家的回复...但是您的链接都是一文不值...那里没有好的信息。
    【解决方案4】:

    也许你可以将模式设置为 AVAudioSessionModeDefault。

    当我使用 CallKit + WebRTC

    1. 我配置了 AVAudioSessionModeDefault 模式。

    2. Alloc CXProvider 和 reportNewIncomingCallWithUUID

    3. 使用 WebRTC ,ICEConnected 后,WebRTC 将模式更改为 AVAudioSessionModeVoiceChat,然后出现扬声器问题。

    4. 稍后我将Mode设置回AVAudioSessionModeDefault,扬声器效果很好。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 我在实现这个时遇到了另一个问题。在通话连接后将模式从 voiceChat 更改为默认值时,我的音频会话 PortOverride 也会更改。例如,我正在使用扬声器通话,通话接通后,扬声器将变为麦克风。有什么建议吗?
      • 嗨,configureAudioSession 代码放在哪里?您的意思是 rtc 已连接或通话已连接?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      相关资源
      最近更新 更多