云信小课堂 | Android 登录最佳实践

82b898c26e13ccf3f726fdca4f902961.png

Vol.10

9ac6cf32410aa9334a70941b1f5182fb.png

 简介 

登录对于 IM 产品来说是比较重要的一个模块,关系着后续功能业务的顺利进行。开发者在集成 NIMSDK 的时候,对登录接口选择,以及登录状态处理不当的时候,会引起一些不必要的问题。本篇文章只介绍手动登录和自动登录的使用,更多内容请参考:

登录管理:

https://doc.yunxin.163.com/messaging/docs/TI1MTU1NDc?platform=android

手动登录:需要某个 IM 账号首次登录的时候调用,具体接口为 AuthService.login。

自动登录:需要在某个 IM 账号手动登录成功之后调用,具体接口为在初始化的时候传入上次登录的 LoginInfo 信息。

 实现方案 

手动登录

IM 手动登录接口的调用需要和 app 通过登录页面进行登录的操作保持一致,其他时候一般不需要调用 IM 的手动登录接口。在登录页面中,IM 登录可以作为整个登录过程的一个环节,常见做法是先做应用自身账号体系的登录,成功后 IM 的 accid 和 token 作为返回结果,再进行 IM 的登录。

流程图

9ede72a70a65f07ddd1b8ee9f4724138.png

接口使用

使用手动登录接口登录时,登录成功后需要保存 IM 的 accid 和 token 到本地,方便下次应用启动自动登录的时候使用;登录失败则需要清理本地保存的用户信息,防止下次启动走自动登录逻辑。

LoginInfo loginInfo = new LoginInfo(accid,token);
NIMClient.getService(AuthService.class).login(loginInfo).setCallback(new RequestCallback<LoginInfo>() {
    @Override
    public void onSuccess(LoginInfo result) {
        //保存accid、token,用于下次自动登录。
        //该sp只用于保存当前登录的账号,如有多账号的情况需要业务层自己处理。
        Preferences.saveUserAccount(result.getAccount());
        Preferences.saveUserToken(result.getToken());
        MyApplication.hasLogined = true;
        // TODO 登录成功
    }
    @Override
    public void onFailed(int code) {
        //清理登录账号、token缓存,调用login失败后,不允许走自动登录。
        Preferences.saveUserAccount("");
        Preferences.saveUserToken("");
        MyApplication.hasLogined = false;
        // TODO 登录失败提示
    }
    @Override
    public void onException(Throwable exception) {
        //清理登录账号、token缓存,调用login失败后,不允许走自动登录。
        Preferences.saveUserAccount("");
        Preferences.saveUserToken("");
        MyApplication.hasLogined = false;
        // TODO 登录异常提示
    }
});

自动登录

手动登录接口调用成功后,下次启动应用可以使用自动登录的方式,调用自动登录后即使是登录未完成或者网络无法访问的时候也可以直接访问用户本地 SDK 数据。

流程图

2fe5863bfe0e671670d8c254c7eb71b0.png

接口使用

对 IM 进行初始化的时候(如 NIMClient.init),传入上次登录的 LoginInfo 对象,即可实现自动登录。其使用限制有:

  • 自动登录只能登录上次登录的账号,不能登录其他账号。

  • 需要某个账号曾经通过手动登录接口登录成功后才可以调用。

  • 无论之前是否有手动登录成功,只要最近一次手动登录接口调用失败,则不可以继续使用手动登录接口。

  • 当收到 KICKOUT、KICK_BY_OTHER_CLIENT、FORBIDDEN、PWD_ERROR、DATA_UPGRADE 这些登录状态的时候,会导致后续自动登录无效,需要用户通过手动登录接口重新登录。

LoginInfo loginInfo = null;
//获取之前登录成功保存的accid、token信息。
String account = Preferences.getUserAccount();
String token = Preferences.getUserToken();
if (!TextUtils.isEmpty(account)&&!TextUtils.isEmpty(token)){
    //之前已经登录过,可以走自动登录。
    hasLogined = true;
    loginInfo = new LoginInfo(account,token);
}
SDKOptions sdkOptions = new SDKOptions();
NIMClient.init(this,loginInfo,sdkOptions);

登录状态处理

IM 的登录状态表示当前登录账号与 IM 服务器实际建立的长连接情况,也可以理解为用户设备和服务端的网络连接状态。在IM初始接口调用之后,可以在应用的主页面注册 IM 的登录状态回调,用于监听当前的登录状态,通过 UI 层提示用户,其他使用场景一般只在手动登录成功后或者自动登录期间才需要处理。

流程图

645d70ab9452e0f439107f91b747632d.png

接口使用

可以通过 observeOnlineStatus 接口注册登录状态回调,该接口在 AuthServiceObserver.class 下,必须在 IM 初始化之后调用。

 Demo 体验 

Demo 源码

需要在主项目的 AndroidManifest.xml 中把 com.netease.nim.appKey 的配置改为您的 appkey:

https://nim-nosdn.netease.im/MTAxMTAwMg==/bmltYV8zMDg0ODY1NDk0OF8xNjY5NjE2Mjk3ODg4Xzc4NjY3NjgwLTU2NmItNGVjNi1hNDQ1LTc0MWFiNThmOGM0Mw==?createTime=1669616297922&download=NIMLogin.zip

关于网易云信

网易云信是集网易 24 年 IM 以及音视频技术打造的融合通信云服务专家,稳定易用的通信与视频 PaaS 平台。

提供融合通信与视频的核心能力与组件,包含 IM 即时通讯、5G 消息平台、一键登录、信令、短信与号码隐私保护等通信服务,音视频通话、直播、点播、互动直播与互动白板等音视频服务视频会议等组件服务。

网易云信服务于网易云音乐、好未来、新东方、科大讯飞、南京银行等各行各业客户,已有 100w+ 企业开发者接入云信服务。

 相关内容推荐 

f21b23fc1742c001360e597c3742bafe.jpeg

猜你喜欢

转载自blog.csdn.net/netease_im/article/details/128141298