会话介绍

大约 10 分钟

会话介绍

功能说明

会话是单聊、群聊或聊天室中消息列表和会话展示状态的集合,用于承载最近一条消息、未读数、置顶状态、会话标记、提醒状态以及会话展示名称和头像等信息。

SDK 会在本地维护会话列表缓存,并可在登录后自动同步服务端会话列表,或由业务主动调用接口从服务端刷新会话列表。

前提条件

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

  • 完成 SDK 初始化并连接到服务器,详见 快速开始
  • SDK 初始化时已注册 ChatManager,以便使用 client.chatManager 相关方法。
  • 若需要使用会话免打扰相关功能,SDK 初始化时还需注册 PushManager
  • 了解环信即时通讯 IM API 的使用限制,详见 使用限制

会话模型

会话类型和会话 ID

SDK 通过会话类型和会话 ID 唯一标识一个会话。不同会话类型对应的会话 ID 如下:

会话类型会话 ID说明
singleChat对方用户 ID单聊会话。
groupChat群组 ID群聊会话。
chatRoom聊天室 ID聊天室会话。

会话列表项

会话列表中的每一项为 ConversationItem,来自 SDK 本地会话列表缓存的投影数据。主要字段如下:

字段类型描述
conversationIdString会话 ID。
conversationTypeString会话类型,取值为 singleChatgroupChatchatRoom
unreadCountNumber该会话的未读消息数。
lastMessageJSON | null最近一条消息摘要。空会话中该字段为 null
lastMessageAtNumber最近一条消息的时间戳,单位为毫秒。
isPinnedBoolean会话是否置顶。
pinnedTimestampNumber会话置顶时间戳,单位为毫秒。
marksArray会话已应用的标记列表。会话标记槽位取值范围为 0 至 19,业务含义由开发者维护。
readAtNumber会话已读位置或已读时间戳。
remindTypeString会话提醒类型,取值为 DEFAULTALLATNONE
conversationNameString会话显示名称。
conversationAvatarString会话头像 URL。

提示

ConversationItem 提供会话列表展示所需的基础字段,但不等同于完整用户属性、完整群组详情或完整聊天室详情。如需展示更完整的信息,可按需调用用户属性、群组或聊天室相关接口。

会话创建与更新

通过消息创建或更新会话

当用户收发消息时,SDK 会根据消息所属会话创建或更新本地会话列表缓存:

  • 单聊消息:SDK 根据消息收发关系创建或更新单聊会话。
  • 群聊消息:SDK 根据群组 ID 创建或更新群聊会话。
  • 聊天室消息:SDK 根据聊天室 ID 创建或更新聊天室会话。

收到在线消息时,SDK 会更新会话的最近一条消息、会话排序及未读数等本地展示状态。若当前正在浏览该会话,则 SDK 仍会更新最近一条消息和会话排序,但不会累加该会话的本地未读数。详见 当前会话与未读数

通过服务端同步更新会话列表

SDK 初始化时,enableSyncData 默认包含 conversation。用户登录成功后,SDK 会自动从服务端同步会话列表,并更新本地会话列表缓存。

如需主动从服务端获取最新会话列表,可调用 refreshSessionList。该方法会触发会话列表同步流程,并返回刷新后的会话列表。

提示

若使用服务端会话列表、会话置顶和会话标记功能,需在环信控制台开通对应功能。

会话列表与空会话

SDK 提供两类会话列表读取方式:

方式方法说明
从服务端刷新refreshSessionList从服务端获取最新会话列表,并更新 SDK 本地会话列表缓存。可通过 includeEmpty 控制是否返回空会话。
从本地读取getConversationList从 SDK 本地会话列表缓存中读取当前已有的非空会话,不发起网络请求,支持按置顶状态或会话标记过滤。

空会话指没有消息或最近一条消息为空的会话。例如,当某个会话中的全部消息 过期清除撤回 后,该会话可能成为空会话。

调用 refreshSessionList 时,默认不返回空会话;如需返回空会话,可将 includeEmpty 设置为 true。登录后自动同步会话列表时,也可以通过 syncConversationListConfig.includeEmpty 配置是否同步空会话。

此外,也可以对空会话进行 置顶添加标记

提示

getConversationList 从本地会话列表缓存中读取非空会话,不返回空会话。如需获取空会话,请使用 refreshSessionList({ includeEmpty: true }) 的返回结果。

当前会话与未读数

当用户进入某个会话页面时,建议调用 setCurrentConversation 设置当前正在浏览的会话。设置后,该会话收到在线消息时,SDK 会更新最近一条消息和会话排序,但不会累加该会话的本地未读数。该状态只保存在当前 SDK 实例的内存中,用户离开或切换会话页面时,应调用 resetCurrentConversation 重置当前会话状态。

如果需要清零会话未读数,可调用以下方法:

方法说明
clearConversationUnreadMessageCount清零指定单聊或群聊会话的未读数。调用成功后,SDK 会更新当前设备上的会话列表缓存;当前用户的其他已登录设备会收到 onConversationUnreadMessageCountCleared 事件。
clearAllConversationUnreadMessageCount清零全部会话的未读数。调用成功后,SDK 会更新当前设备上的会话列表缓存;当前用户的其他已登录设备会收到 onAllConversationsUnreadMessageCountCleared 事件。

