消息与会话管理概述
uni-app IMKit 的 UI 页面通过 uni.$RongKitStore 使用 imkit-store。本目录介绍 UI 之外的消息与会话状态管理能力;页面路由参见UI 页面,RCUIKit 页面、组件与 Store 的关系参见RCUIKit 源码结构。
Store 职责
| Store 或模块 | 主要职责 | 常用入口 |
|---|---|---|
RCKitConversationStore | 管理会话列表、当前打开会话、会话缓存和未读数 | getConversations、openConversation、createCachedConversation、removeConversation、updateCacheConversation、getTotalUnreadCount、clearUnreadCount |
RCKitMessageStore | 管理消息内存缓存、历史消息、发送和消息操作 | getMessages、getHistoryMsgList、sendMessage、sendMediaMessage、insertMessage、recallMessage、forwardMessage |
RCKitTypingStore | 发送和读取单聊或群聊的正在输入状态 | sendTyping、isTyping、releaseTypingThrottle |
SpeechToTextStore | 管理高清语音转文字的请求、结果、转换中和失败状态 | requestForMessage、getSTTText、isConverting、hasError |
appData(AppDataModule) | 管理用户、群组、系统会话和群成员资料缓存,并通过业务 Hook 补充资料 | getUserProfile、getGroupProfile、getSystemProfile、groupMembersCache |
以上对象由 RCKitStore 在初始化时创建,业务代码通常通过 uni.$RongKitStore 访问,不需要自行实例化各 Store。
会话管理
conversationStore 的 openedConversation 是聊天页、输入区域、转发页和阅读状态页之间共享的当前会话状态。打开指定会话时,先创建或取得内存会话,再调用 openConversation:
const conversation = uni.$RongKitStore.conversationStore.createCachedConversation({
conversationType: RongIMLib.ConversationType.PRIVATE,
targetId: 'YourTargetId',
});
uni.$RongKitStore.conversationStore.openConversation(conversation);
会话列表页使用 getConversations 分页读取会话;删除、修改草稿或更新会话展示信息时,使用对应的 removeConversation 或 updateCacheConversation。不要直接修改 Store 内部的会话数组,以免 UI 响应式状态和未读数不一致。
消息管理
messageStore 为 RCUIKit 页面提供统一消息入口:
- 聊天页从
getMessages读取当前缓存,并使用getHistoryMsgList加载更多历史消息。 - 文本和自定义消息使用
sendMessage;图片、语音、视频和文件使用媒体消息上传流程后发送。 - 消息组件的撤回、失败重发和转发分别调用
recallMessage、sendMessage/媒体重发逻辑和forwardMessage。 - 转发页通过
setSelectedMessages与getSelectedMessages在路由之间暂存待转发消息。 - 启用消息已读 V5 时,消息列表通过
sendV5Receipts上报可见消息,阅读状态页使用回执查询接口展示成员状态。
自定义消息的注册、发送、消息组件接入和会话列表摘要处理,请参见自定义消息。内置消息类型与 message-item.vue 的分发关系,请参见消息列表与消息组件。
输入状态与语音转文字
输入区域在单聊输入时通过 typingStore.sendTyping 发送文本正在输入状态,在语音录制时发送对应的语音状态;发送完成后释放限流。聊天页通过 typingStore.isTyping 更新导航栏标题。
SpeechToTextStore 只负责语音转文字的状态管理。是否展示入口取决于 IMLib getAppSettings() 返回的 isSpeechToTextEnabled 配置,与消息已读 V5 开关无关;具体消息 UI 入口位于 RCUIKit/pages/chat/message/messageType/message-audio.vue。
业务资料与缓存
appData 负责缓存用户、群组、系统会话和群成员资料。资料缺失时,UI 会使用默认名称或头像;业务项目应在初始化 RCKitStoreInstaller 时实现资料 Hook,详见业务数据管理。
群聊 @ 成员面板通过 appData.groupMembersCache 读取群成员,阅读状态页也依赖该缓存补全成员名称和头像。因此,资料 Hook 的返回值应保持与 IUserProfile、IGroupProfile 和 IGroupMemberProfile 类型一致。
不要在页面中绕过 Store 直接调用 IMLib 的发送接口。这样可能导致消息缓存、发送状态、会话摘要和未读数无法同步;如需在 UI 外发送消息,请使用对应的 messageStore 接口。