会话标记

大约 5 分钟

会话标记

功能说明

会话标记用于为会话添加业务分类,例如标星、待处理、重要客户等。Web SDK 支持为单聊、群聊和聊天室会话添加或移除标记。单个会话最多支持添加 20 个标记,每个标记的业务含义由您自行定义和维护。

提示

会话标记只用于会话分类和筛选,不会影响会话的未读数、消息收发、置顶状态或消息已读状态。

功能开通

会话标记属于服务端会话列表功能的一部分。使用前,需要在 环信控制台 开通服务端会话列表功能。

前提条件

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

  • 完成 SDK 初始化,并连接到服务器,详见 快速开始
  • SDK 初始化时需注册 ChatManager,可以通过 client.chatManager 调用会话相关接口。
  • 已开通 服务端会话列表功能
  • 了解环信即时通讯 IM API 的使用限制,详见 使用限制

添加会话标记

你可以调用 addConversationMark 为单个或多个会话添加指定标记。

添加会话标记后,标记数据会更新到服务端,并同步更新 SDK 本地会话列表缓存。会话标记会随服务端会话列表在登录后自动同步到本地;同步完成后,可调用 client.chatManager.getConversationList() 读取本地会话列表,并通过会话对象中的 marks 字段获取该会话的全部标记。

若服务端会话列表达到数量限制,默认最多保存 100 个会话,服务端可能根据会话活跃度移除不活跃会话。对应会话被移出服务端会话列表后,该会话的标记也可能不再随服务端会话列表同步到本地。

  • 为单个会话添加标记:
const result = await client.chatManager.addConversationMark({
  conversationId: 'user2',
  conversationType: 'singleChat',
  mark: 0, // 标记编号 0-19。单个会话最多支持添加 20 个标记。
});

console.log(result.succeeded, result.failed, result.mark, result.operation);
  • 为多个会话批量添加标记:
const result = await client.chatManager.addConversationMark({
  conversations: [
    { conversationId: 'user2', conversationType: 'singleChat' },
    { conversationId: 'group1', conversationType: 'groupChat' },
  ],
  mark: 0, // 标记编号 0-19
});

console.log(result.succeeded, result.failed);

参数说明如下:

参数类型是否必需描述
conversationIdString条件必需会话 ID。单个会话操作时传入。单聊为对方用户 ID,群聊为群组 ID,聊天室为聊天室 ID。
conversationTypeString条件必需会话类型。单个会话操作时传入。取值为 singleChatgroupChatchatRoom
conversationsArray条件必需会话列表。批量操作时传入,数组不能为空。
markNumber添加的会话标记,取值范围为 019

返回结果为 ConversationMarkMutationResult,字段说明如下:

字段类型描述
succeededArray成功应用标记变更的会话列表。
failedArray未能应用标记变更的会话列表。失败项中可能包含 reason 字段。
markNumber本次操作涉及的标记槽位。
operationString标记操作类型。添加标记时为 addMark

移除会话标记

你可以调用 removeConversationMark 从单个或多个会话移除指定标记。

  • 从单个会话移除标记:
const result = await client.chatManager.removeConversationMark({
  conversationId: 'user2',
  conversationType: 'singleChat',
  mark: 0,
});

console.log(result.succeeded, result.failed, result.mark, result.operation);
  • 从多个会话批量移除标记:
const result = await client.chatManager.removeConversationMark({
  conversations: [
    { conversationId: 'user2', conversationType: 'singleChat' },
    { conversationId: 'group1', conversationType: 'groupChat' },
  ],
  mark: 0,
});

console.log(result.succeeded, result.failed);

removeConversationMark 的参数与 addConversationMark 相同。返回结果中的 operationremoveMark

按标记筛选会话列表

添加会话标记后,会话对象中的 marks 字段会包含该会话已有的标记槽位。你可以调用 getConversationList({ mark }) 从 SDK 本地会话列表缓存中筛选带有指定标记的会话。

const markedConversations = client.chatManager.getConversationList({
  mark: 0,
});

markedConversations.forEach(conversation => {
  console.log('会话 ID:', conversation.conversationId);
  console.log('会话类型:', conversation.conversationType);
  console.log('会话标记:', conversation.marks);
});

如果需要先从服务端刷新会话列表,可调用 refreshSessionList

await client.chatManager.refreshSessionList({
  includeEmpty: false,
});

const markedConversations = client.chatManager.getConversationList({
  mark: 0,
});

提示

getConversationList 读取的是 SDK 本地会话列表缓存,不会发起网络请求。该方法默认不返回最后一条消息为空的空会话。

监听会话列表更新

添加或移除会话标记后,如果本地会话列表缓存发生变化,SDK 会触发 onConversationListUpdate 事件,事件中的 reasonlocal。你可以监听该事件刷新会话列表 UI。

client.chatManager.addEventHandler('conversation-mark-listener', {
  onConversationListUpdate: payload => {
    console.log('会话列表更新原因:', payload.reason);
    console.log('当前完整会话列表:', payload.items);
    console.log('本次变化补丁:', payload.patch);
  },
});

事件回调中的 items 为 SDK 当前完整且已排序的会话列表快照;简单 UI 可直接使用该字段刷新会话列表。如果业务层需要保留自定义本地字段,可结合 patch 做增量合并。

注意事项

  • 会话标记取值范围为 019。各槽位的业务含义由你在业务层自行维护。
  • addConversationMarkremoveConversationMark 支持操作单个会话,也支持通过 conversations 批量操作多个会话。
  • 如果 mark 不是 019 之间的整数,或会话目标列表非法,SDK 会返回参数错误,错误码为 110
  • 会话标记会写入服务端,并同步更新 SDK 本地会话列表缓存;如果本地会话列表发生变化,会触发 onConversationListUpdate 事件。
  • 会话标记不影响会话未读数、消息已读状态、消息收发或会话置顶状态。
  • 若服务端会话列表达到数量限制,服务端可能根据会话活跃度移除不活跃会话;对应会话的会话标记也会随会话列表数据一起不可见。

接口列表

API所属模块/类说明
addConversationMarkChatManager为单个或多个会话添加指定标记。
removeConversationMarkChatManager从单个或多个会话移除指定标记。
getConversationListChatManager从 SDK 本地会话列表缓存读取会话列表,并支持按标记筛选。
refreshSessionListChatManager从服务端刷新会话列表,并更新 SDK 本地会话列表缓存。
上次编辑于: