tencent cloud

文档反馈

Android & iOS & Mac

最后更新时间:2023-03-21 10:38:37

    功能描述

    用户的会话列表中一般会有多个会话,如果某个会话收到了新消息,通常需要在列表的 cell 中以小红点或者数字角标的方式,向用户展示该会话的未读消息数,提醒用户阅读。
    用户点击进入该会话,再退回到会话列表,未读消息数被清空,小红点消失。
    IM SDK 支持获取所有会话的未读消息总数和根据过滤条件获取部分会话的未读消息总数,将其展示在会话列表的底部 tab 上。

    本文将向您介绍如何实现会话未读消息提醒功能。

    获取所有会话的未读消息总数

    通常情况下,如果您想得到所有会话的未读消息总数,可以遍历会话列表得到每个会话的信息 V2TIMConversation,然后再把所有的 V2TIMConversationunreadCount 相加起来,展示在 UI 上。
    但 IM SDK 为您提供了直接查询所有会话未读消息总数的接口 getTotalUnreadMessageCount
    当会话的未读总数发生变更时,SDK 还会主动通过回调 onTotalUnreadMessageCountChanged,将最新的未读总数通知出来。

    说明:

    1. 仅增强版 5.3.425 及以上版本,支持获取所有会话未读消息总数。
    2. 仅适用于好友工作群(Work)、陌生人社交群(Public)和社群(Community),但直播群(AVChatRoom)和临时会议群(Meeting)暂不适用。群组类型详见 群组介绍

    具体的操作步骤如下文所示:

    获取所有会话的未读总数

    您可以调用 getTotalUnreadMessageCount(Android / iOS & Mac / Windows) 获取所有会话的未读消息总数,获取成功后可以使用其更新 UI。

    示例代码如下:

    V2TIMManager.getConversationManager().getTotalUnreadMessageCount(new V2TIMValueCallback<Long>() {
        @Override
        public void onSuccess(Long aLong) {
            Log.i("imsdk", "success");
        }
    
    
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
        Log.i(<span class="hljs-string">&quot;imsdk&quot;</span>, <span class="hljs-string">&quot;failure, code:&quot;</span> + code + <span class="hljs-string">&quot;, desc:&quot;</span> + desc);
    }
    

    });

    所有会话的未读总数变更通知

    您可以调用 addConversationListener(Android / iOS & Mac / Windows) 添加会话监听器。添加监听器后,只需要调用过一次 getTotalUnreadMessageCount 接口,才能接收到所有会话的未读总数变更通知。

    您可以在 V2TIMConversationListener 中的 onTotalUnreadMessageCountChanged(Android / iOS & Mac / Windows) 中,获取到变更后的未读总数。

    示例代码如下:

    public void onTotalUnreadMessageCountChanged(long totalUnreadCount) {
        // 收到所有会话的未读总数变更通知
        Log.i("imsdk", "onTotalUnreadMessageCountChanged");
    }
    

    根据过滤条件获取部分会话的未读消息总数

    IM SDK 为您提供了根据过滤条件查询部分会话未读消息总数的接口 getUnreadMessageCountByFilter
    如果您需要监听指定过滤条件下的会话未读消息总数变更,可以调用 subscribeUnreadMessageCountByFilter 注册监听,当该过滤条件下的会话未读消息总数发生变更时,SDK 还会主动通过回调 onUnreadMessageCountChangedByFilter,将最新的未读总数通知出来。

    说明:

    1. 仅增强版 7.0.3754 及以上版本,支持根据过滤条件获取部分会话的未读消息总数。
    2. 仅适用于好友工作群(Work)、陌生人社交群(Public)和社群(Community),但直播群(AVChatRoom)和临时会议群(Meeting)暂不适用。群组类型详见 群组介绍

    具体的操作步骤如下文所示:

    获取部分会话的未读消息总数

    您可以调用 getUnreadMessageCountByFilter(Android / iOS & Mac / Windows) 获取部分会话的未读消息总数,获取成功后可以使用其更新 UI。其中过滤条件 V2TIMConversationListFilter 详解如下:

    属性 含义 说明
    type 会话类型(填 0 代表不过滤此项) C2C 或者群组会话
    conversationGroup 会话分组名称(不填写代表不过滤此项) 不是群组名称,是会话分组的名称,参考文档 会话分组
    markType 会话标记类型(填 0 代表不过滤此项) 参考文档 会话标记

    示例代码如下:

    V2TIMConversationListFilter filter = new V2TIMConversationListFilter();
    filter.setConversationType(V2TIMConversation.V2TIM_GROUP);
    filter.setConversationGroup("conversation_group");
    filter.setMarkType(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_STAR);
    
    

    V2TIMManager.getConversationManager().getUnreadMessageCountByFilter(filter, new V2TIMValueCallback<Long>() {
    @Override
    public void onSuccess(Long totalUnreadCount) {
    tvLog.setText("getUnreadMessageCountByFilter success, totalUnreadCount:" + totalUnreadCount);
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
        tvLog.setText(<span class="hljs-string">&quot;getUnreadMessageCountByFilter failed&quot;</span>);
    }
    

    });

    注册监听部分会话的未读消息总数变更

    您可以调用 addConversationListener(Android / iOS & Mac / Windows) 添加会话监听器。添加监听器后,需要您调用 subscribeUnreadMessageCountByFilter(Android / iOS & Mac / Windows) 接口,注册监听指定过滤条件下的未读消息总数变更。

    您可以在 V2TIMConversationListener 中的 onUnreadMessageCountChangedByFilter(Android / iOS & Mac / Windows) 中,获取到变更后的未读总数。

    您可以注册监听多个不同过滤条件下的未读总数变更,onUnreadMessageCountChangedByFilter 回调的 filter 参数就是调用 subscribeUnreadMessageCountByFilter 时指定的 filter,该 filter 携带了 conversationType、conversationGroup 和 markType 三个字段,通过判断这三字段是不是都相同,来区分出不同的过滤条件。

    示例代码如下:

    // 添加会话监听器
    V2TIMManager.getConversationManager().addConversationListener(conversationListener);
    
    

    // 注册监听指定过滤条件下的未读消息总数变更
    V2TIMConversationListFilter filter = new V2TIMConversationListFilter();
    filter.setConversationType(V2TIMConversation.V2TIM_GROUP);
    filter.setConversationGroup("conversation_group");
    filter.setMarkType(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_STAR);
    V2TIMManager.getConversationManager().subscribeUnreadMessageCountByFilter(filter);

    // 指定过滤条件下的未读消息总数变更通知
    public void onUnreadMessageCountChangedByFilter(V2TIMConversationListFilter filter, long totalUnreadCount) {
    // filter 是过滤条件,totalUnreadCount 是未读消息总数
    Log.i(TAG, "onUnreadMessageCountChangedByFilter:" + totalUnreadCount + "\n");
    }

    取消监听部分会话的未读消息总数变更

    您可以调用 unsubscribeUnreadMessageCountByFilter(Android / iOS & Mac / Windows) 接口,取消监听指定过滤条件下的未读消息总数变更。

    示例代码如下:

    // 取消监听指定过滤条件下的未读消息总数变更
    V2TIMConversationListFilter filter = new V2TIMConversationListFilter();
    filter.setConversationType(V2TIMConversation.V2TIM_GROUP);
    filter.setConversationGroup("conversation_group");
    filter.setMarkType(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_STAR);
    V2TIMManager.getConversationManager().unsubscribeUnreadMessageCountByFilter(filter);
    

    [](id:markMessageAsRead) ## 清空会话未读消息数 用户点击进入会话后,再退回到会话列表,需要清除未读消息数。清除后,会话列表的小红点或数字角标需要随之消失。 IM SDK 针对待清空会话未读数的不同会话类型,提供了 3 个 API: * 清空**单聊**会话未读消息数 `markC2CMessageAsRead`。 * 清空**群聊**会话未读消息数 `markGroupMessageAsRead`。 * 清空**全部**会话未读消息数 `markAllMessageAsRead`。

    具体的操作步骤如下文所示。

    说明:

    清空会话未读消息数功能仅增强版 5.8.1668 及以上版本支持。

    单聊

    您可以调用 markC2CMessageAsRead(Android / iOS & Mac / Windows) 清空指定单聊会话的未读消息数。

    示例代码如下:

    String userID = "userID";
    V2TIMManager.getMessageManager().markC2CMessageAsRead(userID, new V2TIMCallback() {
        @Override
        public void onSuccess() {
            Log.i("imsdk", "success");
        }
    
    
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
        Log.i(<span class="hljs-string">&quot;imsdk&quot;</span>, <span class="hljs-string">&quot;failure, code:&quot;</span> + code + <span class="hljs-string">&quot;, desc:&quot;</span> + desc);
    }
    

    });

    当本端调用 markC2CMessageAsRead 成功后:

    1. 如果调用者事先调用 addConversationListener 添加了会话监听器,会收到 onConversationChanged 回调,可以在此回调中更新 UI。
    2. 对端会收到 onRecvC2CReadReceipt 回调,回调里面会携带清空会话未读数的时间戳。

    示例代码如下:

    public void onConversationChanged(List<V2TIMConversation> conversationList) {
        // 调用者收到会话信息变更通知
        Log.i("imsdk", "onConversationChanged");
    }
    
    

    public void onRecvC2CReadReceipt(List<V2TIMMessageReceipt> receiptList) {
    // 对端到单聊消息被标记已读的回执
    Log.i("imsdk", "onRecvC2CReadReceipt");
    }

    群聊

    您可以调用 markGroupMessageAsRead(Android / iOS & Mac / Windows) 清空指定群聊会话的未读消息数。

    示例代码如下:

    String groupID = "groupID";
    V2TIMManager.getMessageManager().markGroupMessageAsRead(groupID, new V2TIMCallback() {
        @Override
        public void onSuccess() {
            Log.i("imsdk", "success");
        }
    
    
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
        Log.i(<span class="hljs-string">&quot;imsdk&quot;</span>, <span class="hljs-string">&quot;failure, code:&quot;</span> + code + <span class="hljs-string">&quot;, desc:&quot;</span> + desc);
    }
    

    });

    markGroupMessageAsRead 调用成功后,如果调用者事先调用 addConversationListener 添加了会话监听器,会收到 onConversationChanged 回调,可以在此回调中更新 UI。

    示例代码如下:

    public void onConversationChanged(List<V2TIMConversation> conversationList) {
        // 调用者收到会话信息变更通知
        Log.i("imsdk", "onConversationChanged");
    }
    

    所有会话

    您可以调用 markAllMessageAsRead(Android / iOS & Mac / Windows) 清空所有会话的未读消息数。

    示例代码如下:

    V2TIMManager.getMessageManager().markAllMessageAsRead(new V2TIMCallback() {
        @Override
        public void onSuccess() {
            Log.i("imsdk", "success");
        }
    
    
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
        Log.i(<span class="hljs-string">&quot;imsdk&quot;</span>, <span class="hljs-string">&quot;failure, code:&quot;</span> + code + <span class="hljs-string">&quot;, desc:&quot;</span> + desc);
    }
    

    });

    markAllMessageAsRead 调用成功后,如果调用者事先调用 addConversationListener 添加了会话监听器,会收到 onConversationChanged 回调,可以在此回调中更新 UI。

    示例代码如下:

    public void onConversationChanged(List<V2TIMConversation> conversationList) {
        // 收到会话信息变更通知
        Log.i("imsdk", "onConversationChanged");
    }
    

    发送不计入会话未读数的消息

    正常情况下,无论是发送单聊消息还是群聊消息,都会计入未读消息数(通过会话对象 V2TIMConversationunreadCount 接口,可以拿到一个会话的未读消息数)。
    当您希望发送一些不计入未读计数的消息,例如提示类或者控制类的消息,可以在调用 sendMessage 时:

    • 对于 Android 而言,调用 setExcludedFromUnreadCount 方法,设置为 true
    • 对于 iOS/Windows 而言,设置消息对象的 isExcludedFromUnreadCountYES/true

    发送消息 sendMessage 的使用参考:发送消息

    说明:

    setExcludedFromUnreadCountisExcludedFromUnreadCount 参数仅增强版 5.3.425 及以上版本支持。

    示例代码如下:

    // 创建消息对象
    V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createTextMessage(content);
    // 设置不更新会话 lastMessage
    v2TIMMessage.setExcludedFromUnreadCount(true);
    
    

    // 发送消息
    V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "userID", null, V2TIMMessage.V2TIM_PRIORITY_DEFAULT, false, null, new V2TIMSendCallback<V2TIMMessage>() {
    @Override
    public void onSuccess(V2TIMMessage v2TIMMessage) {
    Log.i("imsdk", "success");
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onProgress</span><span class="hljs-params">(<span class="hljs-keyword">int</span> progress)</span> </span>{
        Log.i(<span class="hljs-string">&quot;imsdk&quot;</span>, <span class="hljs-string">&quot;progress:&quot;</span> + progress);
    }
    
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
        Log.i(<span class="hljs-string">&quot;imsdk&quot;</span>, <span class="hljs-string">&quot;failure, code:&quot;</span> + code + <span class="hljs-string">&quot;, desc:&quot;</span> + desc);
    }
    

    });

    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持