如何在没有调用者 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?
在 perl 中如何在不使用 XS 的情况下写入调用者的变量?