IM 即时通讯(增强版)
Web
动态与公告
IM UIKit 更新日志
NIM SDK 更新日志
新手接入指南
产品介绍
简介
产品优势
主要功能
功能介绍
账号集成与登录
基础消息功能
群组功能
聊天室功能
圈组功能
多端登录与互踢策略
海外数据中心
IM 平滑迁移方案
接口及业务限制
体验 Demo
下载 SDK 与 Demo 源码
快速开始
跑通 IM Demo 源码
实现单聊消息收发(不含 UI)
实现聊天室登录(不含 UI)
实现圈组消息收发(不含 UI)
含 UI 集成
什么是 IM UIKit
IM UIKit 功能列表
快速集成 IM UIKit
非React框架快速集成
非React框架集成 IM UIKit
非 React 框架自定义示渲染
组件导入
初始化
全局上下文
登录相关
会话列表相关
集成会话列表界面
自定义会话列表界面 UI
会话消息相关
集成会话界面
实现自定义消息收发
自定义会话界面 UI
用户资料相关
集成用户资料组件
通讯录相关
集成通讯录界面
自定义通讯录界面 UI
搜素组件相关
集成搜索组件
自定义搜索组件 UI
主题样式设置
语言设置
初始化(兼容 NIM SDK)
常见问题
如何解决样式冲突
不含 UI 集成
集成 SDK
IM 登录与初始化相关
初始化并登录 IM
注销登录与销毁实例
多端登录与互踢
消息收发
历史消息
消息扩展
最近会话
服务端会话服务
用户资料托管
好友关系托管
在线状态订阅
系统通知
群组功能
群组概述
群组管理
群成员管理
群消息管理
超大群功能
超大群概述
超大群管理
超大群成员管理
超大群消息管理
反垃圾
聊天室功能
聊天室概述
聊天室初始化与登录相关
初始化并登录聊天室
注销登录与销毁实例
聊天室标签功能
聊天室消息管理
聊天室成员管理
聊天室信息管理
聊天室队列服务
圈组功能
圈组概述
初始化与登录
通用接口校验说明
服务器相关
服务器概述
服务器管理
服务器成员管理
游客功能
服务器未读数管理
频道相关
频道概述
频道管理
频道黑白名单
频道分组
频道分组黑白名单
频道未读数管理
实时互动频道
搜索服务器与频道
身份组相关
身份组概述
身份组应用场景
服务器身份组
频道身份组
频道用户定制权限
频道分组身份组
自定义权限项
成员权限查询与判定
身份组相关查询
圈组订阅机制
圈组消息相关
圈组消息收发
圈组消息撤回
圈组消息更新
圈组消息删除
消息正在输入
获取频道最后一条消息
会话消息回复(Thread)
圈组快捷评论
圈组消息搜索
查询历史消息
查询@我的消息
圈组系统通知相关
圈组系统通知概述
圈组系统通知收发
圈组系统通知更新
圈组内容审核
圈组第三方回调
圈组相关抄送
圈组各端接口命名差异
融合存储方案
最佳实践
聊天室重要消息投递
API 参考
NIM SDK API 参考
状态码
IM 控制台指南
创建应用
注册 IM 账号
升级服务
服务协议

频道未读数管理

更新时间: 2023/03/14 14:15:13

如果您的应用 UI 上需要展示频道未读数,可参考本文介绍的方法/事件获取频道内的消息未读信息并管理其变化。

游客接收到的消息无已读未读逻辑。不支持对游客展示消息的未读数。

技术原理

网易云信 IM SDK 的 QCHAT_BROWSER_SDK 下的QChatChannelServiceInterface 模块提供 UnreadInfo 属性,该属性内包含未读信息相关参数,具体见下表。

参数 类型 说明
serverId string 频道所属的服务器的 ID
channelId string 频道的 ID
unreadCount number 频道内的消息未读数
mentionedCount number 频道内@消息的未读数
ackTimestamp number (可选)已读时间戳(Unix 时间戳), 该时间戳对应的消息和早于该时间戳的消息都为已读消息
maxCount number (可选)最大消息未读数
lastMsgTime number (可选)最后一条消息的时间戳 (Unix 时间戳)

您可调用多个方法获取该属性,具体方法参见本文的实现频道未读数持续监听实现频道未读数的直接获取

前提条件

已完成圈组初始化及登录

实现频道未读数持续监听

本文通过以下 UI 简图的场景为例,说明如何完成频道 1 未读数的监听、未读数的清零以及清零后的持续监听。

WebElite未读管理示例.png

步骤1: 监听未读数

您需要订阅 频道 1 的未读数才能实现监听。完成如下两个子步骤后,当有新的消息下发到频道 1 ,SDK 将触发未读数变化监听事件 unreadInfo 并上报给您。

