iframe,原生端用 WebView)就能用。笔迹同步走白板自己的信令通道,不占用频道的流轨道,也不影响音视频。
所以对接白板的工作量,本质上只有两件事:拿到一个带授权码的页面地址,以及决定什么时候把它显示出来。
板子与频道的关系
白板的标识叫board(板子 ID),字符集限制与频道名相同。用同一个 board 的人就在同一块板上。
board 与频道没有强绑定,两种用法都成立:
白板首次被授权时自动创建,不需要预先创建。
两条打开路径
两条路径拿到的是同一个页面,区别只在授权码从哪来。频道内的用户走路径 A 就够了,不必再调服务端接口。
路径 A:会中用户直接用(推荐)
加入频道的响应里已经带了一个拼好的白板地址,授权码就是该用户本次会话的sid,board 就是频道名。拿到直接内嵌即可,零额外调用。
各端取法:
iOS(RTCEngineKit)、Windows 与 C SDK 的加入频道响应里不暴露该字段,这些端请走路径 B。
路径 B:业务后端签发授权码
用于不在频道里的人也要用白板,或board 与频道名不一致的独立白板。
请求里的 uid / name 决定白板上显示的协作者光标与操作者署名。接口详情见 服务端 API · 电子白板。
URL 参数
页面地址后可以追加这些查询参数。路径 A 拿到的地址已经带好了前四个:overlay 批注模式
overlay=1 让白板半透明叠在共享桌面画面之上做批注,画布固定 1920×1080 且禁止缩放——各端必须共用同一套坐标系,笔迹才会落在桌面内容的同一位置上。宿主需要调 window.setReceiverScreenSize(w, h) 告诉白板本机的屏幕尺寸。
普通互动白板不要带这个参数:它会隐藏主菜单并让背景近乎全透明。
让全频道一起进白板
推荐做法(Web Demo 就是这么做的):频道自定义属性记状态 + 自定义消息通知,两者缺一不可——消息负责通知在场的人,属性负责让中途入会的人恢复现场。 业务后端广播的消息体:status 开关白板视图:
white-board/destroy,把 props.white_board 置回 false,再广播 status: 0。
action 的取值由你自定义,这里的 white_board 只是 Demo 的约定。事件与数据结构见 事件参考,广播接口见 服务端 API · 频道。原生端 WebView 内嵌
白板页是一个标准的 Web 应用,WebView 需要允许 JavaScript。除此之外还有两组宿主接口: H5 调宿主(你需要在 WebView 里注入实现):
宿主调 H5:
接口名
AndroidInterface 是历史命名,iOS / Windows 端同样按这个名字挂载即可。iframe,需要用 <web-view> 组件承载,它会占满整个页面,且白板域名要先在小程序后台配置为业务域名。
Android 端的完整示例(WebView 配置、JS Bridge 实现、插入图片时的 onShowFileChooser 处理)见 Android · 白板接入。
生命周期与销毁
用
white-board/exist 可以查一块板子是否还在,比如决定要不要显示”进入白板”入口,或确认销毁是否生效。
常见问题
打开是空白页 / 提示未授权 多半是授权码问题:过期(超过 1 小时)、已被用过(一个码只能连一次)、或多端共用了同一个码。每次打开都重新取。 两个人画在了不同的板上 检查双方的board 是否一致。走路径 A 时 board 恒等于频道名,不会出错;走路径 B 时由你的后端传入,容易在多频道场景下传错。
会议结束后白板内容没了
board 取了频道名,频道销毁时连带销毁了它。需要留存就换一个独立的 board,并自己管理销毁时机。
能不能把白板画面推流给不能内嵌 WebView 的端?
白板本身不产媒体流。如果对端无法承载 H5,可以在能承载的一端把白板画面采集成自定义视频轨发布出去,见 自定义推流。
相关
- 服务端 API · 电子白板 —— 授权、检测、销毁三个接口
- 服务端 API · 频道 —— 频道属性与自定义消息广播
- 核心概念 —— 频道、用户、流轨道