接收消息
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
参数说明
参数 | 类型 | 说明 |
---|---|---|
messageType | string | 消息类型标识(Object Name),例如 RC:TxtMsg 。内置消息类型参见 消息类型概述。 |
content | Object | 消息内容。以文本消息为例,格式为 { content: '文本内容' } 。详见发送消息文档。 |
senderUserId | string | 消息发送者的用户 ID |
targetId | string | 会话 ID(或称目标 ID),用于标识会话对端。
|
channelId | string | 会话的业务标识。 |
conversationType | ConversationType | 会话类型。 |
sentTime | number | 消息在服务器端的发送时间。 |
receivedTime | number | 消息接收时间。 |
messageUId | string | 服务端存储的消息 ID。 |
messageDirection | MessageDirection | 消息方向: 1: 发送,2: 接收。 |
isPersited | boolean | 是否存储。 |
isCounted | boolean | 是否计数。 |
isOffLineMessage | boolean | 是否为离线消息。 |
isMentioned | boolean | 是否为 @ 消息。 |
disableNotification | boolean | 消息是否静默。 |
isStatusMessage | boolean | 是否是状态消息。 |
canIncludeExpansion | boolean | 是否支持消息扩展。 |
expansion | { [key: string]: any }|null | 消息扩展。 |
receivedStatus | ReceivedStatus | 消息接收状态(Electron 独有字段,5.9.3 版本开始废弃,推荐使用 receivedStatusInfo)。 |
receivedStatusInfo | IReceivedStatusInfo | 消息接收状态详情(Electron 独有字段,支持多种状态并存)。 |
pushConfig | IPushConfig | 推送扩展(与 Android、iOS 端的 MessagePushConfig 作用相似)。 |
messageId | number | 消息本地 ID(Electron 独有字段)。 |
directedUserIds | string[] | 定向消息目标用户列表, 如果该列表为空, 表示此消息不是定向消息。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);
参数说明
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
enableCheck | Boolean | 否 | 是否使用融云消息重排机制。 true: 开启, false: 关闭 |
示例代码
javascript
const enableCheck = false;
RongIMLib.electronExtension.setCheckDuplicateMessage(enableCheck);
为什么会出现消息重复
当发送端处于弱网环境,可能导致消息重发。示例如下:
- 发送方 A 向服务端发送消息。
- 消息成功到达服务端,并下发给接收方 B。
- 因弱网原因,A 未收到服务端的确认回执(ack)。
- A 判定消息未发送成功,触发重发。
- B 因此会收到两条内容相同但 messageUId 不同的消息。