CallKit结束通话时报错Code=4问题排查求助
解决CallKit请求事务错误(Code=4)
com.apple.CallKit.error.requesttransaction Code=4 对应未授权或状态不匹配的操作错误,结合你的代码,核心问题出在操作顺序和状态同步逻辑上,以下是具体修复方案:
修复步骤:
调整操作顺序
你当前先提交CXEndCallAction事务,再上报通话结束状态,这会导致CallKit内部状态冲突。正确流程是先同步通话结束状态,再提交结束动作:// 1. 先告知CallKit通话已远程结束 self.provider.reportCall(with: uuid_var.uuid_test, endedAt: Date(), reason: .remoteEnded) // 2. 再提交结束通话的事务请求 let endCallAction = CXEndCallAction(call: uuid_var.uuid_test) let transaction = CXTransaction() transaction.addAction(endCallAction) self.controller.request(transaction) { error in print(error ?? "事务请求成功") }区分通话场景处理
- 如果是未接听的来电被远程挂断:无需提交
CXEndCallAction事务,仅调用reportCall(with:endedAt:reason:)即可,因为未接听的通话不需要执行"结束动作"。 - 如果是已接听的通话被远程挂断:按上述调整后的顺序执行即可。
- 如果是未接听的来电被远程挂断:无需提交
验证CallKit状态一致性
确保在执行结束操作时,该UUID对应的通话在CallKit中处于active或held状态,若通话未被接听(处于incoming状态),提交CXEndCallAction会触发权限错误。检查基础配置
确认App已开启VoIP后台模式,Info.plist中添加了NSVoIPUsageDescription权限描述,且CXCallController是在主线程初始化的。
内容的提问来源于stack exchange,提问作者MRError
相关产品推荐
相关产品推荐

