消息回应
消息回应(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 个回应信息。超过上限时,接口返回错误码。
接口
RongCoreClient.getInstance().addMessageReaction(param, callback);
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
param | UpdateMessageReactionParam | 添加回应参数,包含 messageUId、reactionId 和可选推送配置。 |
callback | IRongCoreCallback.OperationCallback | 操作回调。 |
UpdateMessageReactionParam 属性说明:
| 属性 | 类型 | 说明 |
|---|---|---|
messageUId | String | 消息唯一 ID。 |
reactionId | String | 回应 ID。建议使用 emoji Unicode 字符,例如 👍。跨端自定义时需保证 Android、iOS、Web 使用同一标识。 |
pushConfig | MessagePushConfig | 可选,回应操作相关推送配置。需要向消息发送者发送推送时配置。 |
示例代码
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 相同。
接口
RongCoreClient.getInstance().removeMessageReaction(param, callback);
示例代码
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 批量查询同一会话中多条消息的回应摘要。该接口适合在消息列表加载后批量补齐回应展示数据。
接口
RongCoreClient.getInstance().batchGetMessageReactionSummaries(param, callback);
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
param | MessageReactionSummaryQueryParam | 摘要查询参数。 |
callback | IRongCoreCallback.ResultCallback<Map<String, List<MessageReaction>>> | 查询结果回 调。返回值的 key 为 messageUId,value 为该消息的回应摘要列表。 |
MessageReactionSummaryQueryParam 属性说明:
| 属性 | 类型 | 说明 |
|---|---|---|
conversationIdentifier | ConversationIdentifier | 会话标识。messageUIds 中的消息必须属于该会话。 |
messageUIds | List<String> | 消息 UID 列表,单次 1 到 100 条。 |
MessageReaction 摘要对象属性说明:
| 属性 | 类型 | 说明 |
|---|---|---|
messageUId | String | 消息唯一 ID。 |
reactionId | String | 回应 ID。 |
hasCurrentUserReacted | boolean | 当前用户是否已添加该回应。 |
users | List<MessageReactionUser> | 摘要中携带的部分回应用户。需要完整用户列表时,调用 getMessageReactionUsers 分页查询。 |
totalCount | int | 该回应的总人数。 |
reactionTime | long | 回应时间,单位为毫秒。 |
示例代码
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 条。
接口
RongCoreClient.getInstance().getMessageReactions(param, callback);
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
param | GetMessageReactionsParam | 分页查询参数。 |
callback | IRongCoreCallback.PageResultCallback<MessageReaction> | 分页结果回调。 |
GetMessageReactionsParam 属性说明:
| 属性 | 类型 | 说明 |
|---|---|---|
messageUId | String | 消息唯一 ID。 |
count | int | 每页条数,取值范围 1 到 50。 |
pageToken | String | 翻页标识。首次查询不传;查询下一页时使用上一次返回的 pageToken。返回的 pageToken 为空时,表示没有更多数据。 |
示例代码
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 条。
接口
RongCoreClient.getInstance().getMessageReactionUsers(param, callback);
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
param | GetMessageReactionUsersParam | 分页查询参数。 |
callback | IRongCoreCallback.PageResultCallback<MessageReactionUser> | 分页结果回调。 |
GetMessageReactionUsersParam 属性说明:
| 属性 | 类型 | 说明 |
|---|---|---|
messageUId | String | 消息唯一 ID。 |
reactionId | String | 要查询用户列表的回应 ID。 |
count | int | 每页条数,取值范围 1 到 50。 |
pageToken | String | 翻页标识。首次查询不传;查询下一页时使用上一次返回的 pageToken。返回的 pageToken 为空时,表示没有更多数据。 |
MessageReactionUser 属性说明:
| 属性 | 类型 | 说明 |
|---|---|---|
userId | String | 添加回应的用户 ID。 |
reactionTime | long | 该用户添加回应的时间,单位为毫秒。 |
示例代码
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 监听当前用户或其他用户触发的回应变更。建议在应用生命周期内按需注册,并在不再需要时移除监听,避免内存泄露。
接口
boolean added = RongCoreClient.getInstance().addMessageReactionListener(listener);
RongCoreClient.getInstance().removeMessageReactionListener(listener);
addMessageReactionListener 添加成功返回 true。如果 listener 为 null 或已注册过,返回 false。
示例代码
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 属性说明:
| 属性 | 类型 | 说明 |
|---|---|---|
conversationIdentifier | ConversationIdentifier | 事件所属会话。 |
messageUId | String | 发生变更的消息 UID。 |
reactionId | String | 回应 ID。事件类型为 CLEARED 且清空整条消息全部回应时,该值可能为空。 |
operationType | MessageReactionOperationType | 操作类型:ADDED、REMOVED、CLEARED。 |
users | List<MessageReactionUser> | 本次变更相关用户。 |
totalCount | int | 该回应当前总人数。CLEARED 时为 0。 |
hasReactions 字段
Message 从 5.42.0 开始新增 isHasReactions() 字段,用于标识该消息是否存在回应。该字段由协议栈维护,应用通常只需要读取。
if (message.isHasReactions()) {
// 可按需调用 batchGetMessageReactionSummaries 查询真实摘要数据。
}
请注意:
hasReactions是摘要查询的提示字段,不等同于完整回应列表。- 添加回应成功后,协议栈会将该字段更新为
true。 - 移除单个回应时,即使移除的是最后一个本地可见回应,也不会立即推断为
false,因为本地数据可能不完整。 - 只有收到服务端清空通知后,协议栈才会将该字段更新为
false。 - 如果
isHasReactions()为true,但batchGetMessageReactionSummaries返回空结果,应用展示时应按“无可见回应”处理。
状态码
消息回应接口失败时,会通过对应接口的 onError 回调返回 IRongCoreEnum.CoreErrorCode。参数校验、回应数量超限、回应人数超限等状态码,请参考 SDK 状态码。一条消息的回应信息超过 50 个时,会返回回应数量超限相关状态码。