跳到主要内容

处理未读 @ 消息

本页面描述了在超级群业务如何实现获取全部未读 @ 消息、跳转到指定未读 @ 消息等功能。

提示

本页面功能依赖融云服务端保存的超级群会话「未读 @ 消息摘要」数据。「@所有人」消息的摘要数据固定存储 7 天(不支持调整)。其他类型 @ 消息的摘要数据与超级群历史消息存储时长一致。

获取全部未读 @ 消息

提示

要求 SDK 版本 ≧ 5.2.5。

获取全部未读 @ 消息

SDK 支持从远端获取指定超级群频道中的全部未读 @ 消息的摘要信息(RCMessageDigestInfo)列表。App 可使用返回的摘要信息,从远端取得未读的 @ 消息。

例如,App 希望获取仅展示未读 @ 消息的场景,步骤如下:

  1. 获取超级群频道下的未读 @ 消息摘要,最多可获取 50 条(count 取值范围为 [1-50])。成功回调中会返回 RCMessageDigestInfo 的列表。每个 RCMessageDigestInfo 对象包含一条未读消息的摘要信息。使用 RCMessageDigestInfo 中的摘要信息构造 RCMessage 列表。每个消息对象需包含从 RCMessageDigestInfo 中获取的 ConversationTypetargetIdchannelIdmessageUidsentTime

     [[RCChannelClient sharedChannelManager] getUltraGroupUnreadMentionedDigests:targetID
    channelId:channelID
    sendTime:time
    count:count
    success:^(NSArray<RCMessageDigestInfo *> * _Nonnull digests) {
    NSMutableArray *messages = [NSMutableArray array];
    for (RCMessageDigestInfo *digest in digests) {
    // 可使用 RCMessageDigestInfo 的属性筛选 @ 消息摘要
    RCMessage *msg = [[RCMessage alloc] init];
    msg.conversationType = digest.conversationType;
    msg.targetId = digest.targetId;
    msg.channelId = digest.channelId;
    msg.sentTime = digest.sentTime;
    msg.messageUId = digest.messageUid;
    // 从 5.6.0 开始,RCMessageDigestInfo 携带消息类型的唯一标识 ObjectName
    msg.objectName = digest.objectName;
    [messages addObject:msg];}
    }
    error:^(RCErrorCode status) {}];
  2. 您可以使用 getBatchRemoteUltraGroupMessages 方法,传入上一步构建的消息列表,从远端批量提取 @ 消息的完整内容。

    [[RCChannelClient sharedChannelManager] getBatchRemoteUltraGroupMessages:messages
    success:^(NSArray<RCMessage *> * _Nonnull matchedMsgList, NSArray<RCMessage *> * _Nonnull notMatchMsgList) {}
    error:^(RCErrorCode status) {}];

定位到指定未读 @ 消息

提示

要求 SDK 版本 ≧ 5.2.5。

利用获取超级群会话未读 @ 消息摘要列表接口(getUltraGroupUnreadMentionedDigests),可以实现从会话列表进入会话页面后定位到特定 @ 消息的位置。

  1. 获取超级群频道下的未读 @ 消息摘要,最多可获取 50 条(count 取值范围为 [1-50])。成功回调中会返回 RCMessageDigestInfo 的列表。每个 RCMessageDigestInfo 对象包含一条未读消息的摘要信息。

     [[RCChannelClient sharedChannelManager] getUltraGroupUnreadMentionedDigests:targetID
    channelId:channelID
    sendTime:time
    count:count
    success:^(NSArray<RCMessageDigestInfo *> * _Nonnull digests) {}
    error:^(RCErrorCode status) {}];
  2. 构造 RCHistoryMessageOption 对象用于获取历史消息。从 RCMessageDigestInfo 中取出 sendTime,作为 RCHistoryMessageOption 对象的 recordTime

    RCHistoryMessageOption *option = [[RCHistoryMessageOption alloc] init];
    option.recordTime = time;
    option.count = count;
    option.order = RCHistoryMessageOrderDesc;
  3. (可选)修正 RCHistoryMessageOptionrecordTimegetMessages 的查询结果中不会包含 message.sentTime == recordTime 的消息。如有需要,可根据 Order 分别对 recordTime 做以下修正,以保证查询结果包含您想要的消息:

    • RCHistoryMessageOrderDesc: recordTime = message.sentTime + 1
    • RCHistoryMessageOrderAsc: recordTime = message.sentTime - 1
  4. 使用超级群 RCChannelClient 的获取历史消息接口 getMessages,可以获取特定 @ 消息前、后的历史消息。

    RCHistoryMessageOption *option = [[RCHistoryMessageOption alloc] init];
    option.recordTime = time;
    option.count = count;
    option.order = RCHistoryMessageOrderDesc;

    [[RCChannelClient sharedChannelManager] getMessages:ConversationType_ULTRAGROUP
    targetId:targetID
    channelId:channelID
    option:option
    complete:^(NSArray<RCMessage *> * _Nullable messages, RCErrorCode code) {
    }];

清空未读 @ 消息的时机

建议 App 在以下时机在会话页面清除未读数:

  • 会话页面即将消失时(viewWillDisappear)
  • 处于会话页面,app 返回前台时
  • 已经加载到最新消息时
提示

当调用 syncUltraGroupReadStatus 成功后,客户端本地 ConversationfirstUnreadMsgSendTime 会变为 0。服务端保存的第一条未读时间会变为 0,保存的未读 @ 消息摘要列表也会清零.