您好,目前我们APP集成时遇到如下问题,

1,当A不在线时,B给A用户发送了消息
A再次上线,onmessage(..)方法没被调用,

2,使用该方法查询出来的会话,con.getUnreadMessagesCount(); 永远都等于0

AVIMConversationsQuery query = client.getConversationsQuery();
//            query.whereEqualTo("objectId", conversation.getConversationId());
            query.setLimit(Constant.LIST_PAGE_SIZE);
            query.setQueryPolicy(AVQuery.CachePolicy.NETWORK_ELSE_CACHE);
            if (startSkip != 0) query.setSkip(startSkip);
            query.findInBackground(new AVIMConversationQueryCallback() {
                @Override
                public void done(List<AVIMConversation> convs, AVIMException e) {
                    hasNextPage = false;
                    loading = false;
                    conversationRefresh.setRefreshing(false);
                    if (e == null) {
                        if (convs != null && !convs.isEmpty()) {
                            notData.setVisibility(View.GONE);
                            conversationAdaper.update(convs);
                            if (convs.size() == Constant.LIST_PAGE_SIZE) hasNextPage = true;
                        } else if (startSkip == 0) {
                            //无数据
                            notData.setVisibility(View.VISIBLE);
                        }
                    }
                    if (cacheConversation != null && !cacheConversation.isEmpty()) {
                        notData.setVisibility(View.GONE);
                        for (AVIMConversation con : cacheConversation) {
                            conversationAdaper.addNewConversation(con);
                        }
                        cacheConversation.clear();
                    }
                }
            });

问题一: onmessage(..)方法没被调用

你好,离线消息不会调用 onmessage 方法。请您阅读文档:未读消息3离线消息推送通知2

问题二:con.getUnreadMessagesCount(); 永远都等于0

如果使用未读消息数更新通知,需要在 AVOSCloud 初始化语句后面加上:AVIMClient.setUnreadNotificationEnabled(true);

更详细内容请您参考 :未读消息数更新通知10

您好,AVIMClient.setUnreadNotificationEnabled(true); 我已經有調用這個方法,查詢出來的還是0

文档中有下列说明:
要实现 AVIMConversationEventHandler 的代理方法 onUnreadMessagesCountUpdated 来得到未读消息的数量变更的通知:

onUnreadMessagesCountUpdated(AVIMClient client, AVIMConversation conversation) {
    // conversation.getUnreadMessagesCount() 即该 conversation 的未读消息数量
}

文档中描述的更加详细,我没将文档的全部信息粘贴出来,请您开发前详细阅读下文档的相关内容。

https://leancloud.cn/docs/realtime_guide-android.html#hash18625320957

后续呢。。我这边安卓端也出现部分消息接收不到,然后也有的消息延期了一个月才到达至客户手机中。苹果端也有部分收不到消息,只能让用户退出账号重新登录。

你好,请问 [消息接收不到] 是指在线消息还是离线推送。请您另开新帖提供 SDK 版本信息,Android 机型,详细描述复现问题步骤,粘贴相关代码以及调试日志等信息。

你好,我在登录成功后得到的未读数量是 登录用户 的所有会话未读数吗? 我发现该方法只会在登录成功后调用一次,可是每天第一次登陆时返回的未读数都不对,我再次退出后登录就是正常的了。麻烦看下是什么原因
onUnreadMessagesCountUpdated(AVIMClient client, AVIMConversation conversation) {
// conversation.getUnreadMessagesCount() 即该 conversation 的未读消息数量
}

你好,请问您有在在适当的时机重置未读数吗?

开启未读消息数后,即使客户端在线收到了消息,未读消息数量也会增加,因此开发者需要在合适时机重置未读消息数。

文档链接: https://leancloud.cn/docs/realtime_guide-android.html#hash18625320952


我只在这两个情况下设为conversation.read 方法,还有别的方法或者位置需要重置未读数量吗?

再次与您确认下面这几个问题。

登陆后,每个 conversation 有未读消息后都会回调 onUnreadMessagesCountUpdated,每个会话的未读消息数为 conversation.getUnreadMessagesCount()

如果有多个会话有未读消息, onUnreadMessagesCountUpdated 回调会执行多次。「所有会话未读数」应该是多次执行的总和。

我只在这两个情况下设为conversation.read 方法,还有别的方法或者位置需要重置未读数量吗?

