当已经从 websocket 收到来电时如何处理 Voip Push?

How to handle Voip Push when received incoming call already from websocket?

问题来自 here,似乎还没有人给出正确答案。

==================================

嗨开发者,

我正在开发一个包含音频通话功能的社交网络应用程序。我为这次音频通话集成了 SocketIO + WebRTC。我通过两种方式接听音频电话。 套接字连接并处于活动状态时调用套接字 VoIP 呼叫默认与连接或未连接的套接字无关。

仅供参考,为什么我有上述两种接听电话的方式,

考虑到 iOS 13 条 VoIP 使用指南,我按照以下步骤进行集成。

  1. 当应用程序被终止或套接字未连接时,将收到 VoIP 呼叫并响应 provider.reportNewIncomingCall()。所以在这里使用 VoIP 没有问题。

  2. 当套接字连接时,将同时获得套接字呼叫和V​​oIP 呼叫。但是套接字呼叫将在获得 VoIP 呼叫之前立即获得。所以这就是我所做的:

    1. 响应套接字调用 provider.reportNewIncomingCall()
    2. 稍微延迟后,将为已由套接字调用的同一呼叫推送 VoIP。在这里,我应该用 CallKit 响应这个 VoIP 推送。但我已经调用了调用。所以,我用下面的代码来处理。

provider.reportCall(with: call.uuid, updated: update) 具有用于套接字调用启动的相同 uuid 和更新。 希望这个 VoIP 呼叫也用 CallKit 响应并且 VoIP blocking/app 终止没有问题。

问题 1:这是处理上述问题的正确方法吗?

============================================= ================================================ ============

根据我的应用要求,我的应用一次应该有一个活动呼叫。

请注意,我正在通话中,并且通过 VoIP 收到了另一个来电。所以在这里,我不想显示额外的调用。所以我忽略了额外呼叫的 VoIP 推送。但这会导致崩溃“杀死应用程序,因为它在收到 PushKit VoIP 推送回调后从未向系统发布传入呼叫。”

问题2:如何处理上述场景?

============================================= ================================================ ============

我的尝试

对于问题 2,我尝试回答

虽然在某些情况下它不起作用,例如当用户碰巧接听电话足够快时,推送的第二个来电将导致呼叫堆叠屏幕。

这种方法还会在最近的通话列表中创建额外的通话,并在第一个传入事件的传入屏幕期间显示呼叫已结束的栏来电,这是糟糕的用户体验。

我也发现 看起来很有前途,但它很清楚这会很好。

有人对此有任何解决方案吗? 谢谢

正如 Apple 工程师在技术支持请求中确认的那样,我的 理论上是正确的。然而,在实践中,由于 PushKit 和 CallKit 的异步特性,如果不报告不必要的呼叫或因未能报告呼叫而崩溃,基本上不可能做到这一点。所以,非常不鼓励。

因此,对于问题2,如果对你来说是不行的,我能想到的唯一解决办法就是让服务器帮你处理。因此,服务器应该有一个正在进行的呼叫列表,并避免向已经参与呼叫的用户发送 VoIP 推送。

对于问题 1,您实施的解决方案并不十分可靠:您无法对异步环境中的事件顺序进行任何假设。有可能在套接字呼叫之前接收到 VoIP 推送,在这种情况下,您无法报告新的来电,因为您只是报告呼叫更新。或者,另一个更微妙的例子:你大致同时收到推送和套接字调用,你报告新的传入调用作为套接字调用的结果,但是(记住 CallKit 是异步的)当系统正在处理新的呼叫请求,您处理 VoIP 推送而不报告新来电。

我相信处理这种情况的更简单方法是使用一种且唯一的方法来处理新来电,即通过 VoIP 推送。这样,您的应用程序应该在任何情况下都能正常工作,并且您不必为应用程序终止时或已经 运行.

时收到的调用实现两个不同的代码路径。