如何在没有调用者 UUID 的情况下结束来自自定义 UI 的 CallKit 调用?

How to end a CallKit call from custom UI without having caller UUID?

我在 iOS Swift 5 中开发视频通话应用程序,其中通话只能从后端 Web 应用程序发起,而移动应用程序只能接听这些电话。意味着没有移动-移动通信,网络应用程序和移动应用程序之间的通信。在我的应用程序中,我使用 PushKit 和 CallKit 来通知后台或终止状态的来电。因此,在后台或已终止状态下,如果我接到来电,它将使用 CallKit 显示呼叫屏幕,如果我按下“接听”按钮,它将导航到我自己的自定义视频呼叫屏幕,其中我有结束按钮用于关闭呼叫。但是当我按下结束按钮时,VoIP 通话断开了。但是 CallKit 调用并没有被取消(仍然在主屏幕顶部显示绿色条)。我检查了如何通过代码结束 CallKit 调用,但在大多数解决方案中,CallKit 使用 callUUID 被取消。但我不知道我将从哪里获得该 UUID。在一些代码中,我看到 UUID 是从推送有效负载接收到的,但在我的例子中,调用是从 Web 应用程序发起的,所以我没有收到调用者 UUID。请帮我。 这是我的代码,

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
     print(payload.dictionaryPayload)
     let state = UIApplication.shared.applicationState
     if state == .background || state == .inactive {
        let update = CXCallUpdate()
        update.remoteHandle = CXHandle(type: .generic, value: callerName)
        update.hasVideo = true
        provider.reportNewIncomingCall(with: UUID(), update: update, completion: { error in      })
     } else if state == .active {
        // no need for calling screen
     }
  }

我用下面的代码来结束通话,但没有用。

func endCall(call: UUID) {
    let callController = CXCallController()
    let endCallAction = CXEndCallAction(call: call)
    let transaction = CXTransaction(action: endCallAction)
    callController.request(transaction) { error in
        if let error = error {
            print("EndCallAction transaction request failed: \(error.localizedDescription).")
            self.provider.reportCall(with: call, endedAt: Date(), reason: .remoteEnded)
            return
        }

        print("EndCallAction transaction request successful")

 }

这里我将呼叫作为当前 UUID 传递,然后我收到错误响应

EndCallAction transaction request failed: The operation couldn’t be completed.

uuid 值是您提供的值。

您在这里提供:

provider.reportNewIncomingCall(with: UUID(),...

因为您只是简单地分配一个新的 UUID 并直接在 reportNewIncomingCall 中传递它,您以后需要它时不知道该 uuid。

您需要将此 uuid 存储在 属性 中,以便您可以将其提供给 endCall 函数。