引用回复
IMKit 支持引用回复功能,允许用户在聊天页面中回复彼此的消息。引用回复功能默认发送的消息包含引用消息内容对象 ReferenceMessage(类型标识:RC:ReferenceMsg)。
从 26.3.0 开始,IMKit 针对引用消息进行功能升级。SDK 不再将回复内容封装为 RC:ReferenceMsg,而是在文本、图片、高清语音、文件、位置等实际回复消息结构上写入引用关系信息。该功能需要在 IMKit SDK 中配置开启后才能使用,默认仍然使用原引用消息逻辑。
局限
旧版引用回复功能目前有以下限制:
- 仅支持文本消息、文件消息、图文消息、图片消息、引用消息的引用。
- 引用深度仅支持一度,即只能引用回复原始消息。如果多重引用,只展示上一层被引消息内容。
用法
IMKit 会话页面默认已启用引用回复功能。用户在会话页面长按消息,在弹框里选择引用消息,即可引用该消息。在输入区添加消息内容后,SDK 默认会将输入内容与被引消息组合为 ReferenceMessage,并发送到会话中。
引用消息 V2
默认的引用回复会将输入内容与被引消息组合为 ReferenceMessage 发送。开启引用消息 V2 后,SDK 会在实际发送的消息对象上写入引用关系信息 QuoteInfo,并通过 Message.quoteInfo 标识该消息回复的是哪一条原始消息。原 RC:ReferenceMsg 仍然可以正常使用。
引用消息 V2 默认关闭。开启后,用户引用一条消息后,可以继续发送文本、图片、GIF、小视频、普通语音、高清语音、文件、位置、图文等多种类型的消息作为回复。
您可以通过 ConversationConfig 开启或关闭引用消息 V2。
let config = RongIM.getInstance().conversationService().getConversationConfig();
// 开启引用消息 V2
config.setQuoteV2Enable(true);
RongIM.getInstance().conversationService().setConversationConfig(config);
如需关闭引用消息 V2,传入 false 即可。关闭后,IMKit 仍使用旧版 ReferenceMessage 引用回复逻辑。
let config = RongIM.getInstance().conversationService().getConversationConfig();
// 关闭引用消息 V2,恢复旧版 ReferenceMessage 引用回复逻辑
config.setQuoteV2Enable(false);
RongIM.getInstance().conversationService().setConversationConfig(config);
可发送的回复消息类型由 setQuoteMessageTypeWhiteList 控制。默认包含:
| 消息类型 | 类型标识 |
|---|---|
| 文本消息 | RC:TxtMsg |
| 语音消息 | RC:VcMsg |
| 高清语音消息 | RC:HQVCMsg |
| 图片消息 | RC:ImgMsg |
| GIF 消息 | RC:GIFMsg |
| 小视频消息 | RC:SightMsg |
| 文件消息 | RC:FileMsg |
| 位置消息 | RC:LBSMsg |
| 图文消息 | RC:ImgTextMsg |
如需限制可作为回复发送的消息类型,可以重新设置白名单。传入空数组时会重置为默认全量类型。
let config = RongIM.getInstance().conversationService().getConversationConfig();
config.setQuoteMessageTypeWhiteList([
"RC:TxtMsg",
"RC:ImgMsg",
"RC:FileMsg"
]);
RongIM.getInstance().conversationService().setConversationConfig(config);
关闭引用回复功能
IMKit 目前不支持关闭引用回复功能。
自定义引用消息的 UI
默认引用回复使用 ReferenceMessageItemProvider 模板展示引用消息(RC:ReferenceMsg)。开启引用消息 V2 后,回复消息仍使用实际消息类型对应的模板展示,引用关系保存在 Message.quoteInfo 中,IMKit 内置消息模板会根据 quoteInfo 展示引用卡片。引用回复的点击行为与原消息类型的点击行为保持一致。
如果需要调整内置消息样式,需继承 BaseMessageItemProvider<ReferenceMessage> 自行实现消息展示模板类,详见自定义Provider。
调用 addMessageItemProvider 的接口将该自定义模板提供给 SDK,objectName 传 ReferenceMessageObjectName。
import { ReferenceMessageObjectName, RongIM } from "@rongcloud/imkit";
// 注册自定义引用消息 provider 给 IMKit
RongIM.getInstance().conversationService().addMessageItemProvider(ReferenceMessageObjectName, new CustomReferenceMessageItemProvider())