ChannelDelegate
通过channel.delegates.add(delegate: self) 注册。
连接事件
用户事件
轨道事件
最常见的业务入口是
didAddTrack,因为你通常会在这里决定是否订阅远端视频或远端音频。
消息与频道事件
通话质量事件
质量走双轨,按用途选一条:
didReceiveQualityReport 是每个上报周期都触发的原始数值,适合信号塔与诊断面板;didChangeConnectionQuality 只在跳档时触发,适合「网络不佳」提示与主动降级。别用前者驱动提示或降级,等级抖动时会反复闪烁。
didChangeActiveSpeakers 给的是全量快照(已按音量降序),业务侧直接覆盖 UI,不需要自己合并增量;无人说话时为空数组。
这四个事件仅 SeaStart(SFU)引擎有 —— 它们走订阅 PeerConnection 上的信令 DataChannel,WangSu(CDN)引擎没有这条通道。详见 通话质量与活跃说话人。
TrackDelegate
通过track.delegates.add(delegate: self) 注册。
轨道级事件
其中
trackDidBindRtcTrack(_:) 对视频渲染尤其有用,因为远端轨道对象可能先出现,底层媒体轨道稍后才真正绑定完成 —— 收到这个事件才代表可以渲染。
两个 screenBroadcast 事件只在 iOS 全屏采集(ScreenCaptureMode.broadcast)下触发:
全屏共享由用户从系统 UI 发起、也可能从系统胶囊直接停止,这些动作发生在 App 之外,
只能靠事件感知。startCapture() 成功仅代表 SDK 已就绪,收到 screenBroadcastDidStart
才是真正”共享中”。详见屏幕共享。
AudioRouteSessionDelegate
iOS 专有。 通过AudioRouteSession.shared.delegates.add(delegate: self) 注册,
所有回调均在主线程执行,协议提供默认空实现,只实现关心的方法即可。
reason 区分了变化来源(.oldDeviceUnavailable 拔出、.newDeviceAvailable 插入、
.override App 主动覆盖),排查路由问题时它往往比结果本身更有价值。
audioRouteSessionDidRecoverFromInterruption(_:) 与系统的
AVAudioSession.interruptionNotification(.ended) 不等价:系统电话挂断瞬间音频硬件尚未释放,
SDK 会等通话真正结束且 App 回到前台后才重建会话,失败还会重试——只有真正恢复成功才触发此回调。
业务层在这里刷新 UI 即可,不需要自己处理这套时序。
详见音频路由。