跳到主要内容

版本:5.X

接收消息

App 可监听 SDK 接收到的消息,并根据业务需求执行相应操作。

建议
  • 在应用生命周期内注册消息监听。
  • 在应用生命周期结束时移除消息监听。

设置消息监听

调用 addEventListener 方法,为 SDK 消息接收事件设置监听器。所有接收到的消息将在该监听方法中回调。

示例代码

JavaScript
const Events = RongIMLib.Events
const listener = (evt) => {
console.log(evt.messages)
};
RongIMLib.addEventListener(Events.MESSAGES, listener)

在上述示例中,listener 回调函数的参数为 IMessageEvent 对象,messages 属性包含接收到的消息列表,每条消息为 IAReceivedMessage 类型。

IAReceivedMessage 参数说明

参数类型说明
messageTypestring消息类型标识(Object Name),例如 RC:TxtMsg。内置消息类型参见 消息类型概述
contentObject消息内容。以文本消息为例,格式为 { content: '文本内容' }。详见发送消息文档。
senderUserIdstring消息发送者的用户 ID
targetIdstring会话 ID(或称目标 ID),用于标识会话对端。
  1. 针对单聊会话,用对端用户的 ID 作为 Target ID,因此发送与接收的所有消息的 Target ID 一定为对端的用户 ID。请注意,本端用户所接收的消息在本地消息数据中存储的 Target ID 也不是当前用户 ID,而是对端用户(消息发送者)的用户 ID。
  2. 在群组、聊天室、超级群会话中,Target ID 为对应的群组、聊天室、超级群 ID。
  3. 针对系统会话,因客户端用户无法回复系统会话消息,因此不需要 Target ID。
channelIdstring会话的业务标识。
conversationTypeConversationType会话类型。
sentTimenumber消息在服务器端的发送时间。
receivedTimenumber消息接收时间。
messageUIdstring服务端存储的消息 ID。
messageDirectionMessageDirection消息方向: 1: 发送,2: 接收。
isPersitedboolean是否存储。
isCountedboolean是否计数。
isOffLineMessageboolean是否为离线消息。
isMentionedboolean是否为 @ 消息。
disableNotificationboolean消息是否静默。
isStatusMessageboolean是否是状态消息。
canIncludeExpansionboolean是否支持消息扩展。
expansion{ [key: string]: any }|null消息扩展。
receivedStatusReceivedStatus消息接收状态(Electron 独有字段,5.9.3 版本开始废弃,推荐使用 receivedStatusInfo)。
receivedStatusInfoIReceivedStatusInfo消息接收状态详情(Electron 独有字段,支持多种状态并存)。
pushConfigIPushConfig推送扩展(与 Android、iOS 端的 MessagePushConfig 作用相似)。
messageIdnumber消息本地 ID(Electron 独有字段)。
directedUserIdsstring[]定向消息目标用户列表, 如果该列表为空, 表示此消息不是定向消息。SDK 从 5.9.6 版本开始支持获取定向消息的目标用户列表。

移除消息监听

调用 removeEventListener 移除消息接收监听器。

示例代码

JavaScript
RongIMLib.removeEventListener(Events.MESSAGES, listener)

禁用消息排重机制(仅限 Electron)

SDK 默认启用消息排重机制,会自动去除内容重复的单聊、群聊和系统消息。在本地消息数据量较大时,排重逻辑可能引发收消息卡顿问题。若出现此类情况,可尝试关闭排重机制。

如何关闭消息排重机制

提示
  • SDK 自 5.7.1 版本起,支持关闭消息排重功能。
  • 聊天室和超级群会话类型不支持关闭排重机制。

请务必在 SDK 初始化完成、建立 IM 连接之前调用 setCheckDuplicateMessage。多次调用时,以最后一次设置为准。

接口

javascript
RongIMLib.electronExtension.setCheckDuplicateMessage(enableCheck);

参数说明

参数名类型必填说明
enableCheckBoolean是否使用融云消息重排机制。 true: 开启, false: 关闭

示例代码

javascript
const enableCheck = false;
RongIMLib.electronExtension.setCheckDuplicateMessage(enableCheck);

为什么会出现消息重复

当发送端处于弱网环境,可能导致消息重发。示例如下:

  1. 发送方 A 向服务端发送消息。
  2. 消息成功到达服务端,并下发给接收方 B。
  3. 因弱网原因,A 未收到服务端的确认回执(ack)。
  4. A 判定消息未发送成功,触发重发。
  5. B 因此会收到两条内容相同但 messageUId 不同的消息。