IM 登录最佳实践

更新时间: 2024/04/17 15:00:34

登录对于 IM 产品来说至关重要,是后续业务顺利进行的前提条件。开发者集成 NIM SDK 的各项能力时,如果未能正确使用登录接口或处理登录状态,将引发不必要的问题,影响开发进度。

本文介绍如何以最佳姿势实现 IM 登录。

  • 本文中的登录均指调用 login 方法登录,如需自动登录请自行在应用层实现。
  • 本文以静态 Token 鉴权为例,更多登录方式请参见登录及登出 IM

前提条件

  • 已在云信控制台创建应用,获取 App Key。

  • 集成 SDK

  • 已通过服务端注册 IM 账号 ,获取 IM 账号和对应的静态 token

    如果仅需要测试和调试,您可通过控制台注册 IM 测试账号。线上生产环境必须将测试账号及其 Token 替换为服务端生成的正式 IM 账号和 token

实现方案

登录一般是在用户登录应用,即在应用的登录界面点击登录按钮时进行。通用的登录方案是先实现应用自身账号体系的登录,成功后再使用返回的 IM 账号和 token 进行 IM 登录。

实现步骤

手动登录流程图.png

  1. 调用 login 方法手动登录 IM。
  2. 调用后处理逻辑:
    • 如果登录成功,保存 IM 账号和 token 到本地,用于下次应用启动时自动登录。
    • 如果登录失败,清理本地保存的用户登录信息,防止下次应用启动时自动登录。

请自行在应用层实现自动登录逻辑。

示例代码

Android
javaNIMClient.getService(V2NIMLoginService.class).login("account", "token", null, new V2NIMSuccessCallback<Void>() {
    @Override
    public void onSuccess(Void unused) {
        // TODO
    }
},
    new V2NIMFailureCallback() {
    @Override
    public void onFailure(V2NIMError error) {
        int code = error.getCode();
        String desc = error.getDesc();
        // TODO
    }
});
iOS
objective-c- (void)login
{
    NSString *account = @"account";
    NSString *token = @"token";
    [[NIMSDK sharedSDK].v2LoginService login:account token:token
            option:nil
              success:^{
        NSLog(@"login succ");
    }
              failure:^(V2NIMError * _Nonnull error) {
        NSLog(@"login fail: error = %@", error);
    }];
}
macOS/Windows
cppV2NIMLoginOption option;
loginService.login(
    "accountId",
    "token",
    option,
    []() {
        // login succeeded
    },
    [](V2NIMError error) {
        // login failed, handle error
    });
Web/uni-app/小程序/uni-app/小程序
typescripttry {
  await nim1.V2NIMLoginService.login("ACCOUNT_ID", "TOKEN", {
    "forceMode": false
  })  
} catch (err) {
  // TODO failed, check code
  // console.log(err.code)
}

获取登录状态

通过调用 getLoginStatus 获取登录状态,如果用户已经处于已登录和登录中状态,请勿再频繁调用登录接口登录。

登录状态 描述
V2NIM_LOGIN_STATUS_LOGOUT(0) 已登出
V2NIM_LOGIN_STATUS_LOGINED(1) 已登录
V2NIM_LOGIN_STATUS_LOGINING(2) 正在登录
Android
javaV2NIMLoginStatus status =  NIMClient.getV2NIMLoginService().getLoginStatus();
iOS
objective-c- (void)printLoginStatus:(V2NIMLoginStatus)status
{
    switch (status) {
        case V2NIM_LOGIN_STATUS_LOGOUT:
            NSLog(@"login status = logout");
            break;
        case V2NIM_LOGIN_STATUS_LOGINING:
            NSLog(@"login status = logining");
            break;
        case V2NIM_LOGIN_STATUS_LOGINED:
            NSLog(@"login status = logined");
            break;
        default:
            NSLog(@"login status = %ld", status);
    }
}

V2NIMLoginStatus status = [[[NIMSDK sharedSDK] v2LoginService] getLoginStatus];
macOS/Windows
C++auto loginStatus = loginService.getLoginStatus();
Web/uni-app/小程序/uni-app/小程序
typescriptconst loginStatus = nim.V2NIMLoginService.getLoginStatus()

获取登录连接状态

IM 登录连接状态表示当前登录的 NIM SDK 实例与云信服务端的长连接状态,也可以理解为用户客户端和云信服务端的网络连接状态。

通过调用 getLoginStatus 获取登录连接状态,您可以根据不同的状态进行界面提示相应的业务操作。

登录连接状态 描述
V2NIM_CONNECT_STATUS_DISCONNECTED(0) SDK 未连接服务端
V2NIM_CONNECT_STATUS_CONNECTED(1) SDK 已连接服务端
V2NIM_CONNECT_STATUS_CONNECTING(2) SDK 正在与服务端连接
V2NIM_CONNECT_STATUS_WAITING(3) SDK 正在等待与服务端重连
Android
javaV2NIMConnectStatus status=  NIMClient.getV2NIMLoginService().getConnectStatus();
iOS
objective-cV2NIMConnectStatus status = [[[NIMSDK sharedSDK] v2LoginService] getConnectStatus];
macOS/Windows
cppauto connectStatus = loginService.getConnectStatus();
Web/uni-app/小程序/uni-app/小程序
typescriptconst connectStatus = nim.V2NIMLoginService.getConnectStatus()
此文档是否对你有帮助?
有帮助
去反馈
  • 前提条件
  • 实现方案
  • 实现步骤
  • 示例代码
  • 获取登录状态
  • 获取登录连接状态