如何在没有调用者 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
函数。
我在 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
函数。