订阅的频道仅在当前登录期间有效(因网络波动导致的断线自动重连除外)。如您调用 destroylogout 方法刷新页面或登出后,需要重新订阅。

  1. 进入服务器 1 后,调用 getChannelsByPage 方法刷新频道列表,得到频道 1频道 2频道 3频道 4

  2. 调用 subscribeChannel 方法订阅频道 1。 调用该方法时入参配置如下:

    参数 说明
    channels 频道 ID:传入您需要订阅的频道 ID,以及该频道所属的服务器的 ID。格式为 { channelId: string; serverId: string }[]
    opeType 操作类型:传入 1 订阅指定的频道。
    type 订阅类型:传入 2 订阅频道的未读数。

    入参配置示例代码如下:

    {
      "type": 2,
      "opeType": 1,
      "channels": [
        {
          "serverId": "1426749",
          "channelId": "1344541"
        },
        {
          "serverId": "1426749",
          "channelId": "1344541"
        },
        {
          "serverId": "1426749",
          "channelId": "1344541"
        },
        {
          "serverId": "1426749",
          "channelId": "1344541"
        }
      ]
    }
    

步骤2:清除未读数

以下说明以清除频道 1 的未读数为例,介绍在完成步骤1: 监听未读数后,如何清除频道未读数以及清除后对未读数进行持续监听。

  1. 进入频道 1 后,记住您应用中“代表该频道的属性” (这里以在圈组 Web Demo 基础上的集成为例,该开发场景下该属性为 currentChannel)。

  2. 调用 markMessageRead 方法,调用时传 time 参数为已读的最新消息的时间戳(Unix 时间戳),进行未读数的清零操作。

    未读数清零时,SDK 触发 unreadInfo事件,该事件包含的未读数参数unreadCount0

    • 针对同一个频道(channelId),调用 markMessageRead 方法存在频控限制,200 ms 内只能调用一次。
    • 如果调用markMessageRead时传time参数为0,会将频道内所有消息标记为未读。

    示例代码如下:

    // mark all message unread
    await qchat.qchatMsg.markMessageRead({
      "serverId": "132305",
      "channelId": "67291",
      "time": 0
    })
    
    // mark all message read
    await qchat.qchatMsg.markMessageRead({
      "serverId": "132305",
      "channelId": "67291",
      "time": new Date().getTime()
    })
    
  3. 根据您的应用逻辑做出判断和处理:当currentChannelunreadInfo事件里的channelId相同时,每当频道 1 有新消息接收时,仍旧会触发unreadInfo事件。

实现频道未读数的直接获取

如果您不想订阅某个频道,而只想获取该频道当前的未读数,完成以下操作即可。

  1. 确保您已在当前频道中。

  2. 直接调用 getChannelUnreadInfos 查询当前频道未读信息。

    示例代码:

    const qchat = new QChat({...})
    qchat.qchatChannel.getChannelUnreadInfos({"channels": [
        {
          "serverId": "YOUR_SEVERID",
          "channelId": "YOUR_CHANNELID"
        }
      ]})
    

该方法单次最多查询频道数量为 100。

常见问题

1. 什么操作会导致频道未读数增加?

您当前所在的频道中,有用户通过qchatMsg.sendMessage发送消息或通过qchatMsg.updateMessage更新消息,对应频道中的当前用户未读信息中的未读数会增加。以下特殊情情况除外:

  • 消息发送者是自己,则未读数不变
  • 如果设置属性historyEnablefalse,即不存云端消息历史,则未读数不变。
  • 如果设置属性needBadgefalse,即不需要消息计数,则未读数不变。
  • 未订阅当前频道。

2. 什么操作会导致频道未读数减少?

您当前所在的频道中,有用户通过qchat.deleteMessage删除消息,对应频道中的当前用户未读信息中的未读数会减少。以下特殊情况除外:

  • 删除的是自己发的消息,则未读数不变。
  • 未订阅当前频道。

3. 撤回消息和重发消息是否影响未读数?

这两种操作都不影响未读数。

4. 通过markMessageRead方法标记频道消息已读,对未读数有什么影响?

如果在当前频道通过qchatMsg.markMessageRead标记消息已读,会更新对应频道的未读信息。

调用该方法时传入time参数(标记消息已读的时间戳),不仅可能减少未读数,还可能增加未读数。例如将time设为0时,会标记所有消息未读从而增加未读数。

此文档是否对你有帮助?
有帮助
我要吐槽
  • 技术原理
  • 前提条件
  • 实现频道未读数持续监听
  • 步骤1: 监听未读数
  • 步骤2:清除未读数
  • 实现频道未读数的直接获取
  • 常见问题
  • 1. 什么操作会导致频道未读数增加?
  • 2. 什么操作会导致频道未读数减少?
  • 3. 撤回消息和重发消息是否影响未读数?
  • 4. 通过markMessageRead方法标记频道消息已读,对未读数有什么影响?