注册与注销
所有会议事件都通过SMeetingDelegate 上报:
delegates是弱引用多播,可以注册多个观察者,SDK 不会因为注册而延长你的对象生命周期- 协议里所有方法都有默认空实现,只实现关心的事件即可
- 不再需要时调用
meeting.delegates.remove(delegate:) - 回调统一在主线程派发,可以直接更新 UI
@MainActor 类型,协议方法需要声明为 nonisolated,再在里面回到主 actor 上下文:
连接事件
DisconnectEventData 的 reason 是 DisconnectReason,可据此区分是自己走的还是被动断开;error 在异常断开时携带底层错误。
成员事件
媒体状态事件里的
byAdmin 为 true 时表示这次变化是主持人操作导致的,opUid 是操作者。你可以据此给用户一个「已被主持人关闭麦克风」这类提示。
UserHandupEventData.step 区分是哪一步:.request 举手、.cancel 取消、.confirmOpen 同意邀请、.rejectOpen 拒绝邀请。
房间状态事件
屏幕共享的
roomShareDidStart 以 RTC 媒体轨道为准,远端 screen 轨道到达即上报,收到时可以直接渲染共享画面。
shareBroadcastDidStart / shareBroadcastDidFinish 只在 iOS 全屏共享、且只在共享方自己这一端触发,用于区分「监听已挂上」和「真的有画面了」,接法见 屏幕共享。
当主持人开启「全体静音」或「全体禁画」时,非主持人成员的本地设备会被 SDK 自动关闭,并额外上报一次对应的成员媒体状态事件。
消息事件
两者都有
isPrivate 标记是否为私聊,uid 是发送者。
主持人指令事件
处理方式见 举手与开启请求。
等候室事件
分组讨论事件
这三个事件都需要你自行完成「退出当前会议、进入目标会议」的切换。
签到与点名事件
外设事件
外设事件不依赖会议状态,SDK 实例创建后就开始上报,可用于入会前的设备检测页面。
音频路由事件(iOS)
两个回调都只在 iOS 存在(声明包在
#if os(iOS) 里),且与外设事件一样不依赖会议状态。
AudioRouteChangeEventData.reason 是系统给出的变化原因,排查路由问题时比结果本身更有价值。中断恢复可能因系统通话未结束、App 仍在后台而延后,SDK 只在真正恢复后触发一次。详见 音频路由。
通话质量事件
质量走双轨,按用途选一条即可,不要两条都拿去驱动同一个 UI:
didReceiveQualityReport是每次上报都触发的原始数值(丢包、RTT、抖动、码率、MOS),适合信号塔图标与详细诊断面板connectionQualityDidChange只在等级跳档时触发,适合「当前网络不佳」提示和主动降级决策
activeSpeakersDidChange 给的是全量快照(已按音量降序排好),直接覆盖 UI 即可,不需要自己合并增量。无人说话时 speakers 为空数组。
这四个事件的数据结构定义在底层 SRTC 模块,使用时需要 import SRTC,字段说明见 类型定义;等级判定、冷启动取值与主动切层的完整说明见 SRTC · 通话质量与活跃说话人。
这四个事件只在会议使用 SeaStart(SFU) 引擎时有 —— 走 CDN(WangSu)的会议没有这条信令通道,不会收到任何一个。
会议外消息事件
需要先调用enableIm(),见 会议外消息。
这几个连接事件与前面的会议连接事件是两条独立通道,不要混用。
事件标识枚举
SDK 另外公开了两个枚举,列出各事件的字符串标识:RoomEventType—— 会议内事件标识,例如user_enter、room_share_startImEventType—— 会议外消息事件标识,例如call_calling
SMeetingDelegate 方法,这两个枚举在正常接入中用不到,只在你需要做日志埋点或与其它端对齐事件命名时才有用。