跳到主要内容

消息回应

消息回应(Message Reaction)允许用户对一条已发送成功的消息添加或移除回应,并查询回应摘要、回应列表和回应用户列表。IMLib SDK 从 5.42.0 开始提供消息回应数据接口。你可以基于这些接口实现自定义 UI,也可以直接使用 IMKit 内置的消息回应 UI

提示
  • 消息回应 API 仅在 RongCoreClient 中提供,RongIMClient 不提供透传接口。
  • 添加或移除回应需要使用消息的 messageUId。发送中、发送失败、取消发送或本地尚未生成 messageUId 的消息不能添加回应。
  • reactionId 是回应标识。跨端使用时,请确保 Android、iOS、Web 对同一种回应使用同一个 reactionId

功能概览

能力API
添加消息回应addMessageReaction
移除消息回应removeMessageReaction
批量查询消息回应摘要batchGetMessageReactionSummaries
分页查询一条消息上的回应列表getMessageReactions
分页查询指定回应的用户列表getMessageReactionUsers
监听消息回应变更addMessageReactionListener / removeMessageReactionListener

添加回应

调用 addMessageReaction 为指定消息添加一个回应。同一个用户不能对同一条消息重复添加同一个 reactionId

一条消息最多支持添加 50 个回应信息。超过上限时,接口返回错误码。

接口

Java
RongCoreClient.getInstance().addMessageReaction(param, callback);

参数说明

参数类型说明
paramUpdateMessageReactionParam添加回应参数,包含 messageUIdreactionId 和可选推送配置。
callbackIRongCoreCallback.OperationCallback操作回调。

UpdateMessageReactionParam 属性说明:

属性类型说明
messageUIdString消息唯一 ID。
reactionIdString回应 ID。建议使用 emoji Unicode 字符,例如 👍。跨端自定义时需保证 Android、iOS、Web 使用同一标识。
pushConfigMessagePushConfig可选,回应操作相关推送配置。需要向消息发送者发送推送时配置。

示例代码

Java
UpdateMessageReactionParam param =
new UpdateMessageReactionParam(message.getUId(), "👍");

RongCoreClient.getInstance()
.addMessageReaction(
param,
new IRongCoreCallback.OperationCallback() {
@Override
public void onSuccess() {
// 添加成功。
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode errorCode) {
// 添加失败。可根据错误码处理重复添加、超出上限等情况。
}
});

移除回应

调用 removeMessageReaction 移除当前用户已添加的回应。参数与 addMessageReaction 一致,reactionId 需要与添加时使用的回应 ID 相同。

接口

Java
RongCoreClient.getInstance().removeMessageReaction(param, callback);

示例代码

Java
UpdateMessageReactionParam param =
new UpdateMessageReactionParam(message.getUId(), "👍");

RongCoreClient.getInstance()
.removeMessageReaction(
param,
new IRongCoreCallback.OperationCallback() {
@Override
public void onSuccess() {
// 移除成功。
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode errorCode) {
// 移除失败,例如当前用户未添加过该回应。
}
});

批量查询回应摘要

调用 batchGetMessageReactionSummaries 批量查询同一会话中多条消息的回应摘要。该接口适合在消息列表加载后批量补齐回应展示数据。

接口

Java
RongCoreClient.getInstance().batchGetMessageReactionSummaries(param, callback);

参数说明

参数类型说明
paramMessageReactionSummaryQueryParam摘要查询参数。
callbackIRongCoreCallback.ResultCallback<Map<String, List<MessageReaction>>>查询结果回调。返回值的 key 为 messageUId,value 为该消息的回应摘要列表。

MessageReactionSummaryQueryParam 属性说明:

属性类型说明
conversationIdentifierConversationIdentifier会话标识。messageUIds 中的消息必须属于该会话。
messageUIdsList<String>消息 UID 列表,单次 1 到 100 条。

MessageReaction 摘要对象属性说明:

属性类型说明
messageUIdString消息唯一 ID。
reactionIdString回应 ID。
hasCurrentUserReactedboolean当前用户是否已添加该回应。
usersList<MessageReactionUser>摘要中携带的部分回应用户。需要完整用户列表时,调用 getMessageReactionUsers 分页查询。
totalCountint该回应的总人数。
reactionTimelong回应时间,单位为毫秒。

示例代码

Java
ConversationIdentifier identifier =
ConversationIdentifier.obtain(
Conversation.ConversationType.PRIVATE, targetId, "");
List<String> messageUIds = Arrays.asList(messageUId1, messageUId2);

MessageReactionSummaryQueryParam param =
new MessageReactionSummaryQueryParam(identifier, messageUIds);

RongCoreClient.getInstance()
.batchGetMessageReactionSummaries(
param,
new IRongCoreCallback.ResultCallback<
Map<String, List<MessageReaction>>>() {
@Override
public void onSuccess(Map<String, List<MessageReaction>> result) {
List<MessageReaction> reactions = result.get(messageUId1);
// 使用摘要数据刷新消息 UI。
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode errorCode) {
// 查询失败。
}
});

如果某条消息没有回应,返回的 Map 中可能不包含该消息的 messageUId,或对应列表为空。应用展示时应按“无回应”处理。

分页查询回应列表

调用 getMessageReactions 分页查询一条消息上的所有回应类型。每页最多查询 50 条。

接口

Java
RongCoreClient.getInstance().getMessageReactions(param, callback);

