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

Cod*_*_98 1 xcode ios swift callkit swift4.2

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

当我在CallKit UI上按结束呼叫时,会发生以下情况:

 func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
     XCPjsua.shared()?.endCall()
     action.fulfill()
 }
Run Code Online (Sandbox Code Playgroud)

当我从自定义UI结束通话时会发生这种情况(我应该在这里关闭CallKit吗?):

- (void)endcall {
    [[XCPjsua sharedXCPjsua] endCall];
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*rco 5

如果您想通过自定义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")
        }
    })
Run Code Online (Sandbox Code Playgroud)

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

在所有其他情况下(例如,远程结束,未应答等...-参见CXCallEndedReason),您应该仅报告结束的呼叫:

let provider: CXProvider

provider.reportCall(with: call.uuid, endedAt: Date(), reason: .remoteEnded)
Run Code Online (Sandbox Code Playgroud)

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