处理未读 @ 消息
本页面描述了在超级群业务如何实现获取全部未读 @ 消息、跳转到指定未读 @ 消息等功能。
本页面功能依赖融云服务端保存的超级群会话「未读 @ 消息摘要」数据。「@所有人」消息的摘要数据固定存储 7 天(不支持调整)。其他类型 @ 消息的摘要数据与超级群历史消息存储时长一致。
获取全部未读 @ 消息
要求 SDK 版本 ≧ 5.2.5。
获取全部未读 @ 消息
SDK 支持从远端获取指定超级群频道中的全部未读 @ 消息的摘要信息(RCMessageDigestInfo
)列表。App 可使用返回的摘要信息,从远端取得未读的 @ 消息。
例如,App 希望获取仅展示未读 @ 消息的场景,步骤如下:
-
获取超级群频道下的未读 @ 消息摘要,最多可获取 50 条(
count
取值范围为 [1-50])。成功回调中会返回RCMessageDigestInfo
的列表。每个RCMessageDigestInfo
对象包含一条未读消息的摘要信息。使用RCMessageDigestInfo
中的摘要信息构造RCMessage
列表。每个消息对象需包含从RCMessageDigestInfo
中获取的ConversationType
,targetId
,channelId
,messageUid
,sentTime
。[[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) {}]; -
您可以使用
getBatchRemoteUltraGroupMessages
方法,传入上一步构建 的消息列表,从远端批量提取 @ 消息的完整内容。[[RCChannelClient sharedChannelManager] getBatchRemoteUltraGroupMessages:messages
success:^(NSArray<RCMessage *> * _Nonnull matchedMsgList, NSArray<RCMessage *> * _Nonnull notMatchMsgList) {}
error:^(RCErrorCode status) {}];
定位到指定未读 @ 消息
要求 SDK 版本 ≧ 5.2.5。
利用获取超级群会话未读 @ 消息摘要列表接口(getUltraGroupUnreadMentionedDigests
),可以实现从会话列表进入会话页面后定位到特定 @ 消息的位置。
-
获取超级群频道下的未读 @ 消息摘要,最多可获取 50 条(
count
取值范围为 [1-50])。成功回调中会返回RCMessageDigestInfo
的列表。每个RCMessageDigestInfo
对象包含一条未读消息的摘要信息。[[RCChannelClient sharedChannelManager] getUltraGroupUnreadMentionedDigests:targetID
channelId:channelID
sendTime:time
count:count
success:^(NSArray<RCMessageDigestInfo *> * _Nonnull digests) {}
error:^(RCErrorCode status) {}]; -
构造
RCHistoryMessageOption
对象用于获取历史消息。从RCMessageDigestInfo
中取出sendTime
,作为RCHistoryMessageOption
对象的recordTime
。RCHistoryMessageOption *option = [[RCHistoryMessageOption alloc] init];
option.recordTime = time;
option.count = count;
option.order = RCHistoryMessageOrderDesc; -
(可选)修正
RCHistoryMessageOption
的recordTime
。getMessages
的查询结果中不会包含 message.sentTime == recordTime 的消息。如有需要,可根据Order
分别对recordTime
做以下修正,以保证查询结果包含您想要的消息:- RCHistoryMessageOrderDesc: recordTime = message.sentTime + 1
- RCHistoryMessageOrderAsc: recordTime = message.sentTime - 1
-
使用超级群
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
成功后,客户端本地 Conversation
的 firstUnreadMsgSendTime
会变为 0。服务端保存的第一条未读时间会变为 0,保存的未读 @ 消息摘要列表也会清零.