十万火急!!!LeanCloud炸了

现象描述:( LeanCloud版本7.0.7
用户登录成功后(首次调用了AVIMClient.open()方法,并且收到AVIMClientCallback回调),此时可以正常接收消息。退出应用程序后,再次打开应用,按道理讲,leancloud重连机制应该起作用了,实测证明,Android5.1上效果稍微好点,基本上能自动连接上leancloud并正常收发消息,但是Android 10上就不会自动连接成功,此时其他账号给Android10发送消息收不到,Android10发消息给其他账号,都会报错({"appCode":0,"code":999,"detailMessage":"Connection Lost"} 或者 {"appCode":0,"code":4105,"detailMessage":"SESSION_REQUIRED"})。重新发送失败消息后(此时主动调用了AVIMClient.open()方法),然后能收到别人刚刚发过来的消息,此时自己也可以正常发送消息。如果退到后台过一会再启动应用,又跟上述现象一样了,所以不知道leancloud最新版本是什么问题,导致Android高版本经常出现leancloud聊天连接不上,是LeanCloud连接有问题吗?求大神指导。

备注:leancloud所有配置都是正确的

   if (BuildConfig.LOG_DEBUG) {
        /*call before AVOSCloud.initialize()*/
        AVOSCloud.setLogLevel(AVLogger.Level.DEBUG);
    }
    String appId = BuildConfig.LEANCLOUD_APPID;
    String apiHost = BuildConfig.LEANCLOUD_API_HOST;
    AVOSCloud.initializeSecurely(context, appId, apiHost);
    /*Android 8.0:call after AVOSCloud.initialize with default notification channel */
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        String channelId = context.getPackageName() + ".leancloud";
        PushService.setDefaultChannelId(context, channelId);
        String appName = context.getResources().getString(R.string.app_name);
        String notificationContent = appName + "正在运行";

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, channelId);
        Notification notification = notificationBuilder.setOngoing(true)
                .setSmallIcon(R.mipmap.ic_app_logo)
                .setContentTitle(notificationContent)
                .setPriority(NotificationManager.IMPORTANCE_MIN)
                .setCategory(Notification.CATEGORY_SERVICE)
                .build();
        PushService.setForegroundMode(true, 0, notification);
    }
    /*push service*/
    PushService.setAutoWakeUp(true);
    PushService.setDefaultPushCallback(context, MainActivity.class);
    /* LeanCloud Client monitor、Message monitor、Offline Message */
    AVIMClient.setClientEventHandler(new IMClientEventHandler());
    AVIMMessageManager.registerMessageHandler(AVIMTypedMessage.class, new MessageHandler(context));
    AVIMMessageManager.setConversationEventHandler(new IMConversationEventHandler());

重新打开leancloud:(1)reconnect参数登录时传入了false;(2)重新启动应用时(Application中初始化),传入true,Android5.1调用AVIMClient.open()时AVIMClientCallback有回调,但是Android10调用AVIMClient.open()方法时AVIMClientCallback无回调无响应

   AVIMClientOpenOption openOption = new AVIMClientOpenOption();
    openOption.setReconnect(reconnect);
    AVIMClient imClient = AVIMClient.getInstance(clientId, “Mobile”);
    imClient.open(openOption, new AVIMClientCallback() {
        @Override
        public void done(AVIMClient avimClient, AVIMException e) {
            if (e == null) {/*连接成功*/
                showLog("===>open leancloud client successfully");
            } else { /*连接失败*/
                showLog("===>openClient with exception whose errorCode:" + e.getCode() + ",errorAppCode:" + 
                                   e.getAppCode() + ", errorInfo:" + e.getMessage());
            }

            if (clientCallback != null) {
                clientCallback.done(avimClient, e);
            }
        }
    });

事件起因:虽然LeanCloud有重连机制,但是不知道状态,所以登录成功后,重新进入App后,我会重新调用一下AVIMClient.open()方法从而知道client连接状态;

目前测试发现:
1、在Application onCreate中调用AVIMClient.open(AVIMClientOptions,AVIMClientCallback)方法(其中,AVIMClientOptions.setReconnect(true))时,Android 10没有回调,Android 5有 回调。如果将此open方法放到Activity里面初始化,Android 5和Android 10都能正常回调,这个到现在没想通是为什么? 此处手动 @LeanCloud官方技术人员,望解答疑惑。

2、单点登录的问题,两台手机基本上第一次互相踢的时候能收到AVIMClientEventHandler.onClientOffline回调通知,但是后面怎么登录都不能收到回调通知,这个不知是否跟上述问题有关。这样就导致两个账号都能登录的假象。此处手动 @LeanCloud官方技术人员,望解答疑惑。

你好,请问只有新版 SDK 7.0.7 中遇到这个问题吗?您之前使用哪个版本 SDK 是否遇到过这个问题。

在高版本 Android 上,因为系统限制,实时通讯依赖的 PushService 这一个后台服务在主程序不在前台后并不能长期运行(会被系统杀死,并且无法自动重启),所以我们推荐开发者在每次程序启动的时候调用 AVIMClient.open。在高版本的 Android 上聊天服务的行为和 iOS 变得越来越一致。

AVIMClientOptions.setReconnect(true) 这个方法应用层不需要调用,它表示的是主程序活跃期间,PushService 如果因为网络原因临时断开,我们内部会进行重连,这时候重连成功也不会回调到应用层。

为了让 PushService 能长期存活,还有一个办法是将它变成一个前台服务,可以参看文档:https://leancloud.cn/docs/android_push_guide.html#hash2115745493

你好,很感谢回复。

但是目前遇到的问题还有,高版本Android上,我不主动调用AVIMClient.open ,重新进入Android后,接收不到消息,发送消息也是失败的,使用AVIMConversation发送消息需要使用AVIMClient去查询(查询成功后我会缓存到本地),但是查询这一步就会报错:{"appCode":0,"code":999,"detailMessage":"Connection Lost"} 或者401 UnAuthorized错误,测试过程中等待好长时间等sdk内部自动重连也不行。

备注:AVIMClient查询对应的AVIMConversation


AVIMConversationsQuery query = AVIMClient.getConversationsQuery();
AVIMClient.get.setQueryPolicy(AVQuery.CachePolicy.NETWORK_ELSE_CACHE);
query.whereEqualTo("objectId", conversationId);
query.findInBackground(new AVIMConversationQueryCallback() {
@Override
public void done(List convs, AVIMException e) {
if (e == null) {
if (convs != null && !convs.isEmpty()) {
ShowLog.show(TAG, "获取conversation成功,id为:" + conversationId);
cache.put(convs.get(0).getConversationId(), convs.get(0));
}
} else {
ShowLog.show(TAG, "获取conversation失败,id为:" + conversationId + ",错误为:" + e.toString());
}
}
});


我再试试将PushService变成前台服务。

上面说过了,现在都需要先调用 AVIMClient.open,不调用是不行的。

嗯嗯,上次已经改成Activity里调用AVIMClient.open了,是正常的了。但是我想问下Android高版本上,在Application onCreate()调用AVIMClient.open了,但是进入App后聊天及消息推送依然不行,第一次发送消息还是会报错Connection Lost,然后再次发送失败的消息,就会收到别人刚刚发送的消息以及原先失败的消息发送成功了

这应该是 open 还没有返回(回调函数还没有被执行),就开始尝试去收发消息导致的。