ios - 当应用程序处于前台/后台/终止状态 iOS 13 时如何断开视频/语音通话。与 WhatsApp 应用程序相同
问题描述
当应用程序处于前台/后台/终止状态时,我具有断开视频/语音呼叫的功能。与 WhatsApp 应用程序中的语音通话相同
我使用 Callkit 显示默认传入 CallKit 屏幕将使用 VOIP 推送触发。
设想:
- 设备 A 呼叫设备 B
- 设备A挂断电话
- 设备 B 将在前台而不是在后台断开连接并终止状态,因为DidReceiveRemoteNotification委托方法将仅在前台而不是在其他状态下触发
尝试使用静默推送通知Content-Available = 1并在发送推送有效负载时删除 Alert 键中的值。仍然在背景和杀戮状态下不起作用
现在的问题是我们如何在所有状态下触发 DidReceiveRemoteNotification 或者我们是否有任何其他概念来实现此功能。
请提出您宝贵的建议,如果您需要更多信息,请告诉我。
解决方案
重要的是要理解 CallKit 本身并不处理呼叫连接,也不是所有可能的呼叫状态,即使它涉及呼叫发起和终止的整个过程。因此,您经常使用某种形式的 SIP 实现。
无论如何,您必须有一些呼叫连接和音频/视频流的实现。
iOS 和 CallKit 无法为您开箱即用地做到这一点。
当您的应用程序通过推送通知收到来电通知时,您的应用程序会通过 SIP 或类似方式收到远程方挂断的通知。但不应通过推送通知通知呼叫终止。使用推送通知并没有那么大的意义,因为无论如何你已经有一个正在进行的呼叫连接。然后,这种正在进行的连接通常用于发出本地或远程方正在挂机的信号,这无论如何都是 SIP 的一个特性。
在开始时使用推送通知来通知来电通知而不是持续 SIP 连接的原因是它可以节省电池寿命,而没有这样的好处会导致也使用推送通知来发出呼叫终止的信号。因此,最好不要尝试使用推送通知来表示呼叫终止,而是使用SIP 的 BYE 消息。
然后,您的 SIP 处理代码应通过 CallKit 通知 iOS,通过报告呼叫结束reportCall(with UUID: UUID, endedAt dateEnded: Date?, reason endedReason: CXCallEndedReason)
并自行处理实际呼叫断开连接。
因此,由于 iOS/CallKit 不能也不会处理您的呼叫连接/断开,因此您必须始终自己执行此操作或使用 PJSIP 之类的 SIP 库,这将为您完成大部分工作。
推荐阅读
- javascript - 如何隐藏样式属性?
- javascript - Javascript 填充表
- python - Python pandas 排名/排序基于对每个输入不同的两列列的分组
- c - 为什么 Valgrind 抱怨这段代码?
- python - 无法导入名称 balance_accuracy_score
- amazon-web-services - S3 数据湖中数据的增量更新
- python - 使用正则表达式进行标记的算法复杂度是多少?
- helix-3d-toolkit - ViewPoint Control 的行为不符合预期 [helix-3d-toolkit]
- c++ - 在运行时在代码中调整大小时如何避免dockwidget与主窗口中的其他对象重叠?
- javascript - 如何虚拟更改谷歌分析中的综合浏览量?