ios - 已从 websocket 收到来电时如何处理 Voip Push?
问题描述
问题是从这里开始的,似乎还没有人给出正确的答案。
====================================
嗨,开发人员,
我正在开发一个包含音频通话功能的社交网络应用程序。我为这个音频通话集成了 SocketIO + WebRTC。我通过两种方式接收音频呼叫。套接字连接时的套接字调用和默认情况下的活动 VoIP 呼叫,无论套接字是否连接。
仅供参考,为什么如上所述我有两种接听电话的方式,
- 默认情况下启用 VoIP,因为有时套接字呼叫没有响应并且在那个时候从不显示呼叫。
- 当应用程序在前台时启用套接字,以确保在 VoIP 推送发生 MissingDeviceToken/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,我尝试从这个回答。
虽然它在某些情况下不起作用,例如当用户碰巧接听电话足够快时,推送的第二个来电将导致呼叫堆栈屏幕。
这种方法还会在最近通话列表中创建额外的通话,并在第一个传入事件的传入屏幕期间显示通话结束,这是糟糕的用户体验。
我还发现这个看起来很有希望,但很早就知道这会很好。
有没有人对此有任何解决方案?谢谢
解决方案
正如 Apple 工程师在技术支持请求中向我证实的那样,我的回答理论上是正确的。然而,在实践中,由于 PushKit 和 CallKit 的异步特性,如果没有不必要地报告调用或因未能报告调用而崩溃,基本上是不可能做到这一点的。因此,这是非常不鼓励的。
因此,对于问题 2,如果您无法接受这个答案,我能看到的唯一解决方案是让服务器为您处理。因此,服务器应该有一个正在进行的呼叫列表,并避免向已经参与呼叫的用户发送 VoIP 推送。
对于问题 1,您实现的解决方案并不真正可靠:您不能对异步环境中的事件顺序做任何假设。可以在套接字调用之前接收 VoIP 推送,在这种情况下,您无法报告新的来电,因为您只是报告了呼叫更新。或者,另一个更微妙的例子:您大致同时收到推送和套接字调用,您报告新的传入调用作为套接字调用的结果,但是(记住 CallKit 是异步的)当系统正在处理新的呼叫请求,您处理您的 VoIP 推送而不报告新的来电。
我相信处理这种情况的更简单的方法是使用一种且只有一种方法来处理新的来电,即通过 VoIP 推送。这样,您的应用程序应该可以在任何情况下工作,并且您不必为应用程序终止或已经运行时收到的调用实现两个不同的代码路径。
推荐阅读
- c# - Confluent.Kafka 中的事务在 Consumer
- nlp - 建议不完整句子中的单词列表的 NLP 模型
- angular - IONIC 4 InAppBrowser 隐藏,直到它完成加载
- python - Python 3,按顺序获取 IP 地址和 Ping 的文本文件
- jquery - 如何使用 jquery 或任何其他方法在前端实现产品的复选框选择
- c# - 如何修复错误 NETSDK1 project.assets.json 文件未找到。运行 NuGet 包还原以生成此文件
- angular - ExpressionChangedAfterItHasBeenCheckedError:表达式在使用 Float 检查后已更改
- android - Firebase 从片段中的数据库获取值
- python - 如何使用 IP 摄像头而不是 USB 网络摄像头检测/识别人脸
- php - 无法从控制器方法传递的 payumoney 成功响应中获取值