交换通话后,Callkit可以重新激活声音



我正在开发callkit应用程序,我有问题,呼叫holding在callkit屏幕上"交换"呼叫直到用户返回应用程序内通话屏幕时,呼叫holding无法重新启动音频。我可以通过更新来绕过它:

supportsHolding = false

但是我可以解决这个问题,例如WhatsApp可以正确执行此操作!

P.S。我正在使用webrtc打电话!

谢谢!

编辑:

这是提供商的代码:

public func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) {
    guard let call = conductor!.callWithUUID(uuid: action.callUUID) else {
        WebRtcConductor.debug("(self.TAG) 🔴 failed to perform HeldAction: uuid: (action.uuid), calluiid: (action.callUUID)")
        action.fail()
        return
    }
    setIsHeld(call: call, isHeld: action.isOnHold)
    action.fulfill()
}

setisheld函数只需:

audioTrack.isEnabled = enabled

如果我使用callkit屏幕的"静音"按钮,则一切都很好,但是如果我有2个活动电话,当我从webrtc呼叫到正常呼叫中刷新时,请调用cxsetheldCallaction,而音频轨道确实禁用了,如果我再次滑动到webrtc呼叫,启用了音轨,但我什么也没听到,如果我返回主应用屏幕,音频再次工作正常!

实际上,Google WebRTC库有一个限制,该库在实现支持交换调用的CallKit集成时会导致所描述的问题。

WEBRTC问题8126现在闻名一年多,但尚未集成到WEBRTC Master Branch中。但是,您可以找到必要的代码更改以在原始票证中解决此问题。

但是,作为一个工人,您可以触发由WEBRTC内部订阅的系统通知。

在Callkit提供商的" didActivate audioSession"方法中发布AVAudioSessionInterruptionType.ended通知:

var userInfo = Dictionary<AnyHashable, Any>()
let interrupttioEndedRaw = AVAudioSessionInterruptionType.ended.rawValue
userInfo[AVAudioSessionInterruptionTypeKey] = interrupttioEndedRaw
NotificationCenter.default.post(name: NSNotification.Name.AVAudioSessionInterruption, object: self, userInfo: userInfo)

ps:凝视着提高合并机会的机票; - )

也有相同的问题。如果我有1个主动电话,那么新呼叫即将到来,我可以接受&amp;接受。新呼叫有效,但是在CallKit中使用Swap之后,音频停止工作。

发现来自CXProviderDelegate协议的provider:performSetHeldCallAction:方法是您可以通过CallKit本机接口实际停用/激活Swap调用音频的位置。

在我的情况下,我使用了audioController.deactivateAudioSession()方法进行呼叫。但是发现,当通过CallKit点击Swap按钮时,也将相同的方法provider:performSetHeldCallAction:触发了其他呼叫。

因此,您只需要分别停用/激活音频以呼叫的状态(是否保持)。

以通用的方式看起来应该以这种方式:

func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) {
    // Retrieve the Call instance corresponding to the action's call UUID
    guard let call = callManager.callWithUUID(uuid: action.callUUID) else {
        action.fail()
        return
    }
    // Update the Call's underlying hold state.
    call.isOnHold = action.isOnHold
    // Stop or start audio in response to holding or unholding the call.
    if call.isOnHold {
        stopAudio()
    } else {
        startAudio()
    }
    // Signal to the system that the action has been successfully performed.
    action.fulfill()
}

P.S。看来您应该有一些班级来响应音频会话。它应该实现 activate audio session/deactivate audio session的种类。

相关内容

  • 没有找到相关文章

最新更新