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

Posted

技术标签:

【中文标题】如何在没有调用者 UUID 的情况下从自定义 UI 结束 CallKit 调用?【英文标题】:How to end a CallKit call from custom UI without having caller UUID? 【发布时间】:2020-11-04 15:25:43 【问题描述】:

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

【问题讨论】:

【参考方案1】:

uuid 值是您提供的值。

您在此处提供:

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

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

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

【讨论】:

所以你的意思是当我用 UUID 报告一个新的来电时,我需要优先存储相同的 UUID,并且可以在 endCall 时使用相同的 UUID 对吗? 没错。 uuid 是您提供给 callkit 的东西,以便您以后可以识别调用

以上是关于如何在没有调用者 UUID 的情况下从自定义 UI 结束 CallKit 调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不点击的情况下从 Chrome 自定义标签中捕获 URL?

使用 CloudKit + CoreData,如何在没有 SwiftUI 的 @FetchRequest 的情况下从远程云更新中更新 UI?

将数据从自定义 UI 单元传递到视图控制器

在 perl 中如何在不使用 XS 的情况下写入调用者的变量?

GNU gcc/ld - 使用在同一个目标文件中定义的调用者和被调用者包装对符号的调用

如何在没有 IBOutlet 或标识符的情况下从 Storyboard 更新约束?