首页 > 解决方案 > 当应用程序处于前台/后台/终止状态 iOS 13 时如何断开视频/语音通话。与 WhatsApp 应用程序相同

问题描述

当应用程序处于前台/后台/终止状态时,我具有断开视频/语音呼叫的功能。与 WhatsApp 应用程序中的语音通话相同

我使用 Callkit 显示默认传入 CallKit 屏幕将使用 VOIP 推送触发。

设想:

  1. 设备 A 呼叫设备 B
  2. 设备A挂断电话
  3. 设备 B 将在前台而不是在后台断开连接并终止状态,因为DidReceiveRemoteNotification委托方法将仅在前台而不是在其他状态下触发

尝试使用静默推送通知Content-Available = 1并在发送推送有效负载时删除 Alert 键中的值。仍然在背景和杀戮状态下不起作用

现在的问题是我们如何在所有状态下触发 DidReceiveRemoteNotification 或者我们是否有任何其他概念来实现此功能。

请提出您宝贵的建议,如果您需要更多信息,请告诉我。

标签: iosapple-push-notificationsios13whatsappcallkit

解决方案


重要的是要理解 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 库,这将为您完成大部分工作。


推荐阅读