我在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事务请求失败:无法执行该操作 完成。
答案 0 :(得分:1)
uuid值是您提供的值。
您在这里提供它:
provider.reportNewIncomingCall(with: UUID(),...
因为您只是分配一个新的UUID并将其直接传递到reportNewIncomingCall
中,所以以后不需要它时就不知道uuid。
您需要将此uuid存储在属性中,以便可以将其提供给endCall
函数。