跳到主要内容

多端同步阅读状态

在即时通讯业务中,同一用户账号可能在多个设备上登录。仅在开通多设备消息同步服务后,融云会在多个设备之间同步消息数据,但设备上的会话中消息的已读/未读状态仅存储在本地。因此,应用程序可能希望将用户当前登录设备上指定会话的已读/未读状态同步给其他终端。

SDK 设计了多端同步单聊和群聊会话消息未读状态的机制。在一端主动调用同步消息未读状态接口 syncConversationReadStatus,其他端可通过会话状态同步监听器监听到会话中消息未读状态的最新数据。

主动同步消息未读状态

多端登录时,通知其它终端同步某个会话的消息未读状态。

  /**
* 同步会话已读状态
* ```
* 用于相同账号的多端已读同步
* 例如用户 A 同时登录鸿蒙和 Android,两端同时收到消息,同时未读数增加
* Android 调用该方法将某个会话同步已读之后, 鸿蒙会触发 setSyncConversationReadStatusListener
* ```
* @param conId 会话标识
* @param timestamp 会话中已读的最后一条消息的发送时间戳
* @returns 结果
* @version 1.2.0
*/
public syncConversationReadStatus(
conId: ConversationIdentifier,
timestamp: number,
): Promise<IAsyncResult<void>>
参数类型说明
conIdConversationIdentifier包含会话类型和会话 id
timestampnumber该会话中已读的最后一条消息的发送时间戳
let conId = new ConversationIdentifier();
conId.conversationType = ConversationType.Private;
conId.targetId = "会话 Id";

// 会话中已读的最后一条消息的发送时间戳,此处用了当前时间
let time = Date.now();

IMEngine.getInstance().syncConversationReadStatus(conId,time).then(result => {
if (EngineError.Success !== result.code) {
// 同步已读失败
return;
}
// 同步已读成功
});

监听消息未读状态同步数据

IMEngine 中提供了 SyncConversationReadStatusListener 监听器。客户端设置该监听器后,才能接收来自其他同步的阅读状态数据。

在接收到阅读状态同步数据后,会触发监听器的以下方法。SDK 会将指定会话中早于等于 syncConversationReadStatus 传入时间戳的消息均置为已读:

import { ConversationIdentifier } from '../ConversationIdentifier'

/**
* 同步会话已读状态监听
* @version 1.2.0
*/
interface SyncConversationReadStatusListener {
/**
* 会话已读
* @param conId 会话标识
* @param timestamp 已读的毫秒时间戳,该时间戳前的消息已读
* @discussion 该监听触发时,本地数据库的该会话的该时间戳之前未读已清空
*/
onSyncConversationReadStatus(conId: ConversationIdentifier, timestamp: number): void;
}

export { SyncConversationReadStatusListener }
let listener : SyncConversationReadStatusListener = {
onSyncConversationReadStatus: (conId: ConversationIdentifier, timestamp: number): void => {
// 该会话的 timestamp 之前的消息未读已清空
}
}
IMEngine.getInstance().setSyncConversationReadStatusListener(listener);
参数类型说明
conIdConversationIdentifier包含会话类型和会话 id
timestampnumber该会话中已读的最后一条消息的发送时间戳