我遇到一个问题,在GSM呼叫被主叫断开后,我无法恢复保持的VoIP呼叫。
运行良好的场景一:
- 我接听来电
- 我接到一个GSM电话,按"保持并接受",这将导致呼叫
provider(_ provider: CXProvider, perform action: CXSetHeldCallAction)
,使我可以保持VoIP电话 - 我挂断了GSM呼叫,导致呼叫
provider(_ provider: CXProvider, perform action: CXSetHeldCallAction)
,使我可以取消VoIP呼叫
场景二:
- 我接听来电
- 我接到一个GSM电话,按"保持并接受",这会导致呼叫
provider(_ provider: CXProvider, perform action: CXSetHeldCallAction)
,使我可以将VoIP电话挂起 - 主叫方挂断GSM呼叫,但未呼叫
provider(_ provider: CXProvider, perform action: CXSetHeldCallAction)
在场景2中,主叫方挂断GSM呼叫后,仅调用provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession)
。
如果未呼叫provider(_ provider: CXProvider, perform action: CXSetHeldCallAction)
,在GSM被主叫断开后,我们如何恢复VoIP呼叫?
public func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction)
{
print("Callkit: provider(_ provider: CXProvider, perform action: CXSetHeldCallAction): (action.callUUID)")
guard var call = callManager.call(withUUID: action.callUUID) else {
action.fail()
return
}
call.isOnHold = action.isOnHold
call.isMuted = call.isOnHold
audioRouter.audioDevice.isEnabled = !call.isOnHold
action.fulfill()
}
GSM呼叫结束后,返回应用程序时将调用applicationDidBecomeActive
。在这一点上,我们可以检测一个呼叫是否被搁置并继续。欢迎其他解决方案。
我今天遇到了这个问题。在谷歌上搜索了一番之后,我找不到解决方案。我想,这太奇怪了,没有人能解决这个问题。受@Simon的启发,我找到了一个解决方案,但我觉得有点干净。
在您的CallViewController、AppDelegate或类似程序中,将自己设置为CXCallObserver的委托。
CXCallController.shared.callObserver.setDelegate(self, queue: .main)
然后,你想检测是否正好有一个活动呼叫,它是";你的";(不管这对你意味着什么。对我来说,它存储在self.call.id
中(,并且它被搁置。如果是,您可以请求更新";解开";它,以及您在其他地方处理func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction)
的代码将被调用,希望您的应用程序能够正确处理它。
//MARK: - CXCallObserverDelegate
func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
guard let activeCall = callObserver.calls.first,
1 == callObserver.calls.count,
activeCall.uuid == self.call.id,
true == activeCall.isOnHold else {
return
}
let transaction = CXTransaction(action: CXSetHeldCallAction(call: activeCall.uuid, onHold: false))
CXCallController.shared.request(transaction) { error in
if let error = error {
//handle it?
}
}
}
当你接到来自WhatsApp的来电,并且你的应用程序被挂起时,CXCallObserver.shared.calls
会回两个电话。一个将是";你的";而另一个将是"暂停";WhatsApp呼叫";没有被搁置。一旦WhatsApp呼叫在另一端终止,CXCallObserver.shared.calls
将只返回一个呼叫,即您的呼叫,但它仍将保持不变。这似乎是CallKit中一个相当严重的错误。但我知道什么?