未读消息相关功能的实现

概述

未读消息功能是指在用户离线、或未打开聊天界面时,该用户收到了来自其他用户或群组的消息,需要在用户下次打开聊天列表界面显示每个会话的未读聊天数或未读标记(小红点),如下图所示:

未读消息

RTM提供了两类接口支持未读消息相关功能,分别为:“获取未读消息数” 和 “获取未读聊天会话”

获取未读消息数

P2P和群组消息,可以获取未读消息数,各SDK中提供了getP2PUnread/getGroupUnread接口,主要参数解释如下:

输入参数(不同语言SDK中名字可能存在区别):

参数 要求 类型 描述
userIds/groupIds 必须 Set<Int64.> 要获取哪些群组/用户的未读消息数
startTime 可选 Int64 开始计算毫秒时间戳,可理解为上次读消息的时间,将返回这个时间点后的消息数,如果不传该参数则默认使用用户上次离线时间
mtypes 可选 Set <Int8.> 筛选哪些消息类型,如果不传该参数,则只返回聊天的未读消息数

返回结果(不同语言SDK中名字可能存在区别):

参数 类型 描述
unreadDictionary Dictionary<Int64, int> userId或groupId对应的未读消息数字典
lastTimeDictionary Dictionary<Int64, int> userId或groupId对应的每个session的最新一条消息毫秒时间戳
注意获取未读消息数接口基于保存的历史消息记录实现,未保存历史记录的消息无法获取未读消息数目。

客户端如何实现未读消息数功能

客户端可通过调用RTM的“获取未读消息数”接口,配合客户端自己的持久化数据,来实现每个会话的未读消息数功能,例如:

客户端可记录用户上次读消息的毫秒时间戳,当需要获取未读消息数时,传给RTM“获取未读消息数”接口(startTime参数),如果用户首次安装或客户端的记录为空,则可不传该参数,默认使用用户上次从RTM离线的时间,该接口可返回对应时间点后每个会话(包括P2P和群组)对应的消息数目和最新一条消息的毫秒时间戳,用于显示未读消息数红点,同时客户端将相关数据持久化。

当用户点击进入某个会话时,则认为该用户已经阅读了该会话的消息,则客户端将对应会话的红点数字清除,同时更新持久化数据。

获取未读会话

对于聊天消息,RTM提供了获取未读会话接口(getUnread)

输入参数:

参数 要求 类型 描述
clear 可选 Bool 获取后是否清除未读会话状态

返回结果:

参数 类型 描述
p2pList List<Int64.> 和自己有P2P未读会话的用户ID列表
groupList List<Int64.> 和自己有群组未读会话的用户ID列表

未读会话是指用户上一次退出RTM后,发给该用户的聊天,将产生未读会话,该接口只返回哪些用户/群组对该用户产生了未读会话,不返回具体未读消息的数目,仅用于显示会话的未读红点状态。

注意 请不要混合使用“获取未读消息数”和“获取未读会话”两类接口,因为二者实现方式不同:

  • “获取未读消息数” 是以用户传入的时间戳为起始时间,将之后产生的消息均认为是未读消息,将未读消息数返回给调用方。
  • “获取未读会话” 严格以用户上次退出的时间为基准,仅返回在离线期间哪些会话与该用户产生过未读,当用户产生多次登录和退出行为后(包括断线重连),未读会话列表可能会发送变化。