iOS

服务器未读数管理

更新时间: 2024/03/14 17:08:35

服务器未读数,指圈组服务器下所有频道的消息总未读数。网易云信 NIM SDK 的NIMQChatMessageManagerDelegate协议提供serverUnreadInfoChanged回调方法,监听圈组服务器未读数变更。用户在圈组频道内发送或删除消息后,SDK 触发回调,得到未读信息NIMQChatServerUnreadInfo

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

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

前提条件

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

使用限制

服务器未读数管理存在如下与未读数相关的限制:

  • 所有未读消息(包括@消息)的消息阈值默认为 99 条。
  • @消息的未读数的有效期,默认为 7 天,即默认存储 7 天。

若需要扩展上限,可在控制台配置圈组子功能项(未读的@消息数-周期所有未读消息(包括@)的消息计数-阈值),具体请参考开通和配置圈组功能

实现流程

流程概览

以下时序图可能因为网络问题显示异常。如显示异常,一般刷新当前页面即可正常显示。

uml diagram

流程说明

  1. 用户A 注册serverUnreadInfoChanged:回调方法,监听NIMQChatServerUnreadInfo的变化。

    示例代码如下:

    - (void)serverUnreadInfoChanged:(NSDictionary <NSNumber *, NIMQChatServerUnreadInfo *> *)serverUnreadInfoDic
    {
        //code here
    }
    
  2. 根据服务器下的频道数量,按如下方法订阅服务器下的所有频道的未读数,订阅后 SDK 获取并缓存各频道的初始未读数。

    • 如果服务器下的频道数量不超过 200,则用户A 可调用subscribeAllChannel:completion方法一次性订阅服务器下所有的频道的未读数(将参数NIMQChatSubscribeType设为NIMQChatSubscribeTypeChannelMsgUnreadCount)。需要注意的是,单次调用该方法,最多仅能传入 10 个服务器 ID。

    • 如果服务器下的频道数量超过 200,则用户A 需调用subscribeChannel:completion方法订阅服务器下所有频道的未读数(将参数NIMQChatSubscribeType设为NIMQChatSubscribeTypeChannelMsgUnreadCount)。需要注意的是,单次调用该方法,最多仅能订阅 100 个频道。

    • 通过subscribeChannel:completion订阅频道,单次调用可传入的服务器 ID 数量上限为 10 个。即使多次调用,单个服务器下最多仅能订阅 200 个 频道。如果目标服务器下频道数量大于 200,需改用subscribeChannel:completion方法订阅服务器下所有频道(单次调用最多可订阅 100 个频道)。
    • 获取服务器的精确未读数,必须订阅服务器下的所有频道的未读数。

    subscribeAllChannel
    NIMQChatSubscribeAllChannelParam *param = [[NIMQChatSubscribeAllChannelParam alloc] init];
    param.serverId = 1432214;
    param.subscribeType = NIMQChatSubscribeTypeChannelMsgUnreadCount;
    
    [[NIMSDK sharedSDK].qchatServerManager subscribeAllChannel:param completion:^(NSError * _Nullable error, NIMQChatSubscribeAllChannelResult * _Nullable result) {
        //your code
    }];
    
    subscribeChannel
    NIMQChatChannelIdInfo *idInfo = [[NIMQChatChannelIdInfo alloc] init];
    idInfo.serverId = 123786;
    idInfo.channelId = 123098;
    NIMQChatSubscribeChannelParam *param = [[NIMQChatSubscribeChannelParam alloc] init];
    param.targets = @[idInfo];
    param.subscribeType = NIMQChatSubscribeTypeChannelMsgUnreadCount;
    param.operationType = NIMQChatSubscribeOperationTypeSubscribe;
    [[NIMSDK sharedSDK].qchatChannelManager subscribeChannel:param completion:^(NSError * _Nullable error, NIMQChatSubscribeChannelResult * _Nullable result) {
       //code
    }];
    
  3. 其他用户发送或删除消息后,SDK 对服务器下所有已订阅频道的未读数进行累加计算。

    未读数累加规则如下:

    • 接到新消息,某个频道未读数 +1 时:
      • 如果累加未读数达到未读数上限(maxCount),则触发回调,给出maxCount
      • 如果累加未读数没有达到maxCount,则触发回调,给出累加未读数。
    • 消息被删除,某个频道未读数 - 1 时:
      • 如果累加未读数达到maxCount,则触发回调,给出maxCount
      • 如果累加未读数没有达到maxCount,则触发回调,给出累加未读数。
  4. SDK 计算完所有已订阅频道的累加未读数(NIMQChatServerUnreadInfo)后,组成 以对应的服务器ID(serverId)的 NSNumber 包装为Key,相应IMQChatServerUnreadInfo 为 value 的字典,将其返回给用户A。

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

    NIMQChatMarkServerReadParam *param = [[NIMQChatMarkServerReadParam alloc] init];
    param.serverIds = @[@(1432214), @(423532), @(5345253)];
    
    [[NIMSDK sharedSDK].qchatServerManager markServerRead:param completion:^(NSError * _Nullable error, NIMQChatMarkServerReadResult * _Nullable result) {
        //your code
    }];
    
此文档是否对你有帮助?
有帮助
去反馈
  • 前提条件
  • 使用限制
  • 实现流程
  • 流程概览
  • 流程说明