微信小程序实现聊天室功能:基于 ZEGO ZIM 的房间实践

微信小程序实现聊天室功能:基于 ZEGO ZIM 的房间实践

💡 原文中文,约8900字,阅读约需22分钟。
📝

内容提要

本文介绍用ZEGO ZIM实现小程序聊天室:聊天室使用conversationType=1、toConversationID传roomID,不进会话列表、无未读数、不做消息补偿。推荐用enterRoom自动建进房,以roomStateChanged的Connected为进房成功信号。发送需间隔100ms防限频,接收要按房间过滤并去重。在线人数用queryRoomOnlineMemberCount,成员进出靠回调增量,重连后须补全量。房间属性上限5120字节,变更后重拉全量。房间连接不会无限重连,需自行退避重连,被顶下线或房间销毁勿重连,离开务必leaveRoom。

🔎

延伸解读

聊天室不是群聊:模型差异决定页面设计

文章强调聊天室(conversationType=1)与单聊、群聊是三套不同模型。聊天室不进会话列表、没有未读数、退出后收不到消息且普通房间解散后不存储历史。这意味着页面不需要维护会话列表、红点或消息补偿逻辑,入口应由业务页面携带 roomID 进入。若误把聊天室当群聊用,会引入不必要的未读和会话管理代码,反而偏离实际场景。

进房成功信号与重连兜底是上线关键

enterRoom 的 Promise resolve 只代表请求被受理,真正可发消息的信号是 roomStateChanged 的 Connected(2)+Success(0)。文章特别指出房间连接 SDK 只做有限次重连,之后不再自动恢复,用户界面看似正常却收不到消息。因此需监听状态落定后自行退避重连,且被顶下线(event=10)或房间被销毁(ROOM_NOT_EXIST)时不应重连,应直接提示用户。

在线人数与房间属性:增量之外必须补全量

在线人数可用 queryRoomOnlineMemberCount 查询,成员进出靠 roomMemberJoined/Left 做增量,但断线期间的变动 SDK 不会补发,重连成功后必须重新拉取全量成员和房间属性。房间属性总大小上限 5120 字节,长公告容易占满,建议只存 ID 或简短文案,正文放服务端。属性变更后直接重拉全量比合并增量更省事。

发送限频与退房:两个容易忽略的运维细节

房间文本消息两次发送间隔需大于 100ms,连点或自动补系统提示容易触发限频,文章建议加最小间隔节流;高频弹幕场景应改用 ZIMBarrageMessage。另外离开页面务必调用 leaveRoom,否则人数虚高、消息持续推送耗流量,免费版还会因占用房间导致无法进入下一个房间。拿不准所在房间时可用 leaveAllRoom 清空。

❓

Q&A

ZEGO ZIM 里聊天室和单聊、群聊有什么区别?

聊天室是房间模型,conversationType=1,toConversationID 传 roomID;单聊是 conversationType=0,toConversationID 传对方 userID;群聊是 conversationType=2。聊天室不进会话列表、没有未读数、用户退出后收不到离线消息也没有消息补偿,房间解散后不存储消息(旗舰版支持进房拉最近2000条)。

小程序里用 ZEGO ZIM 进聊天室,用哪个接口比较好?

推荐用 enterRoom(roomInfo, config),它在房间不存在时会自动创建再进入,适合聊天室 roomID 由业务生成、第一个用户进来时房间还不存在的场景。createRoom 要求当前用户建房且房间已存在会报错,joinRoom 要求房间已存在,都不如 enterRoom 方便。

enterRoom 的 Promise resolve 了,为什么发消息还是失败?

enterRoom 的 Promise resolve 只代表请求被受理,不代表房间连接已就绪。真正的进房成功信号是 roomStateChanged 事件中 state=2(Connected)且 event=0(Success),此时才能发消息。

聊天室发送消息有什么频率限制?怎么避免?

房间消息发送间隔需大于 100ms(单客户端 10 次/秒),否则会触发频率限制。可以通过记录上次发送时间,在发送前等待补足 100ms 间隔来避免。如果是直播弹幕这种高频场景,应使用 ZIMBarrageMessage(type 20),它不限频、不存储、允许丢。

聊天室在线人数和成员列表怎么获取?重连后要注意什么?

在线人数用 queryRoomOnlineMemberCount(roomID) 查询,但必须人在房间内。成员进出靠 roomMemberJoined/roomMemberLeft 回调做增量。重连成功后必须重新拉一次全量(在线人数和成员列表),因为断线期间的成员变动 SDK 不会补发。完整成员列表用 queryRoomMemberList,需要联系 ZEGO 开通,最多返回 500 人。

ZEGO ZIM 房间连接断线后会自动重连吗?需要自己处理吗?

房间连接 SDK 只做有限次重连,之后就不管了,不会像单聊那样无限重连。必须自己监听 roomStateChanged,在 state=0(Disconnected)后按退避策略(如 1s、2s、4s)重新 enterRoom。注意被顶下线(event=10)或房间被销毁(ROOM_NOT_EXIST)时不要重连,应提示用户。

离开聊天室时一定要调用 leaveRoom 吗?不调用会怎样?

一定要调用 leaveRoom。不退房的后果包括:房间一直算你在线导致人数虚高;房间消息仍会推给你,白耗流量和电量;免费版单个用户只能同时进 1 个房间,不退房就进不了下一个;所有人都离开后房间才会自动销毁,你挂着就销毁不了。页面卸载时在 onUnload 中调用 leaveRoom 即可。

🏷️

标签

➡️

继续阅读