处理未读 @ 消息
本文档描述了在超级群业务中如何实现获取全部未读 @ 消息、跳转到指定未读 @ 消息等功能。
处理未读 @ 消息的功能依赖融云服务端保存的超级群会话未读 @ 消息摘要数据。@所有人消息的摘要数据固定存储 7 天(不支持调整)。其他类型 @ 消息的摘要数据与超级群历史消息存储时长一致。
获取全部未读 @ 消息
IMLib SDK 版本 ≧ 5.2.5。
IMLib SDK 支持从远端获取指定超级群频道中的全部未读 @ 消息的摘要信息(MessageDigestInfo)列表。您可以通过返回的摘要信息,从远端取得未读的 @ 消息。
例如,您希望获取仅展示未读 @ 消息的场景,步骤如下:
- 获取超级群频道下的未读 @ 消息摘要,最多可获取 50 条(
count取值范围为 [1-50])。成功回调中会返回MessageDigestInfo的列表。每个MessageDigestInfo对象包含一条未读消息的摘要信息。使用MessageDigestInfo中的摘要信息构造Message列表。每个消息对象需包含从MessageDigestInfo中获取的ConversationType,targetId,channelId,messageUid,sentTime。 
示例代码
String targetId = "会话 Id";
String channelId = "频道 ID";
long sendTime = 1662542712112L;
int count = 20;
ChannelClient.getInstance().getUltraGroupUnreadMentionedDigests(targetId, channelId, sendTime, count,
    new IRongCoreCallback.ResultCallback<List<MessageDigestInfo>>() {
        @Override
        public void onSuccess(List<MessageDigestInfo> messageDigestInfos) {
            List<Message> msgList = new ArrayList<>();
            for (MessageDigestInfo info : messageDigestInfos) {
                // 可使用 MessageDigestInfo 的属性筛选 @ 消息摘要
                Message message = new Message();
                message.setConversationType(info.getConversationType());
                message.setTargetId(info.getTargetId());
                message.channelId = info.getChannelId();
                message.setUId(info.getMessageUid());
                message.setSentTime(info.getSentTime());
                // 从 5.6.0 开始,MessageDigestInfo 携带消息类型的唯一标识 ObjectName
                message.setObjectName(info.getObjectName());
                msgList.add(message);
            }}
        @Override
        public void onError(IRongCoreEnum.CoreErrorCode errorCode) {
        }});
- 
您可以使用
getBatchRemoteUltraGroupMessages(msgList, callback)方法,传入上一步构建的消息列表,从远端批量提取 @ 消息的完整内容。JavaChannelClient.getInstance().getBatchRemoteUltraGroupMessages(msgList,
new IRongCoreCallback.IGetBatchRemoteUltraGroupMessageCallback(
@Override
public void onSuccess(List<Message> matchedMsgList, List<Message> notMatchedMsgList) {}
@Override
public void onError(IRongCoreEnum.CoreErrorCode errorCode) {}
)); 
定位到指定未读 @ 消息
要求 SDK 版本 ≧ 5.2.5。
利用获取超级群会话未读 @ 消息摘要列表接口(getUltraGroupUnreadMentionedDigests),可以实现从会话列表进入会话页面后定位到特定 @ 消息的位置。
- 
获取超级群频道下的未读 @ 消息摘要,最多可获取 50 条(
count取值范围为 [1-50])。每个MessageDigestInfo对象包含一条未读 @ 消息的摘要信息。Javapublic void getUltraGroupUnreadMentionedDigests(
String targetId,
String channelId,
long sendTime,
int count,
IRongCoreCallback.ResultCallback<List<MessageDigestInfo>> callback); - 
构造
HistoryMessageOption对象用于获取历史消息。从MessageDigestInfo中取出sendTime,作为HistoryMessageOption对象的DataTime。JavaHistoryMessageOption option = new HistoryMessageOption();
option.setOrder(HistoryMessageOption.PullOrder.DESCEND);
option.setCount(count);
option.setDataTime(sendTime); - 
(可选)修正
HistoryMessageOption的dataTime。getMessages的查询结果中不会包含 message.sentTime == dataTime 的消息。如有需要,可根据PullOrder分别对dataTime做以下修正,以保证查询结果包含您想要的消息:- HistoryMessageOption.PullOrder.DESCEND: dataTime = message.sentTime + 1
 - HistoryMessageOption.PullOrder.ASCEND : dataTime = message.sentTime - 1
 
 - 
使用超级群 ChannelClient 的获取历史消息接口
getMessages,可以获取特定 @ 消息前、后的历史消息。Javapublic void getMessages(
final Conversation.ConversationType conversationType,
final String targetId,
final String channelId,
final HistoryMessageOption historyMessageOption,
final IRongCoreCallback.IGetMessageCallbackEx getMessageCallback); 
何时清空未读 @ 消息
未读数需要在会话页面清除:
- 会话页面即将消失时
 - 处于会话页面, app返回前台时
 - 已经加载到最新消息时
 
清除方法参考清除消息未读状态。
当调用 syncUltraGroupReadStatus 成功后,客户端本地 Conversation 的 firstUnreadMsgSendTime 会变为 0。服务端保存的第一条未读时间会变为 0,保存的未读 @ 消息摘要列表也会清零。