参数说明

参数类型说明
paramGetMessageReactionsParam分页查询参数。
callbackIRongCoreCallback.PageResultCallback<MessageReaction>分页结果回调。

GetMessageReactionsParam 属性说明:

属性类型说明
messageUIdString消息唯一 ID。
countint每页条数,取值范围 1 到 50。
pageTokenString翻页标识。首次查询不传;查询下一页时使用上一次返回的 pageToken。返回的 pageToken 为空时,表示没有更多数据。

示例代码

Java
GetMessageReactionsParam param = new GetMessageReactionsParam(messageUId, 50);

RongCoreClient.getInstance()
.getMessageReactions(
param,
new IRongCoreCallback.PageResultCallback<MessageReaction>() {
@Override
public void onSuccess(PagingQueryResult<MessageReaction> result) {
List<MessageReaction> reactions = result.getData();
String nextPageToken = result.getPageToken();
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode errorCode) {
// 查询失败。
}
});

分页查询回应用户

调用 getMessageReactionUsers 查询某条消息中添加了指定回应的用户列表。每页最多查询 50 条。

接口

Java
RongCoreClient.getInstance().getMessageReactionUsers(param, callback);

参数说明

参数类型说明
paramGetMessageReactionUsersParam分页查询参数。
callbackIRongCoreCallback.PageResultCallback<MessageReactionUser>分页结果回调。

GetMessageReactionUsersParam 属性说明:

属性类型说明
messageUIdString消息唯一 ID。
reactionIdString要查询用户列表的回应 ID。
countint每页条数,取值范围 1 到 50。
pageTokenString翻页标识。首次查询不传;查询下一页时使用上一次返回的 pageToken。返回的 pageToken 为空时,表示没有更多数据。

MessageReactionUser 属性说明:

属性类型说明
userIdString添加回应的用户 ID。
reactionTimelong该用户添加回应的时间,单位为毫秒。

示例代码

Java
GetMessageReactionUsersParam param =
new GetMessageReactionUsersParam(messageUId, "👍", 50);

RongCoreClient.getInstance()
.getMessageReactionUsers(
param,
new IRongCoreCallback.PageResultCallback<MessageReactionUser>() {
@Override
public void onSuccess(PagingQueryResult<MessageReactionUser> result) {
List<MessageReactionUser> users = result.getData();
int totalCount = result.getTotalCount();
String nextPageToken = result.getPageToken();
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode errorCode) {
// 查询失败。
}
});

监听回应变更

可以通过 addMessageReactionListener 监听当前用户或其他用户触发的回应变更。建议在应用生命周期内按需注册,并在不再需要时移除监听,避免内存泄露。

接口

Java
boolean added = RongCoreClient.getInstance().addMessageReactionListener(listener);
RongCoreClient.getInstance().removeMessageReactionListener(listener);

addMessageReactionListener 添加成功返回 true。如果 listenernull 或已注册过,返回 false

示例代码

Java
IRongCoreListener.MessageReactionListener reactionListener =
new IRongCoreListener.MessageReactionListener() {
@Override
public void onMessageReactionChanged(
List<MessageReactionEventData> reactions) {
for (MessageReactionEventData eventData : reactions) {
if (eventData.getOperationType()
== MessageReactionOperationType.CLEARED) {
// reactionId 可能为空。按 messageUId 清空该消息的全部回应。
continue;
}

if (eventData.getOperationType()
== MessageReactionOperationType.ADDED) {
// 有用户添加了回应。
} else if (eventData.getOperationType()
== MessageReactionOperationType.REMOVED) {
// 有用户移除了回应。
}
}
}
};

boolean added =
RongCoreClient.getInstance().addMessageReactionListener(reactionListener);

// 不再需要监听时移除。
RongCoreClient.getInstance().removeMessageReactionListener(reactionListener);

MessageReactionEventData 属性说明:

属性类型说明
conversationIdentifierConversationIdentifier事件所属会话。
messageUIdString发生变更的消息 UID。
reactionIdString回应 ID。事件类型为 CLEARED 且清空整条消息全部回应时,该值可能为空。
operationTypeMessageReactionOperationType操作类型:ADDEDREMOVEDCLEARED
usersList<MessageReactionUser>本次变更相关用户。
totalCountint该回应当前总人数。CLEARED 时为 0。

hasReactions 字段

Message 从 5.42.0 开始新增 isHasReactions() 字段,用于标识该消息是否存在回应。该字段由协议栈维护,应用通常只需要读取。

Java
if (message.isHasReactions()) {
// 可按需调用 batchGetMessageReactionSummaries 查询真实摘要数据。
}

请注意:

  • hasReactions 是摘要查询的提示字段,不等同于完整回应列表。
  • 添加回应成功后,协议栈会将该字段更新为 true
  • 移除单个回应时,即使移除的是最后一个本地可见回应,也不会立即推断为 false,因为本地数据可能不完整。
  • 只有收到服务端清空通知后,协议栈才会将该字段更新为 false
  • 如果 isHasReactions()true,但 batchGetMessageReactionSummaries 返回空结果,应用展示时应按“无可见回应”处理。

状态码

消息回应接口失败时,会通过对应接口的 onError 回调返回 IRongCoreEnum.CoreErrorCode。参数校验、回应数量超限、回应人数超限等状态码,请参考 SDK 状态码。一条消息的回应信息超过 50 个时,会返回回应数量超限相关状态码。