相关帖子:


SDK 版本: 3.15.9

复现步骤

  1. 强杀 Android 应用
  2. 给这个用户发消息,由于用户不在线,发的消息都是离线消息
  3. 在控制台可以查看到这个用户是离线的,且有对应数目的离线消息
  4. 再次开启应用,离线消息回调 onOfflineMessagesUnread 没被调用

备注

退出登录,再次进入应用,离线消息是可以收到的,说明我的回调没有写错

1 人赞了这个帖子.

你好,这里推测是 client 没有 onConnectionResume(),也就是长链接没有重连成功。可以观察一下相关日志,然后贴出来,我来分析一下。

找到原因了,已解决

https://leancloud.cn/docs/realtime_guide-android.html#自身主动加入5

这个地方容易使人产生误解

AVIMMessageManager.setConversationEventHandler(new CustomConversationEventHandler());
AVIMClient bob = AVIMClient.getInstance("Bob");
bob.open(new AVIMClientCallback(){

    @Override
    public void done(AVIMClient client,AVIMException e){
      if(e==null){
      //登录成功
      }
    }
});

实际开发中,open 一个客户端往往是在初始化 LeanCloud 相关配置之后执行的,如果把 AVIMMessageManager.setConversationEventHandler(new CustomConversationEventHandler()); 和 open 客户端的逻辑放在一起,会造成离线消息回调未及时执行

正确的做法应该是放在 LeanCloud 相关配置的逻辑里面,这段逻辑在 Android 里,应该是放在 Application1 类里,我的 Application 类名字是 App.java, 示例代码如下

private void initLeanCloud() {
    AVOSCloud.initialize(App.this, Constants.APP_ID, Constants.APP_KEY);

    // 接收离线消息回调
    AVIMClient.setOfflineMessagePush(true);
    AVIMMessageManager.setConversationEventHandler(new CustomConversationEventHandler());

    AVIMMessageManager.registerDefaultMessageHandler(new DefaultMessageHandler(this));
}
1 人赞了这个帖子.