跳到主要内容

消息回应

IMKit 从 5.42.0 开始支持消息回应(Message Reaction)UI。开启后,用户可以在会话页面长按消息,选择表情回应,用 emoji 对消息进行回应。IMKit 会在消息气泡下方展示回应内容,并支持查看回应详情。

提示
  • IMKit 消息回应默认关闭,需要通过配置开启。
  • IMKit 仅提供会话页面 UI。底层数据能力由 IMLib 的消息回应接口提供。
  • 如果你只使用 IMLib 或需要完全自定义 UI,请直接调用 IMLib 的消息回应接口。
表情回应入口
表情回应入口
消息气泡回应展示
消息气泡回应展示
回应详情
回应详情

使用限制

  • IMKit 内置会话页面仅支持单聊、群聊会话中的消息回应。
  • 支持的内置消息类型包括文本、图文、图片、GIF、普通语音、高清语音、小视频、文件、位置、引用消息、合并转发消息。
  • 发送中、发送失败、取消发送或本地尚未生成 messageUId 的消息不支持添加回应。
  • IMKit 不在会话列表中展示消息回应。

开启消息回应

建议在打开会话页面前开启消息回应。配置开启后,IMKit 会在支持的消息长按菜单中显示表情回应入口。

Java
RongConfigCenter.featureConfig().enableMessageReaction(true);

关闭时传入 false

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

设置展示模式

消息回应展示在消息气泡下方。IMKit 提供两种展示模式,默认使用 COUNT_ONLY。请在进入会话页面前设置展示模式。

展示模式说明
MessageReactionDisplayMode.COUNT_ONLY仅显示回应表情和人数,例如 👍3人。人数超过 99 时显示 99+
MessageReactionDisplayMode.DETAIL显示回应表情和部分用户名称,超出一行时显示 ...N人
Java
RongConfigCenter.conversationConfig()
.setMessageReactionDisplayMode(MessageReactionDisplayMode.COUNT_ONLY);

DETAIL 模式下,用户名称按以下优先级展示:好友备注或 UserInfo.alias、群成员昵称或名称、用户名称、userId

默认交互

开启消息回应后,IMKit 内置会话页面提供以下默认交互:

  1. 用户长按支持的消息,长按菜单中显示表情回应
  2. 点击表情回应后,底部弹出回应表情选择器。
  3. 用户选择表情后,IMKit 会调用 IMLib 的 addMessageReactionremoveMessageReaction
  4. 消息气泡下方展示回应项。当前用户已回应的项会高亮。
  5. 点击回应项中的 emoji 区域会添加或移除该回应:当前用户未添加该回应时执行添加;已添加时执行移除。
  6. COUNT_ONLY 模式下,点击人数文本会打开回应详情;在 DETAIL 模式下,点击 ...N人 会打开回应详情。

回应项背景、空白区域、分隔线,以及 DETAIL 模式中的用户名称文本会消费点击事件,但不会触发添加、移除、查看详情或消息本身的点击事件。

表情选择器

表情选择器包含两个区域:

区域说明
最常使用用户成功添加过回应后显示。最多展示配置数量的常用表情。
默认表情与聊天输入框 emoji 面板使用同一份表情数据,数量和顺序保持一致。

首次使用时没有常用数据,只显示默认表情。常用表情数据保存在本地应用安装中,卸载重装后会重新统计。IMKit 仅在成功添加回应时记录常用次数,移除回应或操作失败不会记录。

设置常用表情显示数量

默认显示 14 个常用表情。有效范围为 1 到 20,传入范围外的值会恢复默认值 14。

Java
RongConfigCenter.conversationConfig()
.setMessageReactionFrequentDisplayCount(14);

回应详情

用户点击回应人数后,IMKit 会打开回应详情弹层:

  • 顶部按回应类型展示 tab。
  • 默认选中用户点击的回应。
  • 下方分页展示添加该回应的用户列表。
  • 用户列表中显示用户头像、名称和回应时间。

用户列表会按需分页加载更多数据,分页能力来自 IMLib 的 getMessageReactionUsers 接口。

拦截回应事件

可以通过 setOnMessageReactionClickListener 拦截 IMKit 默认交互,或自定义错误处理。回调返回 true 表示应用已处理该事件,IMKit 不再执行默认逻辑。返回 false 表示继续执行 IMKit 默认逻辑。

Java
RongConfigCenter.featureConfig()
.setOnMessageReactionClickListener(
new OnMessageReactionClickListener() {
@Override
public boolean onMessageReactionClicked(
MessageReaction reaction, UiMessage message) {
// 返回 true 表示已处理,IMKit 不再执行默认添加或移除逻辑。
return false;
}

@Override
public boolean onMessageReactionDetailClicked(
MessageReaction reaction, UiMessage message) {
// 返回 true 表示已处理,IMKit 不再展示默认详情页。
return false;
}

@Override
public boolean onMessageReactionUserClicked(
MessageReactionUser user,
UiMessage message,
MessageReaction reaction) {
// 返回 true 表示已处理。IMKit 默认无额外动作。
return false;
}

@Override
public boolean onMessageReactionClickError(
IRongCoreEnum.CoreErrorCode errorCode,
UiMessage message,
String reactionId) {
// 返回 true 表示已处理错误,IMKit 不再展示默认错误提示。
return false;
}
});

各回调说明如下:

回调触发时机
onMessageReactionClicked用户点击消息下方已有回应项中的 emoji 区域时触发。
onMessageReactionDetailClicked用户点击回应人数文本或 DETAIL 模式中的 ...N人 文本时触发。
onMessageReactionUserClicked用户点击回应详情中的用户时触发。
onMessageReactionClickError添加或移除回应失败时触发。返回 false 时,IMKit 会展示默认错误提示。

与 IMLib 数据的关系

IMKit 会在消息列表加载时,根据 Message.isHasReactions() 批量查询可见消息的回应摘要。即使 isHasReactions()true,如果 IMLib 摘要查询返回空结果,IMKit 也会隐藏该消息的回应区域。

相关文档