一般来说在这两种情况下将对话标记为已读就够了。

我发现该方法只会在登录成功后调用一次,可是每天第一次登陆时返回的未读数都不对,我再次退出后登录就是正常的了

能麻烦您将「登陆时返回的未读数都不对,再次登录就正常」该问题复现流程详细说明下吗?在用户登录后,返回未读数之前是否做了 AVIMConversationsQuery 查询操作?

返回未读数前没有AVIMConversationsQuery,我会将onUnreadMessagesCountUpdated中每个conversation的未读数量加起来

你好:

1、请先告知所用的 Android SDK 版本是多少?
2、复现「android 无法获取未读数量问题」的完整步骤是怎么样?请试举一例。
告诉我们 clientId、conversation Id 等重要信息,请粘贴方便我们工程师复制来排查问题。
如有必要的话,辅助截图来说明清楚问题。

1、请先告知所用的 Android SDK 版本是多少?

我的版本是 v4.4.4

2、复现「android 无法获取未读数量问题」的完整步骤是怎么样?

每天第一次登录时onUnreadMessagesCountUpdated 的输出,总数量为 10条,我通过[query.findInBackground]查询出来的会话只有一个,并且只有两条未读数量。会话id为 “5a5469841579a30062b5a88e”

01-11 10:09:41.600 7809-7809/com.lcw.des I/unreadMessagesCountUpdated: com.lcw.app.lean.cloud.listener.CustomConversationEventHandler::onUnreadMessagesCountUpdated@62>>>clientId=aab4ee8243a542b481172086442d4aef,conversationId=5a42f9805b90c830ff7b6563,unReadCount=1
01-11 10:09:41.620 7809-7809/com.lcw.des I/unreadMessagesCountUpdated: com.lcw.app.lean.cloud.listener.CustomConversationEventHandler::onUnreadMessagesCountUpdated@62>>>clientId=aab4ee8243a542b481172086442d4aef,conversationId=5a4c40fe75657100444471ae,unReadCount=2
01-11 10:09:41.640 7809-7809/com.lcw.des I/unreadMessagesCountUpdated: com.lcw.app.lean.cloud.listener.CustomConversationEventHandler::onUnreadMessagesCountUpdated@62>>>clientId=aab4ee8243a542b481172086442d4aef,conversationId=5a5469841579a30062b5a88e,unReadCount=2
01-11 10:09:41.650 7809-7809/com.lcw.des I/unreadMessagesCountUpdated: com.lcw.app.lean.cloud.listener.CustomConversationEventHandler::onUnreadMessagesCountUpdated@62>>>clientId=aab4ee8243a542b481172086442d4aef,conversationId=5a4c545944d9040045d45354,unReadCount=5

我再次登录同一个账号后 onUnreadMessagesCountUpdated 没有回调,会话还是那一条。
我只是杀掉了APP进程,没有做退出登录操作,如果是手动点击退出登录,再次登录后,之前的未读数量没有回调了。

我这边查看了下数据,_Conversation 表里已经没有 5a4c545944d9040045d453545a4c40fe75657100444471ae5a42f9805b90c830ff7b6563了。只有5a5469841579a30062b5a88e 这个会话。

是否有过在控制台,或者调用 API 去删除 conversation 的操作?

几周前有删除过一次所有的会话

请慎重删除 conversation 表的数据,如果不小心处理,就会出现这种消息不一致的情况。

现在的解决办法是,在 onUnreadMessagesCountUpdated 里主动调用 read,把 5a4c545944d9040045d45354、5a4c40fe75657100444471ae 和5a42f9805b90c830ff7b6563 这 3 个会话的未读消息都置为已读。

因为你删除过所有会话,其他 clientId 登录后,也可能出现同样的问题,都这么处理一下。

1,那我要清空这些数据呢,应该怎样清除所有会话并且不会出现别的问题?
2,我新增加的客户,也会出现这样的问题吗?
3,不同的账号登录,出来的这些奇怪会话的未读数量不一致,我无法判断该会话是否可以read,万一真的是有未读的,而我却设置成了已读,那不是又显示不准确了?

query conversation 表拿 where equal 判断一下 conversation 的 objectId,如果返回的 list 为空,就说明这个会话已经没有了,直接 read 这个 conversation 对象即可。这个代码需要对所有登录过的 clientId 跑一遍。

新客户不会受到这个问题影响。