生命周期、状态与错误处理
使用 Snapshot 驱动 UI
objc
- (void)onCallSession:(BIMCallSession *)session
snapshotChanged:(BIMCallSnapshot *)snapshot {
self.answerButton.hidden =
!(snapshot.availableActions & BIMCallAvailableActionAccept);
self.hangupButton.hidden =
!(snapshot.availableActions & BIMCallAvailableActionHangup);
}swift
func onCallSession(_ session: BIMCallSession,
snapshotChanged snapshot: BIMCallSnapshot) {
answerButton.isHidden = !snapshot.availableActions.contains(.accept)
hangupButton.isHidden = !snapshot.availableActions.contains(.hangup)
}每次状态变化都会返回新的 BIMCallSnapshot,同一 callID 的 revision 单调递增。不要自行猜测状态迁移,应以 snapshot.state 和 availableActions 为准。
状态说明
| 状态 | UI 建议 |
|---|---|
Preparing | 展示正在创建或恢复,不开放控制按钮 |
OutgoingRinging | 展示等待接听,可取消 |
IncomingRinging | 展示接听和拒绝 |
Connecting | 展示媒体连接中,可预设麦克风、摄像头和音频输出 |
Connected | 展示计时、成员与媒体控制 |
Reconnecting | 保留页面并展示重连,不创建新 Session |
Ending | 禁用所有操作,等待终态 |
Ended | 使用 endReason 展示结果并释放页面持有的 Session |
availableActions 比状态枚举更适合控制按钮,因为它还会考虑单聊/多人场景和当前组织者角色。
参与者和结束原因
使用 snapshot.participants 展示每个成员的 state、role、joinedAt 和 leftAt。多人通话中组织者可动态转移,因此以 participant role 和 organizerUserID 为准。
通话结束后,常用 endReason 包括本地/远端挂断、取消、拒绝、无人接听、忙线、成员全部离开、服务端结束、其他设备处理、网络丢失和账号切换。业务方应根据枚举映射展示文案,不要解析 terminalError.localizedDescription 作为业务状态。
恢复策略
- 活跃通话期间,SDK 不会因为 App 进入后台而主动断开 IM。
- 网络断开时 Snapshot 会进入
Reconnecting;IM 恢复或 App 回到前台后,SDK 会查询通话详情并重新校准媒体状态。 - 媒体参数获取或入会失败会以 1、2、4 秒退避自动重试最多 3 次;期间保持当前 Session。
- 当前通话的最小恢复状态按登录用户隔离持久化,不保存短期媒体 Token。
- 登出、切换账号或被踢下线时,当前 Session 以
AccountChanged结束并清除恢复状态。
常见错误
| 错误 | code | 含义 |
|---|---|---|
BIMCallErrorAlreadyActive | 7004 | 已有活跃通话 |
BIMCallErrorInvalidState | 7005 | 当前状态不允许该操作 |
BIMCallErrorCallExpired | 7102 | 通话已结束或过期 |
BIMCallErrorSignalingFailed | 7103 | 会议信令请求失败 |
BIMCallErrorMediaUnavailable | 7201 | 当前交付包没有可用媒体适配器或媒体配置不完整 |
BIMCallErrorJoinRoomFailed | 7202 | 实时媒体房间加入失败 |
可恢复错误通过 onCallSession:didFailWithCode:desc: 回调;通话终态以 snapshot.endReason 和 snapshot.terminalError 为准。
完整错误码和接入排查见音视频接入总览。
