接收消息
您可通过设置消息监听器拦截 SDK 接收的消息,并进行相应的业务操作。
监听消息接收
您可以通过 setMessageReceivedListener 方法设置消息接收监听器。所有接收到的消息都会在 setMessageReceivedListener 监听器的方法中回调,您可以接收实时消息或离线消息。
提示
- 您需要将代理设置的时机放在调用 IMLib SDK 连接接口之前,初始化 IMLib SDK 之后,保证与融云服务端建立 IM 连接后的第一时间获取到离线的消息。
- 建议将代理设置给单例对象,保证整个 App 生命周期内代理的设置都是有效的。
接口原型
TypeScript
public setMessageReceivedListener(listener: (message: Message, info: ReceivedInfo) => void): void
参数说明
Message 类中封装了 ReceivedStatus,使用了以下状态表示接收到的消息的状态。
状态 | 描述 |
---|---|
isRead() | 是否已读。如果消息在当前设备上被阅读,该状态会变为已读。SDK 5.6.8 版本开始,只要在其他设备上阅读过该消息,当前设备的该状态值会也变为已读。 |
ReceivedInfo 中封装了当前与接收消息相关的数据: |
ReceivedInfo
中的left
为当前正在解析的消息包(Package)中还剩余的消息条数。ReceivedInfo
中的hasPackage
表示当前是否在服务 端还存在未下发的消息包(Package)。ReceivedInfo
中的isOffline
表示当前消息是否为离线消息。
同时满足以下条件,表示离线消息已收取完毕:
hasPackage
为false
:表示当前正在解析最后一包消息。left
为 0:表示最后一个消息包中最后一条消息已接收完毕
当客户端连接成功后,服务端会将所有离线消息?以消息包(Package)的形式下发给客户端,每个 Package 中最多含 200 条消息。客户端会解析 Package 中的消息,逐条上抛并通知应用。
示例代码
TypeScript
IMEngine.getInstance().setMessageReceivedListener((message: Message, info: ReceivedInfo) => {
});
为什么接收消息可能出现消息重复
发送端处于弱网情况下可能出现该问题。A 向 B 发送消息后,消息成功到达服务端,并成功下发到接收者 B。但 A 由于网络等原因可能未收到服务端返回的 ack,导致 A 认为没有发送成功。此时如果 A 重发消息,此时 B 就会收到与之前重复的消息(消息内容相同,但 MessageUId 不同)。