注册与注销
所有会议事件都通过SMeetingDelegate 上报:
delegates是弱引用多播,可以注册多个观察者,SDK 不会因为注册而延长你的对象生命周期- 协议里所有方法都有默认空实现,只实现关心的事件即可
- 不再需要时调用
meeting.delegates.remove(delegate:) - 回调统一在主线程派发,可以直接更新 UI
@MainActor 类型,协议方法需要声明为 nonisolated,再在里面回到主 actor 上下文:
连接事件
DisconnectEventData 的 reason 是 DisconnectReason,可据此区分是自己走的还是被动断开;error 在异常断开时携带底层错误。
成员事件
媒体状态事件里的
byAdmin 为 true 时表示这次变化是主持人操作导致的,opUid 是操作者。你可以据此给用户一个「已被主持人关闭麦克风」这类提示。
主持人转移时,SDK 先把新主持人本地升为 .host、原主持人降为 .member,各发一次 userRoleDidChange,再发 roomHostDidMove(带新主持人 uid 与原主持人 sourceUid)。只关心角色刷新的话不必实现 roomHostDidMove。原主持人在本地快照里不是 .host 时不补发降级那次 userRoleDidChange。
UserHandupEventData.step 区分是哪一步:.request 举手、.cancel 取消、.confirmOpen 同意邀请、.rejectOpen 拒绝邀请。
房间状态事件
屏幕共享的
roomShareDidStart 以 RTC 媒体轨道为准,远端 screen 轨道到达即上报,收到时可以直接渲染共享画面。
shareBroadcastDidStart / shareBroadcastDidFinish 只在 iOS 全屏共享、且只在共享方自己这一端触发,用于区分「监听已挂上」和「真的有画面了」,接法见 屏幕共享。
当主持人开启「全体静音」或「全体禁画」时,非主持人成员的本地设备会被 SDK 自动关闭,并额外上报一次对应的成员媒体状态事件。
roomTitleDidChange 的载荷带 title 与 previousTitle,主会议改名和小组会议改名(adminUpdateSubMeetingTitle)都会触发。它没有 opUid:会议改名没有独立的广播指令,事件是频道属性更新后比对标题得出的,属性里只有结果没有操作者,编一个操作者出来反而会误导调用方。
消息事件
两者都有
isPrivate 标记是否为私聊,uid 是发送者。
主持人从后台下发的系统消息也走 didReceiveChatMessage。1.5.0 起 RoomChatMsgEventData 带 action(原始广播 action:成员聊天为 user_send_room_chat_message,系统消息为 admin_send_room_chat_message)和 isSystem,需要区分展示或过滤系统消息时判断 isSystem 即可。
主持人指令事件
处理方式见 举手与开启请求。
等候室事件
分组讨论事件
这三个事件都需要你自行完成「退出当前会议、进入目标会议」的切换。
签到与点名事件
外设事件
外设事件不依赖会议状态,SDK 实例创建后就开始上报,可用于入会前的设备检测页面。
音频路由事件(iOS)
两个回调都只在 iOS 存在(声明包在
#if os(iOS) 里),且与外设事件一样不依赖会议状态。
AudioRouteChangeEventData.reason 是系统给出的变化原因,排查路由问题时比结果本身更有价值。中断恢复可能因系统通话未结束、App 仍在后台而延后,SDK 只在真正恢复后触发一次。详见 音频路由。
通话质量事件
质量走双轨,按用途选一条即可,不要两条都拿去驱动同一个 UI:
didReceiveQualityReport是每次上报都触发的原始数值(丢包、RTT、抖动、码率、MOS),适合信号塔图标与详细诊断面板connectionQualityDidChange只在等级跳档时触发,适合「当前网络不佳」提示和主动降级决策
activeSpeakersDidChange 给的是全量快照(已按音量降序排好),直接覆盖 UI 即可,不需要自己合并增量。无人说话时 speakers 为空数组。自 1.6.0 起自己也在快照里(isLocal == true,开麦且在说话时出现),与远端同一量纲;不想要可设 meeting.activeSpeakerOptions.includeLocal = false。
这四个事件的数据结构定义在底层 SRTC 模块,使用时需要 import SRTC,字段说明见 类型定义;等级判定、冷启动取值与主动切层的完整说明见 SRTC · 通话质量与活跃说话人。
这四个事件只在会议使用 SeaStart(SFU) 引擎时有 —— 走 CDN(WangSu)的会议没有这条信令通道,不会收到任何一个。
收流状态事件
按轨道判定:某一路视频连续一段时间没有出帧就报超时(
timedOut == true),帧一恢复立即再报一次(timedOut == false)。典型用法是开关某一格画面上的「加载中」指示。订阅后首帧到达时会先收到一次恢复,据此关掉初始 loading。
载荷直接复用底层 SRTC 的 ReceiveStreamStatus(需要 import SRTC),字段见 类型定义。对应老 MeetingKit 的 onReceiveStreamStatusChange:streamType:status:。
与上面四个质量事件不同,这个事件两种引擎都有 —— 它由本地是否收到视频帧判定,不依赖 SFU 的信令通道。
会议外消息事件
需要先调用enableIm(),见 会议外消息。
这几个连接事件与前面的会议连接事件是两条独立通道,不要混用。
- 1.4.1 及以前,
enableIm()只建立通道、没有把消息派发出来,呼叫 / 提醒 / 等候室放行 / 小组求助和重连、断开回调实际都收不到;1.5.0 起才真正派发 - 每条消息先以原始形态触发一次
imDidReceiveMessage,SDK 认识的 action 再额外派发到对应的具名事件;业务自定义的 action 只走原始透传 - 重连成功走
meetingImDidReconnect,不会再触发imDidConnect - 主动调用
disableIm()不会触发imDidDisconnect;被动断开时ImDisconnectEventData带disconnectReason(SRTCImDisconnectReason)、errorCode、errorMessage
事件标识枚举
SDK 另外公开了两个枚举,列出各事件的字符串标识:RoomEventType—— 会议内事件标识,例如user_enter、room_share_start;1.5.0 起新增roomHostMoved(room_host_moved),对应roomHostDidMoveImEventType—— 会议外消息事件标识,例如call_calling;1.5.0 起另有connected、message,对应imDidConnect、imDidReceiveMessage
SMeetingDelegate 方法,这两个枚举在正常接入中用不到,只在你需要做日志埋点或与其它端对齐事件命名时才有用。