问题从这里开始,似乎还没有人给出正确的答案。
====
==================================嗨,开发人员,
我正在开发一个社交网络应用程序,其中包括音频通话功能。我与SocketIO + WebRTC集成了这个音频通话。我通过两种方式接收音频呼叫。 套接字连接和活动时的套接字调用 默认情况下,无论套接字是否连接,VoIP呼叫。
仅供参考,为什么我有两种接听电话的方式,如上所述,
- 默认情况下启用 VoIP,因为有时套接字呼叫无响应,并且从不显示呼叫。
- 当应用程序处于前台时启用套接字,以确保在VoIP推送发生Missing DeviceToken/BadDeviceToken错误时收到呼叫。
考虑到iOS 13的VoIP使用指南,我遵循以下步骤进行集成。
当应用程序被杀死或套接字未连接时,将获得VoIP呼叫并使用provider.reportNewIncomingCall()进行响应。所以这里没有VoIP使用的问题。
当套接字连接时,将同时获得套接字呼叫和VoIP呼叫。但是在获得VoIP呼叫之前,套接字呼叫会立即获得。所以这是我所做的:
- 已响应带有
provider.reportNewIncomingCall()
的套接字呼叫。 - 稍有延迟后,将获得VoIP推送已经由套接字调用的同一呼叫。 在这里,我应该用CallKit回应这个VoIP推送。但我已经调用了这个电话。所以,我用下面的代码来处理。
- 已响应带有
provider.reportCall(with: call.uuid, updated: update)
具有用于套接字调用启动的相同uuid和更新。 希望,这个VoIP呼叫也响应了CallKit,并且VoIP阻止/应用程序终止没有问题。
问题1:这是处理上述问题的正确方法吗?
===
================================================================================================================================================================================================================================================================================================================================ 根据我的应用要求,我的应用一次应该有一个活动调用。
考虑一下,我正在活动呼叫中,并且通过VoIP又收到了一个来电。 所以在这里,我不想显示额外的调用。所以我忽略了额外呼叫的VoIP推送。但它导致了这种崩溃"杀死应用程序,因为它在收到PushKit VoIP推送回调后从未向系统发布来电。
问题2:如何处理上述情况?
===
================================================================================================================================================================================================================================================================================================================================我尝试什么
对于问题 2,我尝试从这个问题中回答。
虽然在某些情况下它不起作用,例如当用户碰巧足够快地应答呼叫时,来自推送的第二个传入呼叫将导致呼叫堆叠屏幕。
这种方法还会在最近的呼叫列表中创建额外的呼叫,并在第一个传入事件的传入屏幕期间显示呼叫结束的栏传入呼叫,这是糟糕的用户体验。
我也发现这个看起来很有前途,但非常知道这会很好。
有人对此有任何解决方案吗? 谢谢
正如一位苹果工程师在技术支持请求中确认的那样,我的答案理论上是正确的。但是,在实践中,由于 PushKit 和 CallKit 的异步性质,基本上不可能在不不必要地报告调用或因无法报告调用而崩溃的情况下做到这一点。因此,非常不鼓励这样做。
因此,对于问题 2,如果对您来说这个答案是不可接受的,我能看到的唯一解决方案是让服务器为您处理它。因此,服务器应该有一个正在进行的呼叫列表,并避免向已经参与呼叫的用户发送VoIP推送。
对于问题 1,您实现的解决方案并不真正可靠:您不能对异步环境中的事件顺序进行任何假设。可以在套接字呼叫之前接收VoIP推送,在这种情况下,您无法报告新的传入呼叫,因为您只是报告呼叫更新。或者,另一个更微妙的例子:您大致同时收到推送和套接字呼叫,您报告新的传入呼叫作为套接字呼叫的结果,但是(请记住,CallKit 是异步的)当系统处理新的呼叫请求时,您处理您的 VoIP 推送而不报告新的传入呼叫。
我相信处理这种情况的更简单方法是只有一种方法来处理新的传入呼叫,即通过VoIP推送。这样,你的应用应该在任何情况下都能工作,并且你不必为应用终止或已在运行时收到的调用实现两个不同的代码路径。