sdk 只会给前 100 个人触发 user-in 和 user-out 事件;如果想看更多用户可以使用 client.user.requestMore 方法拉取更多 user。 但注意超过 100 位拉取下来的 user 不会触发 user-out,这些 user 可能一直留在列表里面
建议用户列表和聊天列表实现大列表渲染优化,否则会有性能问题。每次只渲染少量的 dom,上下滚动的时候动态加载。
不要使用单播去做广播的功能,更不要在 user-in 里面有发单播的逻辑,因为不是所有人进房都有 user-in 事件。
RTM 的主要功能就是信令的分发,信令分为单播信令和广播信令;单播信令就是指定发给某个人的信令,广播信令就是发送给房间内所有人的信令。信令的接口主要 是发送和接收。
信令发送如下:
// 单播信令 // messageType 业务自己定义的消息类型 // message 支持基本类型和可以 stringify 的对象 client.sendMessage(userId: UserId, messageType: string, message: any).then(() => { // 发送成功 }) .catch((error) => { // 发送失败,可以选择重试 }) // 广播信令 // messageType 业务自己定义的消息类型 // message 支持基本类型和可以 stringify 的对象 // options 广播的配置。 // options.all true 表示发给所有人,false 只发给 role 为 root 和 admin 的用户 默认 true // options.cache true 表示此广播需要缓存 默认 true client.sendBroadcastMessage(messageType: string, message: any, options?: BroadcastMessageOptions).then(() => { // 发送成功 }) .catch((error) => { // 发送失败,可以选择重试 })
信令接收如下:
// 主动拉取广播缓存,设置 options.cache 的有效 // 一般会在进房成功之后拉取广播缓存恢复房间内的一些状态 client.getCachedBroadcastMessage(messageType: string).then((data) => { const message = data.message }) // 设置单播消息监听 // messageType 业务自己定义的消息类型 client.onMessage(messageType: string, (message, fromId) => { // 处理信令逻辑 }) // 设置广播消息监听 // messageType 业务自己定义的消息类型 client.onBroadcastMessage(messageType: string, (message, fromId) => { // 处理信令逻辑 }) // 可以取消信令监听函数 // 传 listener 取消 listener 函数的监听,不传取消 messageType 的所有监听 client.offMessage(messageType: string, listener?: Function) client.offBroadcastMessage(messageType: string, listener?: Function) // 信令的监听可以设置命名空间,这样可以批量取消监听 // 以 . 开头 const namespace = '.my_namespace' client.onMessage('message1' + namespace, (message, fromId) => { // 处理信令逻辑 }) client.onMessage('message2' + namespace, (message, fromId) => { // 处理信令逻辑 }) client.onBroadcastMessage('message3' + namespace, (message, fromId) => { // 处理信令逻辑 }) client.onBroadcastMessage('message4' + namespace, (message, fromId) => { // 处理信令逻辑 }) // 使用 namespace 取消监听,当有大量的 messageType,每个 messageType 有不同的监听函数,可以灵活批量取消 client.offMessage(namespace) client.offBroadcastMessage(namespace)
进入房间后可以通过 client.user.all() 获取当前所有用户。
// 本地用户缓存 const userList = client.user.all() client.user /** * 用户加入 */ .on(BRTM.Events.User.USER_IN, (user) => { userList.push(user) }) // 用户退出 .on(BRTM.Events.User.USER_OUT, user => { removeUser(user) }) client.user.requestMore(count).then((data) => { const { hasMore, userList } = data // userList 加入就缓存,根据业务逻辑判断是否还需要拉取 })
// 本地聊天缓存 const messageList = [] // 聊天通道打开,在此事件之后做聊天的相关操作 client.on(BRTM.Events.Room.MESSAGE_CHANNEL_OPENED, () => { client.chat.pull(channel: string, next: number = -1, count: number = 10).then((data) => { const { next, channel, hasMore, messageList } = data // messageList 加入缓存 if (hasMore) { // 根据业务逻辑判断是否需要继续拉取历史消息 // 如 UI 向上滚动查看 // 使用 next 作为下一次的 pull 的 next 参数 } }) // 收到新消息 client.chat.on(BRTM.Events.Chat.MESSAGE_RECEIVED, (message) => { // message 加入缓存 }) // 收到新的私聊消息 .on(BRTM.Events.Chat.MESSAGE_WHISPER_RECEIVED, (message) => { // message 加入缓存 }) // 收到撤回消息 .on(BRTM.Events.Chat.MESSAGE_REVOKED, (message) => { // 将撤回的消息从本地缓存删除 }) })
Web
用户列表实现
sdk 只会给前 100 个人触发 user-in 和 user-out 事件;如果想看更多用户可以使用 client.user.requestMore 方法拉取更多 user。 但注意超过 100 位拉取下来的 user 不会触发 user-out,这些 user 可能一直留在列表里面
大列表渲染
建议用户列表和聊天列表实现大列表渲染优化,否则会有性能问题。每次只渲染少量的 dom,上下滚动的时候动态加载。
广播单播使用
不要使用单播去做广播的功能,更不要在 user-in 里面有发单播的逻辑,因为不是所有人进房都有 user-in 事件。
信令使用
RTM 的主要功能就是信令的分发,信令分为单播信令和广播信令;单播信令就是指定发给某个人的信令,广播信令就是发送给房间内所有人的信令。信令的接口主要 是发送和接收。
信令发送如下:
信令接收如下:
用户列表维护
进入房间后可以通过 client.user.all() 获取当前所有用户。
聊天处理流程