IM 即时通讯
Windows/macOS
产品介绍
简介
主要功能
产品优势
海外数据中心
IM平滑迁移方案
接口及业务限制
功能介绍
帐号集成与登录
基础消息功能
群组功能
聊天室功能
聊天室标签功能
圈组功能
多端登录与互踢策略
质量数据监控台
更新日志
Demo 更新日志
NIM SDK 更新日志
快速开始
实现单聊消息收发(不含 UI)
实现圈组消息收发(不含 UI)
开发指南
概要介绍
集成方式(当前版本)
集成方式(Windows旧版本)
集成方式(macOS旧版本)
初始化
登录登出
消息收发
最近会话
历史记录
用户资料托管
好友关系托管
事件订阅
系统通知
系统通知概述
内置系统通知管理
内置系统通知未读数
自定义系统通知收发
群组功能
群组概述
群组管理
群成员管理
群消息管理
超大群功能
开通聊天室功能
聊天室
圈组功能
初始化
登录圈组
圈组服务器管理
圈组服务器成员管理
游客功能
频道相关
频道管理
频道分组
频道分组黑白名单
频道未读数管理
搜索服务器和频道
身份组相关
身份组概述
身份组应用场景
服务器身份组
频道身份组
频道分组身份组
频道用户定制权限
自定义权限项
成员权限判定
身份组相关查询
圈组订阅机制
圈组消息相关
圈组消息收发
圈组消息撤回
圈组消息更新
圈组消息删除
会话消息回复(Thread)
圈组快捷评论
获取频道最后一条消息
消息正在输入
圈组消息搜索
圈组消息查询
查询@我的消息
服务器未读数
圈组系统通知
圈组系统通知概述
圈组系统通知收发
圈组系统通知更新
圈组各端接口命名差异
语音录制与播放
NOS云存储服务
文档转换
API 参考
Windows/macOS API 参考
状态码
IM 控制台指南
创建应用
注册 IM 账号
升级服务
配置应用客户端标识
参考文档
升级指引
开发示例
UI库指南
Demo源码导读
打包发布
类与常量定义说明
常见问题
FAQ
服务协议

服务器未读数

更新时间: 2022/12/27 17:43:04

圈组服务器未读数,指圈组服务器下所有频道的消息总未读数。网易云信 NIM SDK 的NIMQChatServerUnreadInfo结构体定义了圈组服务器未读数信息。您可注册RegUnreadCb回调方法,监听NIMQChatServerUnreadInfo的变更,从而获取服务器未读数。

本文介绍获取服务器未读数的实现方法以及相应的示例代码。

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

实现方法

本文以用户A 与其他用户在同一圈组服务器下的消息交互为例,介绍获取服务器未读数的实现方法。

uml diagram

前提条件

  • 登录圈组,并已创建圈组服务器和频道。
  • 用户A 和其他用户,均已加入圈组服务器。