提示

会话未读数清零用于更新当前登录用户侧的会话未读状态,不会向会话对端发送消息已读回执。若需要让消息发送方感知某些消息已读,应使用 消息已读回执

会话功能列表

SDK 常用会话功能如下:

功能主要方法说明
会话列表refreshSessionListgetConversationList从服务端刷新会话列表,或从本地缓存读取非空会话列表。详见 会话列表
当前会话setCurrentConversationresetCurrentConversationgetCurrentConversation标识当前正在浏览的会话,用于控制在线消息到达时的本地未读数累加行为。
会话未读数clearConversationUnreadMessageCountclearAllConversationUnreadMessageCount清零单个或全部会话的未读数。详见 会话未读数清零
会话删除deleteConversationclearAllMessagesAndConversations删除指定会话,或清空当前用户的所有会话和服务端漫游消息。详见 删除会话
会话置顶setConversationPinned设置或取消设置会话置顶。详见 置顶会话
会话标记addConversationMarkremoveConversationMark为单个或多个会话添加或移除标记。详见 会话标记
会话免打扰PushManager 中的会话免打扰相关方法设置、查询或清除单聊和群聊会话的免打扰规则。聊天室会话不支持该功能。
会话内消息getHistoryMessagesremoveHistoryMessages获取或删除指定会话中的历史消息。详见 获取历史消息删除消息
会话内置顶消息pinMessageunpinMessagegetPinnedMessageList置顶、取消置顶或获取指定会话中的置顶消息列表,最多返回 20 条。详见 置顶消息

会话事件

会话列表事件

SDK 通过 client.chatManager.addEventHandlerclient.addEventHandler 提供会话及会话列表相关事件。

会话事件名称触发时机说明
onConversationListUpdate会话列表发生变化时触发,例如会话同步、收发消息、用户资料变化、置顶会话、标记会话、删除会话、清零未读数等。事件中的 items 为 SDK 当前完整且已排序的会话列表快照;如需保留业务本地字段,可结合 patch 做增量合并。
onSyncDataStartSDK 开始自动同步数据时触发。该事件为全局同步事件。当 payload.dataTypeconversation 时,表示会话列表同步开始。
onSyncDataFinishedSDK 自动同步数据完成时触发。该事件为全局同步事件。当 payload.dataTypeconversation 时,表示会话列表同步完成;可通过 statuserror 获取同步结果。

多设备会话事件

会话事件名称触发时机说明
onConversationUnreadMessageCountCleared当前用户在其他设备上清零单个会话未读数后,本设备收到该事件。用于多设备同步单个会话未读数清零状态,事件中包含 conversationIdconversationTypetimestamp
onAllConversationsUnreadMessageCountCleared当前用户在其他设备上清零全部会话未读数后,本设备收到该事件。用于多设备同步全部会话未读数清零状态。该事件无事件载荷。
onMultiDeviceConversation当前用户在其他设备上执行会话相关操作时触发,例如删除会话、置顶或取消置顶会话、添加会话标记、会话免打扰变更等。用于感知会话类多设备操作,事件中包含 operationconversationIdconversationType 等信息。

最佳实践

  • 展示会话列表时,建议优先监听 onConversationListUpdate,并使用事件中的 items 刷新 UI。
  • 如需主动读取当前本地会话列表,可调用 getConversationList;该方法不发起网络请求,也不返回空会话。
  • 如需从服务端刷新会话列表或获取空会话,可调用 refreshSessionList
  • 用户进入会话页面时,建议调用 setCurrentConversation;离开或切换会话页面时,调用 resetCurrentConversation
  • 会话未读数清零和消息已读回执是不同功能:前者更新当前用户侧的会话未读状态,后者用于通知消息原始发送方消息已读。
  • 通过 RESTful 接口发送的消息默认不创建或写入会话列表。如需将 RESTful 接口发送的消息写入会话列表,需在环信控制台开通对应功能。

接口列表

API所属模块/类说明
refreshSessionListChatManager从服务端刷新会话列表,并可通过配置决定是否返回空会话。
getConversationListChatManager从 SDK 本地会话列表缓存读取当前已有的非空会话。
setCurrentConversationChatManager设置当前正在浏览的会话,避免该会话后续在线消息继续累加本地未读数。
resetCurrentConversationChatManager重置当前正在浏览的会话,恢复默认未读数累加规则。
getCurrentConversationChatManager获取当前正在浏览的会话。
clearConversationUnreadMessageCountChatManager清零指定单聊或群聊会话的未读数。
clearAllConversationUnreadMessageCountChatManager清零全部会话的未读数。
deleteConversationChatManager删除指定会话。
clearAllMessagesAndConversationsChatManager清空当前用户侧的全部会话和服务端漫游消息。
setConversationPinnedChatManager设置或取消指定会话的置顶状态。
addConversationMarkChatManager为会话添加标记。
removeConversationMarkChatManager移除会话标记。
getHistoryMessagesChatManager获取指定会话中的历史消息。
removeHistoryMessagesChatManager删除指定会话中的历史消息。
pinMessageChatManager置顶会话内的指定消息。
unpinMessageChatManager取消置顶会话内的指定消息。
getPinnedMessageListChatManager获取指定会话中的置顶消息列表。
上次编辑于: