Skip to content
v1
文档/iOS SDK/开发指南

生命周期、状态与错误处理

使用 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,同一 callIDrevision 单调递增。不要自行猜测状态迁移,应以 snapshot.stateavailableActions 为准。

状态说明

状态UI 建议
Preparing展示正在创建或恢复,不开放控制按钮
OutgoingRinging展示等待接听,可取消
IncomingRinging展示接听和拒绝
Connecting展示媒体连接中,可预设麦克风、摄像头和音频输出
Connected展示计时、成员与媒体控制
Reconnecting保留页面并展示重连,不创建新 Session
Ending禁用所有操作,等待终态
Ended使用 endReason 展示结果并释放页面持有的 Session

availableActions 比状态枚举更适合控制按钮,因为它还会考虑单聊/多人场景和当前组织者角色。

参与者和结束原因

使用 snapshot.participants 展示每个成员的 staterolejoinedAtleftAt。多人通话中组织者可动态转移,因此以 participant role 和 organizerUserID 为准。

通话结束后,常用 endReason 包括本地/远端挂断、取消、拒绝、无人接听、忙线、成员全部离开、服务端结束、其他设备处理、网络丢失和账号切换。业务方应根据枚举映射展示文案,不要解析 terminalError.localizedDescription 作为业务状态。

恢复策略

  • 活跃通话期间,SDK 不会因为 App 进入后台而主动断开 IM。
  • 网络断开时 Snapshot 会进入 Reconnecting;IM 恢复或 App 回到前台后,SDK 会查询通话详情并重新校准媒体状态。
  • 媒体参数获取或入会失败会以 1、2、4 秒退避自动重试最多 3 次;期间保持当前 Session。
  • 当前通话的最小恢复状态按登录用户隔离持久化,不保存短期媒体 Token。
  • 登出、切换账号或被踢下线时,当前 Session 以 AccountChanged 结束并清除恢复状态。

常见错误

错误code含义
BIMCallErrorAlreadyActive7004已有活跃通话
BIMCallErrorInvalidState7005当前状态不允许该操作
BIMCallErrorCallExpired7102通话已结束或过期
BIMCallErrorSignalingFailed7103会议信令请求失败
BIMCallErrorMediaUnavailable7201当前交付包没有可用媒体适配器或媒体配置不完整
BIMCallErrorJoinRoomFailed7202实时媒体房间加入失败

可恢复错误通过 onCallSession:didFailWithCode:desc: 回调;通话终态以 snapshot.endReasonsnapshot.terminalError 为准。

完整错误码和接入排查见音视频接入总览