实现流程

  1. 用户A 注册RegUnreadCb,监听NIMQChatServerUnreadInfo的变更。

    示例代码如下:

    QChatServerRegUnreadCbParam reg_unread_cb_param;
    reg_unread_cb_param.cb = [this](const QChatServerUnreadResp& resp) {
        if (resp.res_code != NIMResCode::kNIMResSuccess) {
            // error handling
            return;
        }
        // process response
        // ...
    };
    Server::RegUnreadCb(reg_unread_cb_param);
    
  2. 根据实际业务情况,按如下方法订阅服务器下所有频道的未读数,获取并缓存各频道的初始未读数。

    • 如果服务器下的频道数量不超过 200,则用户A 可调用SubscribeAllChannel方法一次性订阅服务器下的所有频道,调用时将订阅类型NIMQChatSubscribeType 设置为未读数kNIMQChatSubscribeTypeUnreadCount )。需要注意的是,单次调用最多可传入 10 个服务器 ID。
    • 如果服务器下的频道数量超过 200,则用户A 调用Subscribe方法订阅服务器下的所有频道,调用时将订阅类型NIMQChatSubscribeType 设置为未读数kNIMQChatSubscribeTypeUnreadCount )。需要注意的是,单次调用最多可订阅 100 个频道。
    • 通过SubscribeAllChannel方法订阅频道,单次调用可传入的服务器 ID 数量上限为 10 个。即使多次调用,单个服务器下最多仅能订阅 200 个 频道。如果目标服务器下频道数量大于 200,需改用Subscribe方法订阅服务器下所有频道(单次调用最多可订阅 100 个频道)。
    • 获取服务器的精确未读数,必须订阅服务器下的所有频道的未读数。
    • 调用SubscribeAllChannel方法的示例代码如下:
    QChatServerSubscribeAllChannelParam param;
    param.sub_type = kNIMQChatSubscribeTypeMsg;
    param.server_ids = {123, 456};
    param.cb = [this](const QChatServerSubscribeAllChannelResp& resp) {
        if (resp.res_code != NIMResCode::kNIMResSuccess) {
            // error handling
            return;
        }
        // process response
        // ...
    };
    Server::SubscribeAllChannel(param);
    

    -调用Subscribe方法的示例代码如下:

    QChatChannelSubscribeParam param;
    param.ope_type = kNIMQChatSubscribeOpeTypeSubscribe;
    param.sub_type = kNIMQChatSubscribeTypeMsg;
    NIMQChatChannelIDInfo id_info;
    id_info.server_id = 123456;
    id_info.channel_id = 123456;
    param.id_infos.push_back(id_info);
    param.cb = [this](const QChatChannelSubscribeResp& resp) {
        if (resp.res_code != NIMResCode::kNIMResSuccess) {
            // error handling
            return;
        }
        // process response
        // ...
    };
    Channel::Subscribe(param);
    
  3. 其他用户发送或删除消息后,SDK 对服务器下所有已订阅频道的未读数进行累加计算。

    未读数累加规则如下:

    • 接到新消息,某个频道未读数 +1 时:
      • 如果累加未读数达到未读数上限(max_unread_count),则触发ServerUnreadCallback回调函数,给出max_unread_count
      • 如果累加未读数没有达到max_unread_count,则触发ServerUnreadCallback回调函数,给出累加未读数。
    • 消息被删除,某个频道未读数 - 1 时:
      • 如果累加未读数达到max_unread_count,则触发ServerUnreadCallback回调函数,给出max_unread_count
      • 如果累加未读数没有达到max_unread_count,则触发ServerUnreadCallback回调函数,给出累加未读数。
  4. SDK 计算完累加未读数(QChatServerUnreadInfo)后,将其返回给用户A。

    • SDK 对ServerUnreadCallback回调函数的触发做了节流处理,100ms 内默认最多只能触发一次。您接收到该事件后可以直接渲染视图。
    • 服务器累加未读数在达到max_unread_count后,ServerUnreadCallback回调函数仍会触发,但服务器未读数不再继续累加。
  5. 如果需要清空服务器未读数,可调用MarkRead方法进行清空。

    QChatServerMarkReadParam param;
    param.sub_type = kNIMQChatSubscribeTypeMsg;
    param.server_ids = {123, 456};
    param.cb = [this](const QChatServerSubscribeAllChannelResp& resp) {
        if (resp.res_code != NIMResCode::kNIMResSuccess) {
            // error handling
            return;
        }
        // process response
        // ...
    };
    Server::SubscribeAllChannel(param);
    

API参考

API
说明
SubscribeAllChannel 一次性订阅服务器下最多 200 个频道,可按不同的订阅策略对频道相关事件和系统通知进行订阅。单次调用可传入的服务器 ID 数量上限为 10 个。即使多次调用,单个服务器下最多仅能订阅 200 个 频道
Subscribe 订阅服务器下的频道,单次调用最多可订阅 100 个频道
RegUnreadCb 注册/注销服务器未读数变更回调
MarkRead 将服务器的未读数清空,即清空服务器下所有频道的消息未读数
此文档是否对你有帮助?
有帮助
我要吐槽
  • 实现方法
  • 前提条件
  • 实现流程
  • API参考