我正在开发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
的种类。