Skip to main content

注册与注销

所有会议事件都通过 SMeetingDelegate 上报:
要点:
  • delegates弱引用多播,可以注册多个观察者,SDK 不会因为注册而延长你的对象生命周期
  • 协议里所有方法都有默认空实现,只实现关心的事件即可
  • 不再需要时调用 meeting.delegates.remove(delegate:)
  • 回调统一在主线程派发,可以直接更新 UI
如果你的观察者是 @MainActor 类型,协议方法需要声明为 nonisolated,再在里面回到主 actor 上下文:

连接事件

DisconnectEventDatareasonDisconnectReason,可据此区分是自己走的还是被动断开;error 在异常断开时携带底层错误。

成员事件

媒体状态事件里的 byAdmintrue 时表示这次变化是主持人操作导致的,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_enterroom_share_start
  • ImEventType —— 会议外消息事件标识,例如 call_calling
Swift 侧的事件分发走上面的 SMeetingDelegate 方法,这两个枚举在正常接入中用不到,只在你需要做日志埋点或与其它端对齐事件命名时才有用。

相关页面