如何从自定义正在进行的通话 UI 结束 callkit 上的通话会话?

How do I end the call session on callkit from my custom ongoing call UI?

当用户结束来自 CallKit 的通话时 UI 应用程序会结束通话,实际的 VOIP 通话也会结束。但是当我从我的自定义 UI 结束通话时,VOIP 通话结束但 CallKit 仍处于活动状态。如何从我的自定义 UI 结束 CallKit 会话?

这是我在 CallKit 上按下结束通话时发生的情况 UI:

 func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
     XCPjsua.shared()?.endCall()
     action.fulfill()
 }

这是当我从自定义 UI 结束呼叫时发生的情况(我应该在此处关闭 CallKit 吗?):

- (void)endcall {
    [[XCPjsua sharedXCPjsua] endCall];
}

我设法使用 reportCall 函数关闭了它

 provider?.reportCall(with: appG.uuid, endedAt: Date(), reason: .remoteEnded)

因此,当我从我的自定义 UI

按下结束呼叫时,我就调用该函数

如果您想从您的自定义 UI 结束通话,您应该通过 CXTransaction:

let callController = CXCallController()

let endCallAction = CXEndCallAction(call: aUUID)
callController.request(
    CXTransaction(action: endCallAction),
    completion: { error in
        if let error = error {
            print("Error: \(error)")
        } else {
            print("Success")
        }
    })

这将导致 provider(_ provider: CXProvider, perform action: CXEndCallAction) 被调用。

在所有其他情况下(即远程结束、无人接听等... - 请参阅 CXCallEndedReason)您应该只报告结束的呼叫:

let provider: CXProvider

provider.reportCall(with: call.uuid, endedAt: Date(), reason: .remoteEnded)

在这种情况下provider(_ provider: CXProvider, perform action: CXEndCallAction)将不会被调用。

我使用此代码关闭通话

provider?.reportCall(with: PushUtility.shared.uuid!, endedAt: Date(), reason: .remoteEnded)

首先保存您用于连接呼叫的 uuid,使用该 uuid 结束呼叫。