会话列表

大约 8 分钟

会话列表

功能说明

  • 本地会话列表: 对于单聊、群组聊天和聊天室会话,用户收发消息时,SDK 会在本地创建或更新对应会话,并将其维护在本地会话列表缓存中。应用可从本地内存或数据库读取会话列表,用于展示会话名称、头像、最后一条消息、未读数、置顶状态和会话标记等信息。
  • 服务端与本地数据: 环信服务器和 SDK 本地均可维护会话列表数据:服务端保存当前用户的会话状态,SDK 本地缓存用于客户端快速读取和展示会话列表。完成 SDK 初始化并成功登录后,SDK 会自动维护本地会话列表;会话同步、收发消息、删除会话、清空未读数、设置或取消置顶、添加或移除会话标记等操作均可能更新本地列表。
  • 同步与变更通知: 初始化前配置 ChatOptions.dataSyncType 包含 ChatDataSyncType.Conversations 后,用户登录成功时,SDK 会自动同步服务端会话数据。当前账号的本地数据库成功打开后,即可读取已有的本地会话列表;如需本次从服务端同步的最新数据,应等待会话同步成功后再读取。本地会话新增或删除时,SDK 会通过会话列表更新事件通知应用;同一账号在其他设备上设置或取消会话置顶时,当前设备也可通过多设备事件感知该变更。

功能开通

如需将服务端会话列表同步到本地,需要在 环信控制台 开通服务端会话列表功能。

前提条件

开始前,请确保满足以下条件:

  • 已完成 SDK 初始化并成功登录,详见快速开始。本地数据接口需在当前账号的数据库打开后调用。
  • 了解环信即时通讯 IM API 的使用限制,详见 使用限制。

获取会话列表

应用应按照登录后自动同步、监听同步完成和读取本地会话列表的流程获取最新会话数据。

登录后自动同步会话列表

在调用 ChatClient#init 初始化 SDK 前,配置 ChatOptions.dataSyncType 包含 ChatDataSyncType.Conversations。用户登录成功后,SDK 会自动同步会话列表并写入本地。

async function initializeForConversations(): Promise<void> {
  try {
    const options = ChatOptions.withAppKey({
      appKey: 'your-org#your-app',
      // 登录成功后自动同步会话列表
      dataSyncType: ChatDataSyncType.Conversations,
    });
    await ChatClient.getInstance().init(options);
  } catch (error: unknown) {
    console.error('初始化 SDK 失败:', error);
  }
}

若还需要同步好友列表或已加入的群组列表,可以使用按位或组合 ChatDataSyncType.Contacts 或 ChatDataSyncType.JoinedGroups。ChatDataSyncType.None 表示关闭自动数据同步。

监听会话列表同步状态

通过 ChatConnectEventListener 监听会话列表同步状态。当 type 位掩码包含 ChatDataSyncType.Conversations 时,表示当前同步包含会话列表。建议在 SDK 初始化完成后、用户登录前注册监听器。

const client = ChatClient.getInstance();
const connectionListener: ChatConnectEventListener = {
  onConnected(): void {
    // SDK 已成功连接到 IM 服务器
  },
  onDisconnected(errorCode): void {
    // SDK 与 IM 服务器断开连接,可根据 errorCode 判断原因
  },
  onDataSyncStart(type): void {
    if ((type & ChatDataSyncType.Conversations) !== 0) {
      // 会话列表开始同步
    }
  },
  onDataSyncFinish(type, errorCode): void {
    if ((type & ChatDataSyncType.Conversations) === 0) {
      return;
    }
    if (errorCode === 0) {
      // 会话列表同步成功,可以读取本地会话列表
    } else {
      // 会话列表同步失败,根据 errorCode 处理错误
      console.error('会话列表同步失败:', errorCode);
    }
  },
};
client.addConnectionListener(connectionListener);

// 不再需要监听时移除
// client.removeConnectionListener(connectionListener);

ChatConnectEventListener#onDatabaseOpened(username, errorCode) 表示当前账号的本地数据库打开完成,errorCode 为 0 时可以读取本地缓存。该事件不表示服务端会话数据已经同步完成;需要本次登录后的最新数据时,应等待会话同步成功。

会话相关选项

初始化时,你可以在 ChatOptions 中设置以下会话相关选项:

选项描述
dataSyncType设置登录成功后自动同步的数据类型。必须在初始化 SDK 前设置。
- 包含 ChatDataSyncType.Conversations:同步会话列表。
- ChatDataSyncType.None:关闭自动数据同步。
- 未设置:沿用原生默认配置,建议显式指定。
deleteMessagesAsExitChatRoom设置主动或被动退出聊天室时是否删除该聊天室的本地消息。
- (默认)true:删除本地消息。
- false:保留本地消息。
enableEmptyConversation设置从本地数据库加载会话时是否包含空会话。必须在初始化 SDK 前设置。
- true:包含空会话。
- (默认)false:不包含空会话。

一次性获取本地所有会话

