IM 登录最佳实践
更新时间: 2023/09/22 17:33:37
登录对于 IM 产品来说至关重要,是后续业务顺利进行的前提条件。开发者集成 NIM SDK 的各项能力时,如果未能正确使用登录接口或处理登录状态,将引发不必要的问题,影响开发进度。本文介绍如何以最佳姿势进行手动登录和自动登录,进而实现 IM 登录。
- 手动登录:首次登录 IM 时调用
AuthService.login
方法实现。 - 自动登录:手动登录 IM 成功之后调用,具体调用方式为在初始化时传入的上次登录的信息
loginInfo
。
本文的手动登录仅以静态 Token 登录为例,更多登录相关说明请参见登录 IM。
前提条件
-
已在云信控制台创建应用,获取 App Key。
-
已通过云信服务端注册 IM 账号 ,获取 IM 账号(
accid
)和对应的静态token
。您也可通过控制台注册 IM 测试账号。测试账号及对应的静态
token
仅适用于调试环境,线上生产环境必须将测试账号及其token
替换为云信服务端生成的正式accid
和token
。
实现方案
手动登录
IM 手动登录接口的调用,需要在用户登录应用时(即在应用的登录界面点击登录按钮时)进行,其他情况一般不需要调用手动登录接口。在登录界面中,IM 登录可以作为整个应用登录过程的一个环节。常见的方案是先实现应用自身账号体系的登录,成功后再使用返回的accid
和token
进行 IM 的登录。
-
手动登录流程
-
接口调用
- 调用
AuthService.login
方法手动登录云信IM。 - 调用后处理。
- 如果登录成功,保存 IM 的
accid
和token
到本地,方便下次应用启动自动登录时使用。 - 如果登录失败,清理本地保存的用户登录信息,防止下次启动走自动登录逻辑。
- 如果登录成功,保存 IM 的
示例代码如下:
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 登录异常提示 } });
- 调用
自动登录
手动登录 IM 成功后,下次启动应用可以使用云信 IM 的自动登录模式。自动登录后,即使登录未完成或者网络无法访问,应用也可以直接访问用户本地 SDK 数据。
-
自动登录流程
-
接口调用
初始化 NIM SDK 时(如调用
NIMClient.init
方法),传入上次登录的LoginInfo
对象,即可实现自动登录。自动登录的使用限制如下:
- 自动登录只能登录上次登录的IM 账号,不能登录其他账号。
- 需要某个 IM 账号曾经通过手动登录接口登录成功后才可以调用。
- 无论之前是否曾经手动登录成功,只要最近一次手动登录接口调用失败,则不可以继续自动登录。
- 当收到
KICKOUT
、KICK_BY_OTHER_CLIENT
、FORBIDDEN
、PWD_ERROR
、DATA_UPGRADE
这些IM 登录状态时,后续自动登录将无效,需要用户通过手动登录接口重新登录。更多相关说明,见下文的登录状态处理。
实现自动登录的示例代码如下:
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 登录状态表示当前登录的 NIM SDK 实例与云信服务端的长连接状态,也可以理解为用户设备和云信服务端的网络连接状态。调用初始化接口之后,可以在应用的主界面调用observeOnlineStatus
方法注册 IM 的登录状态回调,监听当前的登录状态,并通过 UI 层提示用户。其他使用场景一般只需要在手动登录成功后或者自动登录期间才需要处理 IM 登录状态。
observeOnlineStatus
方法必须在 NIM SDK 初始化之后调用。
登录状态处理的流程图如下:

示例代码如下:
/**
* 用户在线状态观察者
*/
private Observer<StatusCode> onlineStatusObserver = new Observer<StatusCode>() {
@Override
public void onEvent(StatusCode statusCode) {
// TODO 通过ui层处理把当前状态展示给用户
tvLoginStatus.setText(userStatus);
if (!MyApplication.hasLogined){
//TODO 如果尚未登录过,可以根据自己业务需求确定是否需要进入登录页面
}else if(statusCode.wontAutoLogin()){
//TODO 如果登录过,并且不能自动重连的情况下,必须跳转到登录页面
}else{
//TODO 不做任何处理,状态事件结束
})
}
};
NIMClient.getService(AuthServiceObserver.class).observeOnlineStatus(onlineStatusObserver,true);
Sample Code 下载
体验 Sample Code 时需在主项目的AndroidManifest.xml
中把com.netease.nim.appKey
的配置改为您自己的 App Key。