CallKit:在GSM呼叫断开后,恢复保持的VoIP呼叫



我遇到一个问题,在GSM呼叫被主叫断开后,我无法恢复保持的VoIP呼叫。

运行良好的场景一

  1. 我接听来电
  2. 我接到一个GSM电话,按"保持并接受",这将导致呼叫provider(_ provider: CXProvider, perform action: CXSetHeldCallAction),使我可以保持VoIP电话
  3. 我挂断了GSM呼叫,导致呼叫provider(_ provider: CXProvider, perform action: CXSetHeldCallAction),使我可以取消VoIP呼叫

场景二

  1. 我接听来电
  2. 我接到一个GSM电话,按"保持并接受",这会导致呼叫provider(_ provider: CXProvider, perform action: CXSetHeldCallAction),使我可以将VoIP电话挂起
  3. 主叫方挂断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中一个相当严重的错误。但我知道什么?

最新更新