ios - CallKit 可以在交换通话后重新激活声音

标签 ios webrtc callkit

我正在开发 CallKit 应用程序,我遇到一个问题,在 CallKit 屏幕上“交换”调用时,调用保持无法重新启动音频,直到用户返回到应用内调用屏幕。我可以通过更新来绕过这个:

supportsHolding = false

但是我可以解决这个问题,例如whatsapp可以正确地做到这一点!

附:我正在使用 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 Issue 8126已知已有一年多了,但尚未集成到 WebRTC 主分支中。但是,您可以在原始票证中找到解决此问题所需的代码更改。

但是,作为解决方法,您可以触发 WebRTC 内部订阅的系统通知。

在 CallKit 提供程序的“didActivate audioSession”方法中发布 AVAudioSessionInterruptionType.ished 通知:

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:盯着票以提高合并的机会;-)

关于ios - CallKit 可以在交换通话后重新激活声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47416493/

相关文章:

ios - 处理来自锁定屏幕的来电时,iOS VoIP CallKit 应用程序出现问题

ios - 使用附加参数初始化隐式解包选项?

javascript - 替代 getUserMedia() 在 iOS 上读取实时摄像头流?

ios - WebRTC SDK iOS RTCIceCandidatePairStats

java - nativeAddLocalStream 中的 Android WebRTC SIGSEGV

ios - 使用 CallKit 显示用于拨出 VoIP 调用的 iOS native 调用 UI

android - 如何使用 React Native 在 Android 上实现 CallKit 相似行为?

ios - Facebook 登录设置失败

Libsndfile库可以在iPhone iOS上使用吗?

ios - 区分导致 View Controller 被推送的用户操作