You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一用户VoIP双向呼叫自动接听实现及CallKit报错Code=4排查

解决CallKit自动接听呼入呼叫时的Code=4错误

错误原因分析

com.apple.CallKit.error.requesttransaction Code=4对应CXErrorCodeRequestTransactionErrorUnknownCallUUID,意思是你传入的callInvite.uuid对应的呼叫未被CallKit系统识别。常见诱因:

  • 呼入呼叫未通过CXProvider的reportNewIncomingCall方法正确上报给CallKit
  • 未等呼出呼叫的结束事务完成,就直接发起接听请求,导致呼叫状态冲突

正确实现流程

必须严格按照「先关闭呼出,再接听呼入」的顺序执行,且要等待呼出结束的异步事务完成后,再发起接听请求,代码示例如下:

// 假设呼出呼叫的UUID为outgoingCallUUID
func handleSameUserCallConflict(outgoingCallUUID: UUID, incomingCallUUID: UUID) {
    // 第一步:关闭呼出呼叫
    let endOutgoingAction = CXEndCallAction(call: outgoingCallUUID)
    let endTransaction = CXTransaction(action: endOutgoingAction)
    
    self.callKitCallController.request(endTransaction) { [weak self] endError in
        guard let self = self else { return }
        
        if let endError = endError {
            debugPrint("关闭呼出呼叫失败:", endError.localizedDescription)
            return
        }
        
        // 呼出成功关闭后,第二步:接听呼入呼叫
        let answerCallAction = CXAnswerCallAction(call: incomingCallUUID)
        let answerTransaction = CXTransaction(action: answerCallAction)
        
        self.callKitCallController.request(answerTransaction) { answerError in
            if let answerError = answerError {
                debugPrint("接听VoIP呼叫失败:", answerError.localizedDescription)
            } else {
                debugPrint("成功接听呼入呼叫")
            }
        }
    }
}

关键注意事项

  • 确保呼入呼叫已上报:在收到VoIP推送后,必须通过CXProvider的reportNewIncomingCall(with:update:completion:)将呼入呼叫信息同步给CallKit,且completion回调不能返回错误,否则CallKit不会记录该呼叫的UUID。
  • 保持状态同步:你的VoIP业务SDK(如Twilio、Agora等)的呼叫状态要与CallKit的状态完全同步,避免出现SDK存在呼入但CallKit无记录的情况。
  • 避免重复操作:如果已处理过该呼入呼叫,不要重复发起接听请求,否则会触发未知UUID错误。

内容的提问来源于stack exchange,提问作者Zeyad.Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:15:28