简介
音视频通话功能通过
CallStore 实现用户之间的实时音视频互动。CallStore 提供了一套全面的 API 来管理整个通话生命周期。 在接入 CallStore 时,请务必了解以下运行时特性:异常处理(Error Handling):主动调用 API(如
calls)时,若因参数校验或状态冲突等导致调用本身失败,通常会以异步抛出错误事件或返回错误码的形式通知。网络或远端异常也会通过 onCallEnded 携带错误原因下发。线程模型与释放:所有的状态更新(
CallState)和事件回调(CallEvent / CallEventListener)通常保证在主线程(Main Thread)触发,可直接用于刷新 UI。全局单例模式下,请务必在组件销毁时(如 deinit / onDestroy)反注册监听器,避免内存泄漏。重要:
请在 SDK 初始化成功后,通过 shared 单例获取
CallStore 实例,不要尝试直接初始化,否则将无法接收通话状态更新。说明:
通话状态更新通过 state 发布者传递。订阅它以接收通话数据的实时更新。
警告:
请确保在通话结束后正确处理 UI 状态,避免出现界面异常。
功能特性
发起音视频通话:支持向单个或多个用户发起音频通话或视频通话,可配置超时时间、自定义数据等参数。
接听/拒绝音视频通话:收到来电邀请时,可选择接听或拒绝。
挂断音视频通话:结束当前正在进行的音视频通话。
群组通话管理:支持加入已存在的群组通话,或在通话中邀请其他用户加入。
通话记录管理:查询最近的通话记录(支持分页),删除指定的通话记录。
事件驱动架构:提供通话开始、收到邀请、通话结束等事件监听。
状态订阅:实时订阅当前通话状态,包括参与者列表、音量信息、网络质量等。
可订阅数据
CallState 的字段描述如下:
属性名 | 类型 | 描述 |
activeCall | 当前活跃的通话信息。
【生命周期约定】:在触发 onCallEnded 时,该对象不会被立即置空,而是保留通话终态供 UI 展示结束动画(此时 CallInfo.result 或其它参数反映结束原因)。若业务重新发起或接到新通话,会自动覆盖。开发者可通过重置 CallStore 相关状态进行手动清理。 | |
recentCalls | 最近通话记录列表。 注意: 每次调用 queryRecentCalls 后,该状态当前表现为覆盖更新,而不是自动追加(Append)。如需实现无限滚动效果,业务层需自行将新到达的数据拼接到原有列表中。 | |
cursor | String | 分页游标,用于查询更多通话记录。 |
selfInfo | 当前用户自身信息。 | |
allParticipants | 当前通话所有参与者列表。 | |
speakerVolumes | [String: Int] | 参与者音量信息,key 为用户 ID,value 为音量值。 |
networkQualities | [String: NetworkQuality] | 参与者网络质量信息,key 为用户 ID,value 为网络质量。 |
API 列表
函数名 | 描述 |
获取 CallStore 单例实例。 | |
通话事件发布者。 | |
发起通话。 | |
接听通话。 | |
拒绝通话。 | |
挂断通话。 | |
加入群组通话。 | |
邀请用户加入通话。 | |
查询最近通话记录。 | |
删除通话记录。 |
获取实例
shared
获取 CallStore 单例实例。
观察状态和事件
callEventPublisher
通话事件发布者。
通话操作
calls
向指定用户发起音频或视频通话,支持单人通话和多人通话。
calls(participantIds: string[],mediaType: CallMediaType,params: CallParams | undefined,): Promise<void> {return this.impl.calls(participantIds, mediaType, params)}
版本信息
从3.5版本开始支持。
参数说明
参数名 | 类型 | 描述 |
participantIds | [String] | 被呼叫者 ID 列表,支持单人或多人。 |
mediaType | 通话媒体类型(音频/视频)。 | |
params | 通话参数配置。 |
accept
接听通话。收到来电邀请时调用此方法接听通话。
accept(): Promise<void> {return this.impl.accept()}
版本信息
从3.5版本开始支持。
reject
拒绝通话。收到来电邀请时调用此方法拒绝通话。
reject(): Promise<void> {return this.impl.reject()}
版本信息
从3.5版本开始支持。
hangup
挂断并结束当前正在进行的通话。
hangup(): Promise<void> {return this.impl.hangup()}
版本信息
从3.5版本开始支持。
join
使用特定的 Call ID 加入一个正在进行中的群组通话。
join(callId: string): Promise<void> {return this.impl.join(callId)}
版本信息
从3.5版本开始支持。
参数说明
参数名 | 类型 | 描述 |
callId | String | 要加入的通话 ID。 |
invite
在通话进行中邀请其他用户加入。
invite(participantIds: string[],params: CallParams | undefined,): Promise<void> {return this.impl.invite(participantIds, params)}
版本信息
从3.5版本开始支持。
参数说明
参数名 | 类型 | 描述 |
participantIds | [String] | 被邀请者 ID 列表。 |
params | 通话参数配置。 |
通话记录
queryRecentCalls
查询最近的通话记录。
【当前限制】:目前查询结果每次都会覆盖(重置)
state.recentCalls 列表,而不是自动追加。queryRecentCalls(cursor: string, count: number): Promise<void> {return this.impl.queryRecentCalls(cursor, count)}
版本信息
从3.5版本开始支持。
参数说明
参数名 | 类型 | 描述 |
cursor | String | 分页游标,首次查询时传空字符串。 |
count | UInt | 查询数量。 |
deleteRecentCalls
删除指定的通话记录。
deleteRecentCalls(callIdList: string[]): Promise<void> {return this.impl.deleteRecentCalls(callIdList)}
版本信息
从3.5版本开始支持。
参数说明
参数名 | 类型 | 描述 |
callIdList | [String] | 要删除的通话 ID 列表。 |
数据结构
CallMediaType
通话媒体类型,用于指定发起音频通话还是视频通话。
枚举值 | 值 | 说明 |
audio | 1 | 音频通话。 |
video | 2 | 视频通话。 |
CallEndReason
通话结束原因,用于标识音视频通话是如何结束的(正常挂断、拒绝、超时等)。
枚举值 | 值 | 说明 |
unknown | 0 | 未知原因。 |
hangup | 1 | 正常挂断。 |
reject | 2 | 拒绝接听。 |
noResponse | 3 | 无响应。 |
offline | 4 | 对方离线。 |
lineBusy | 5 | 对方忙线。 |
canceled | 6 | 通话被取消。 |
otherDeviceAccepted | 7 | 其他设备已接听。 |
otherDeviceReject | 8 | 其他设备已拒绝。 |
endByServer | 9 | 后台结束通话。 |
CallDirection
通话方向,用于标识通话是呼入、呼出还是未接来电。
枚举值 | 值 | 说明 |
unknown | 0 | 未知。 |
missed | 1 | 未接来电。 |
incoming | 2 | 呼入。 |
outgoing | 3 | 呼出。 |
CallParticipantStatus
通话参与者状态,用于标识参与者当前是等待中还是已接听。
枚举值 | 值 | 说明 |
none | 0 | 无状态(未在通话中)。 |
waiting | 1 | 等待中(呼叫中/被呼叫中)。 |
accept | 2 | 已接听。 |
CloudRecordPolicy
音视频通话的云端录制策略,用于配置某次通话是否开启云端录制。
枚举值 | 值 | 说明 |
followConsoleConfig | 0 | 跟随控制台的全局配置(默认)。 |
enable | 1 | 开启云端录制,覆盖控制台配置。 |
disable | 2 | 关闭云端录制,覆盖控制台配置。 |
CallEventListener
通话事件,用于接收通话过程中的各种事件通知。
方法
方法名 | 说明 |
onCallStarted | 通话事件开始启动的回调。
时机说明:它表示“当前已经成功进入通话流程(如发起了 calls 并被内部接受)”,但并不表示音视频房间已经接通或建立。建议仅用于做最初始的界面跳转(主叫侧)。 |
onCallReceived | 收到新通话邀请的回调。
字段建议:事件参数仅透传 callId、mediaType 和 userData。如果需要读取邀请人、房间 ID 或绑定的群组 ID 等全量信息,请在收到该事件后通过 state.activeCall 读取。 |
onCallEnded | 通话统一结束事件回调。
场景说明:无论是接通后挂断、未接听超时、被远端取消,还是其他设备已接听,都会最终触发此事件。开发者必须通过参数中的 reason 来判断具体的原因以展示对应的 UI 文案或进行分支处理。
获取通话时长:该事件的参数中不包含通话时长字段。如需获取通话时长,请在收到此回调时通过 state.activeCall.duration 读取,单位为秒。通话接通后 SDK 内部会每秒递增该值;通话结束时 activeCall 不会被立即置空,因此可在本回调中安全读取。 |
onSuggestSwitchToCellular | 当系统检测到 WiFi 质量较差并建议切换到蜂窝网络时触发的回调。 |
CallParams
通话参数配置,用于发起音视频通话时设置房间 ID、超时时间、自定义数据等参数。
属性 | 类型 | 说明 |
roomId | String | TRTC 房间 ID(CallStore 的媒体流管理使用了腾讯云 TRTC 服务)。可选参数。
不传时由服务端自动生成;如果业务需要指定或复用 TRTC 房间,可传入指定的字符串。 |
timeout | Int | 振铃超时时间(秒)。可选参数。
仅控制从发起呼叫( calls)到接听的未接听超时阶段。对已接通后的通话或 invite 操作不生效。
设为0时,将使用服务端默认值(30s)。 |
userData | String | 呼叫时附带的自定义透传数据。可选参数。
该数据主要通过被叫端的 onCallReceived 事件暴露给业务侧读取。注意: 它不会进入长期的 CallInfo 状态,也不会被持久化到通话记录中。建议传入简短的 JSON 字符串。 |
chatGroupId | String | 腾讯云 IM 的群组 ID。可选参数。
仅在“群聊发起的通话”场景下需要传入,传入后系统会将信令路由并把该通话关联至此群组的通话记录,用于在该群聊中发送通话开始/结束等状态消息,以及在通话过程中邀请群成员加入。
一对一通话、或非固定群组的临时多人通话,请务必留空。 注意: 该字段在首次 calls 时生效,后续 invite 传参无法更改此通话绑定的群组。 |
isEphemeralCall | Bool | 无痕通话。可选参数。
设为 true 时,本次通话结束后不再产生通话消息,常见场景:1v1聊天中发起通话,不希望显示通话消息。 |
cloudRecordPolicy | 本次通话的云端录制策略。生效前提是已经在控制台开通相关能力。 followConsoleConfig(默认):跟随控制台的全局配置。 enable:强制开启云端录制,覆盖控制台的全局配置。 disable:强制关闭云端录制,覆盖控制台的全局配置。 | |
offlinePushTitle | string | 离线推送通知标题。
非空时覆盖默认标题(登录用户昵称)。 |
offlinePushDescription | string | 离线推送通知描述。
非空时覆盖默认描述。 |
CallParticipantInfo
通话参与者信息,包含用户 ID、昵称、头像、参与状态、麦克风/摄像头开关状态等。
属性 | 类型 | 说明 |
id | String | 用户 ID。 |
name | String | 用户昵称。 |
avatarURL | String | 用户头像 URL。 |
remark | String | 好友备注。 |
status | 参与者状态。 | |
isMicrophoneOpened | Bool | 麦克风是否开启。 |
isCameraOpened | Bool | 摄像头是否开启。 |
CallInfo
通话信息,包含通话 ID、房间 ID、发起者、被邀请者、媒体类型、通话方向、开始时间、时长等完整信息。
属性 | 类型 | 说明 |
callId | String | 通话 ID。 |
roomId | String | 房间 ID。 |
inviterId | String | 发起者 ID。 |
inviteeIds | [String] | 被邀请者 ID 列表。 |
chatGroupId | String | Chat 群组 ID。 |
mediaType | 通话媒体类型。 注意: 在早期事件阶段、未知类型,或历史通话记录(recent calls)未完整回填该字段时可能为空(null / nil),业务需注意可选解包。 | |
result | 通话方向/记录类型(如呼入、呼出、未接)。 注意: 这不代表通话挂断的具体原因,结束原因请参考 CallEndReason 枚举。 | |
startTime | TimeInterval | 通话真正开始(接通)的时间戳。(单位:毫秒)。 |
duration | TimeInterval | 通话时长(秒)。 |
CallState
通话状态数据,管理当前通话的实时数据状态。
属性 | 类型 | 说明 |
activeCall | 当前活跃的通话信息。
【生命周期约定】:在触发 onCallEnded 时,该对象不会被立即置空,而是保留通话终态供 UI 展示结束动画(此时 CallInfo.result 或其它参数反映结束原因)。若业务重新发起或接到新通话,会自动覆盖。开发者可通过重置 CallStore 相关状态进行手动清理。 | |
recentCalls | 最近通话记录列表。 注意: 每次调用 queryRecentCalls 后,该状态当前表现为覆盖更新,而不是自动追加(Append)。如需实现无限滚动效果,业务层需自行将新到达的数据拼接到原有列表中。 | |
cursor | String | 分页游标,用于查询更多通话记录。 |
selfInfo | 当前用户自身信息。 | |
allParticipants | 当前通话所有参与者列表。 | |
speakerVolumes | [String: Int] | 参与者音量信息,key 为用户 ID,value 为音量值。 |
networkQualities | [String: NetworkQuality] | 参与者网络质量信息,key 为用户 ID,value 为网络质量。 |
使用示例
import AtomicXCore// 发起视频通话CallStore.shared.calls(participantIds: ["mike"], mediaType: .video, params: nil) { code, message in}