如何在没有呼叫者UUID的情况下从自定义UI结束CallKit呼叫?

时间:2020-11-04 15:25:43

标签: ios swift callkit

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

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事务请求失败:无法执行该操作 完成。

1 个答案:

答案 0 :(得分:1)

uuid值是您提供的值。

您在这里提供它:

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

因为您只是分配一个新的UUID并将其直接传递到reportNewIncomingCall中,所以以后不需要它时就不知道uuid。

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

相关问题