跳到主要内容

引用回复

IMKit 支持引用回复功能,允许用户在聊天页面中回复彼此的消息。引用回复功能默认使用 ReferenceMessage(类型标识:RC:ReferenceMsg)发送回复内容。

提示

从 5.38.0 开始,IMKit 针对引用消息进行功能升级。SDK 不再将回复内容封装为 RC:ReferenceMsg,而是在文本、图片、GIF、小视频、普通语音、高清语音、文件、位置等实际回复消息结构上写入引用关系信息。该功能需要在 IMKit SDK 中配置开启后才能使用,默认仍然使用原引用消息逻辑。

局限

旧版引用回复功能目前有以下限制:

  • 仅支持文本消息、文件消息、图文消息、图片消息、引用消息的引用。
  • 引用深度仅支持一度,即只能引用回复原始消息。如果多重引用,只展示上一层被引消息内容。
  • 被引用消息撤回后,引用消息仍会展示被引用的消息内容。

引用消息功能升级后,目前有以下限制:

  • 引用展示仅支持一层。如果被引用的消息本身携带引用关系,引用卡片只展示当前被引用消息对应的一层内容,不会递归展示更早的引用层级。
  • IMKit 内置会话页面支持引用已发送成功且有消息 UId 的消息。用户发送回复时,默认支持文本、图片、GIF、小视频、普通语音、高清语音、文件、位置消息作为回复内容。您可以通过 quoteMessageTypeWhiteList 调整允许发送的回复消息类型。
  • 开启后,低版本 SDK 会按原消息类型展示回复消息,无法展示引用关系信息。

用法

IMKit 会话页面默认已启用引用回复功能。用户在会话页面长按消息,在弹框里选择引用消息,即可引用该消息。在输入区添加消息内容后,SDK 默认会将输入内容与被引消息组合为 ReferenceMessage,并发送到会话中。

引用消息功能升级

默认的引用回复会将输入内容与被引消息组合为 ReferenceMessage 发送。开启引用消息功能升级后,SDK 会在实际发送的消息对象上写入引用关系信息 QuoteInfo,并通过 Message.quoteInfo 标识该消息回复的是哪一条原始消息。原 RC:ReferenceMsg 仍然可以正常使用。

引用消息功能升级默认关闭。开启后,用户引用一条消息后,可以继续发送文本、图片、GIF、小视频、普通语音、高清语音、文件、位置等多种类型的消息作为回复。

您可以通过 IMKit 全局配置开启引用消息功能升级。

Java
RongConfigCenter.featureConfig().enableReference(true);
RongConfigCenter.featureConfig().enableQuoteV2(true);

enableQuoteV2(true) 仅控制 IMKit 内置会话页面发送引用回复时是否使用升级后的 quoteInfo 方案,并且需要引用回复功能 enableReference(true) 保持开启。接收或历史消息中只要携带有效 Message.quoteInfo,IMKit 内置消息展示模板就会展示引用卡片,不依赖该发送侧开关。

可发送的回复消息类型由 quoteMessageTypeWhiteList 控制。默认包含:

消息类型类型标识
文本消息RC:TxtMsg
图片消息RC:ImgMsg
GIF 消息RC:GIFMsg
小视频消息RC:SightMsg
普通语音消息RC:VcMsg
高清语音消息RC:HQVCMsg
文件消息RC:FileMsg
位置消息RC:LBSMsg

如需限制可作为回复发送的消息类型,可以重新设置白名单。IMKit 内置会话页面暂不将自定义消息加入默认回复类型白名单;如果业务需要在自定义消息上展示引用卡片,请按下文自定义消息展示模板处理。

Java
List<String> whiteList = new ArrayList<>();
whiteList.add("RC:TxtMsg");
whiteList.add("RC:ImgMsg");
whiteList.add("RC:FileMsg");
RongConfigCenter.featureConfig().setQuoteMessageTypeWhiteList(whiteList);

引用语音回复的转文字

开启引用消息功能升级后,如果回复消息是普通语音消息或高清语音消息,且应用已开通并启用 IMKit 语音转文字能力,IMKit 会按语音消息原有规则展示转文字结果。转换后的文字是否显示,由消息中 SpeechToTextInfoisVisible 状态控制。

关闭引用回复功能

IMKit 5.X 版本不支持通过修改 XML 资源文件控制此功能。如需关闭引用回复功能,可以修改 IMKit 全局配置:

在 init 之后调用。

Java
RongConfigCenter.featureConfig().enableReference(false);

自定义引用消息的 UI

引用回复功能默认发送的消息包含引用消息内容(RC:ReferenceMsg),使用 ReferenceMessageItemProvider 模板展示在消息列表中。开启引用消息功能升级后,回复消息仍使用实际消息类型对应的展示模板展示,引用关系保存在 Message.quoteInfo 中,IMKit 内置消息展示模板会根据 quoteInfo.messageUId 展示引用卡片。引用回复的点击行为与原消息类型的点击行为保持一致。

所有消息展示模板都继承自 BaseMessageItemProvider<CustomMessage>,您可以继承 BaseMessageItemProvider<CustomMessage>,自行实现一个引用消息展示模板类,并将该自定义模板提供给 SDK。

如需在自定义消息中展示引用卡片,请在自定义消息展示模板中处理 Message.getQuoteInfo()。详见修改消息的展示样式

您也可以直接替换引用消息展示模板中引用的样式资源、字符串资源和图标资源。详见 IMKit 源码 ReferenceMessageItemProvider.java 中引用的资源。

例如:您可以复制 IMKit 源码中的 rc_item_reference_message.xml 的全部内容,您可以在项目下创建 /res/layout/rc_item_reference_message.xml 文件,修改其中定义的样式值。请勿删减 SDK 默认控件,不要随意修改 View 的 ID。