调用 ChatManager#getAllConversations 可以获取本地会话列表。该接口返回 Promise<ChatConversation[]>,不会主动向服务器请求会话列表。React Native SDK 5.0.0 在两端的返回顺序如下:

  • Android:置顶会话排在非置顶会话之前;置顶和非置顶会话内部均按照最后一条消息的时间戳倒序排列。
  • iOS:按最近一条消息的时间倒序排列,不保证置顶会话优先。
async function readAllConversations(): Promise<void> {
  try {
    // 获取本地会话列表
    const conversations = await ChatClient.getInstance().chatManager
      .getAllConversations();
    console.log('本地会话列表:', conversations);
  } catch (error: unknown) {
    console.error('读取本地会话列表失败:', error);
  }
}

获取会话名称和头像

通过只读可选属性 ChatConversation.displayName 和 ChatConversation.displayAvatar 可获取会话的显示名称和头像:

  • 单聊会话:分别为对端用户的昵称和头像。
  • 群聊会话:分别为群名称和群头像。
  • 相关用户或群组数据尚未同步时,这两个属性可能为空字符串或 undefined。
// conversation 为已获取的 ChatConversation 对象
const conversationName = conversation.displayName;
const conversationAvatar = conversation.displayAvatar;

会话列表数据更新场景

场景是否影响服务端数据是否影响本地会话列表
登录后从服务端同步会话数据并写入本地,不修改服务端会话状态否是
收发消息时,SDK 创建或更新本地会话的最后一条消息、排序和未读数视服务端配置而定是
设置或取消会话置顶,同时更新服务端和本地置顶状态
方法:ChatManager#pinConversation
是是
添加或移除服务端及本地会话标记
方法:ChatManager#addRemoteAndLocalConversationsMark / ChatManager#deleteRemoteAndLocalConversationsMark
是是
删除本地会话,由 withMessage 参数决定是否同时删除本地消息
方法:ChatManager#deleteConversation
否是
删除服务端和本地的指定会话,由 isDeleteMessage 参数决定是否删除服务端历史消息
方法:ChatManager#removeConversationFromServer
是是
清空指定会话的未读消息数并尝试同步多设备状态
方法:ChatManager#clearConversationUnreadMessageCount
同步成功时影响是
清空全部会话的未读消息数并尝试同步多设备状态
方法:ChatManager#clearAllConversationUnreadMessageCount
同步成功时影响是

监听会话列表更新

本地会话新增或删除时,SDK 会触发 ChatMessageEventListener#onConversationsUpdate。该回调不直接返回完整会话列表,应用应重新调用 ChatManager#getAllConversations 获取最新结果并刷新 UI。

const manager = ChatClient.getInstance().chatManager;
const conversationListener: ChatMessageEventListener = {
  onConversationsUpdate(): void {
    void manager.getAllConversations()
      .then((conversations) => {
        // 使用最新会话列表刷新 UI
        console.log('最新会话列表:', conversations);
      })
      .catch((error: unknown) => console.error('读取会话列表失败:', error));
  },
};
manager.addMessageListener(conversationListener);

// 不再需要监听时移除
// manager.removeMessageListener(conversationListener);

本端置顶、标记或清零未读数后,应在操作成功时按需重新查询列表;新消息、同步完成和多设备事件也可作为刷新入口,不依赖 onConversationsUpdate 覆盖所有变化。

接口最佳实践

场景推荐做法
获取最新会话列表在初始化 SDK 前显式配置 ChatDataSyncType.Conversations;在会话同步成功后读取本地数据。
展示会话列表调用 ChatManager#getAllConversations,注意 Android 和 iOS 的排序差异;需要统一顺序时在应用侧排序。
响应会话变化注册 ChatMessageEventListener;收到 ChatMessageEventListener#onConversationsUpdate 后重新读取本地会话列表并刷新 UI。
管理监听器页面或组件销毁时移除 ChatConnectEventListener 和 ChatMessageEventListener,避免重复回调和内存泄漏。
释放并恢复会话内存React Native SDK 5.0.0 未提供会话缓存清理及数据库筛选的公开接口,不使用会话删除代替内存清理。

接口列表

API 名称所属模块/类说明
withAppKeyChatOptions使用应用的 App Key 创建初始化配置。
dataSyncTypeChatOptions设置登录成功后自动同步的数据类型。
enableEmptyConversationChatOptions设置从本地数据库加载会话时是否包含空会话。
deleteMessagesAsExitChatRoomChatOptions设置退出聊天室时是否删除该聊天室的本地消息。
initChatClient使用指定配置初始化 React Native SDK。
getAllConversationsChatManager获取本地会话列表。
displayName / displayAvatarChatConversation单聊或群聊会话的显示名称和头像。
pinConversationChatManager设置或取消会话置顶。
addRemoteAndLocalConversationsMark / deleteRemoteAndLocalConversationsMarkChatManager添加或移除会话标记。
deleteConversationChatManager删除本地会话,并按参数决定是否删除本地消息。
removeConversationFromServerChatManager删除服务端和本地的指定会话。
clearConversationUnreadMessageCountChatManager清空指定会话的未读消息数。
clearAllConversationUnreadMessageCountChatManager清空全部会话的未读消息数。
onConversationsUpdateChatMessageEventListener监听本地会话新增或删除。
上次编辑于: