在两个正在进行的通话中从应用内 UI 切换到 CallKit UI,其中一个处于保留状态

Switching from in-app UI to CallKit UI during two ongoing calls with one on hold

我正在开发一个 Voip 应用程序并集成了 CallKit。我知道 CallKit UI 不会在有 Voip 来电时显示,但问题是当有一个正在进行的 Voip 呼叫和同时 phone 呼叫(一个保持)时。您可以使用 Whatsapp 测试以下内容。

  1. 开始 Voip 通话
  2. 在通话过程中,有人使用非互联网 sim/phone 线路拨打 phone
  3. CallKit UI 出现,可以选择拒绝、结束或保持 voip 呼叫以接听来电 phone 呼叫
  4. Select 'hold and answer', callkit UI 显示两个呼叫,voip 呼叫保持
  5. 通过按交换按钮然后按应用程序图标(在 callkit UI 本身)或按转到主屏幕并单击应用程序图标来返回 Voip 应用程序
  6. Voip 应用程序显示,顶部有一个绿色条,上面写着 'Touch to return to call',我希望能够在用户点击它时返回到 CallKit UI 屏幕(与 whatsapp 相同)。

如果你在 whatsapp 上测试这个你就会明白我的意思,我想实现同样的行为。

我在这个 post 之后实现了顶部的绿色条:

但是我找不到以编程方式将 CallKit UI 带回前面的方法,post 中的答案没有显示如何。

这个 post 是相似的,但是没有答案,因为对于那种情况,没有其他呼叫处于保留状态,因此不需要将 CallKit 放在前面:

我发现我在 Whosebug 上获得的关于这个主题的信息已经过时了。对于 CallKit 上有多个调用的情况,即使您的应用程序处于前台,绿色条也会显示,因为您的应用程序正在显示状态栏!

以前它没有出现在我的应用程序中,因为我已将状态栏设置为隐藏在正在进行调用的特定页面上...因此解决方案是检测何时将调用设置为保持(通过 callkit 委托)并显示状态栏,并在其中一个通话结束且没有更多通话保持时隐藏状态栏。

当用户在您的应用程序中点击绿色栏时,它会按预期将用户带回 CallKit UI。

先声明变量

  • var callKitProvider: CXProvider!

  • var udid = UUID()

然后在结束调用的地方调用这个函数

callKitProvider.reportCall(with: udid, endedAt: Date(), reason: .remoteEnded)

请确保在“报告呼叫”和“来电”中使用相同的 udid