如何从我的自定义通话界面结束 CallKit 上的通话会话?

3

当用户从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];
}
3个回答

11

如果您想从自定义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) 不会被调用。


你的意思是如果我正在调用(应该已经调用了)CXStartCallAction,那么我只能使用CXTransaction吗? - Elsammak
1
@Elsammak 我的意思是,如果用户想要结束通话(例如通过结束通话按钮),无论他是否开始通话,您都应该使用 CXTransaction。在所有其他情况下,即通话结束不取决于用户操作的原因,您只需向 CXProvider 报告通话结束即可。 - Marco
1
谢谢,我已经遇到这个问题两天了。总是出现错误4,这意味着没有这样的呼叫UUID,尽管它存在。只调用reportCall就像魅力一样运作。 - Elsammak

2

我使用这段代码来结束调用

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

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


1
我使用reportCall函数成功关闭了它。
 provider?.reportCall(with: appG.uuid, endedAt: Date(), reason: .remoteEnded)

所以当我从自定义UI按下结束通话时,我只需调用该函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接