即时通信 IM Android&iOS&Windows&Mac(登录登出)

初始化 IM SDK 后,需要调用 SDK 登录接口,验证账号身份,获得账号的功能使用权限。登录 IM SDK 成功后,才能正常使用消息、会话等功能。

相关产品
即时通信 IM 产品页,含版本规格、价格与购买入口。

一、功能描述

注意:除了获取会话列表、拉取历史消息这两个接口以外,SDK 的各项功能接口必须在登录成功后才能调用。因此在使用其他功能之前,请务必登录且确保登录成功,否则可能导致功能异常或不可用!
获取会话列表、拉取历史消息接口允许在登录失败的情况下调用,此时接口返回的是本地缓存的会话列表和历史消息,可用于无网络情况下展示。

二、登录

首次登录一个 IM 账号时,不需要先注册这个账号,直接登录即可。此时 IM 在登录过程中发现是未注册的账号,会自动注册。
你可以调用 login(Java / Swift / Objective-C / C++) 接口进行登录。

login 接口的关键参数如下:

参数 含义 说明
UserID 登录用户唯一标识 建议只包含大小写英文字母(a-z、A-Z)、数字(0-9)、下划线(_)和连词符(-)。长度不超过 32 字节。
UserSig 登录票据 由你的业务服务器进行计算以保证安全。计算方法请参考 UserSig 后台 API。

你需要在以下场景调用 login 接口:

·App 启动后首次使用 IM SDK 的功能。

·登录时票据过期:login 接口的回调会返回 ERR_USER_SIG_EXPIRED(6206) 或 ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001) 错误码,此时请你生成新的 userSig 重新登录。

·在线时票据过期:用户在线期间也可能收到 onUserSigExpired(Java / Swift / Objective-C / C++) 回调,此时需要你生成新的 userSig 并重新登录。

·在线时被踢下线:用户在线情况下被踢,IM SDK 会通过 onKickedOffline(Java / Swift / Objective-C / C++) 回调通知给你,此时可以在 UI 提示用户,并调用 login 重新登录。

·离线时被踢下线:用户离线情况下被踢,重新上线时默认会登录成功。如果需要返回离线被踢的错误码 ERR_LOGIN_KICKED_OFF_BY_OTHER(6208)需要在控制台单独开启接收被踢离线状态开关。

以下场景无需调用 login 接口:

·用户的网络断开并重新连接后,不需要调用 login 函数,IM SDK 会自动上线。

·当一个登录过程在进行时,不需要进行重复登录。

注意:1. 调用 IM SDK 接口成功登录后,将会开始计算 DAU,请根据业务场景合理调用登录接口,避免出现 DAU 过高的情况。

注意:2. 在一个 App 中,IM SDK 不支持多个账号同时在线,如果同时登录多个账号,只有最后登录的账号在线。

示例代码如下:

JavaSwiftObjective-CC++String userID = "your user id";String userSig = "userSig from your server";V2TIMManager.getInstance().login(userID, userSig, new V2TIMCallback() { @Override public void onSuccess() { Log.i("imsdk", "success"); } @Override public void onError(int code, String desc) { // 如果返回以下错误码,表示使用 UserSig 已过期,请你使用新签发的 UserSig 进行再次登录。 // 1. ERR_USER_SIG_EXPIRED(6206) // 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001) // 注意:其他的错误码,请不要在这里调用登录接口,避免 IM SDK 登录进入死循环。 Log.i("imsdk", "failure, code:" + code + ", desc:" + desc); }});let userID = "your user id";let userSig = "userSig from your server";V2TIMManager.shared.login(userID: userID, userSig: userSig) { print("login succ")} fail: { code, message in // 如果返回以下错误码,表示使用 UserSig 已过期,请你使用新签发的 UserSig 进行再次登录。 // 1. ERR_USER_SIG_EXPIRED(6206) // 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001) // 注意:其他的错误码,请不要在这里调用登录接口,避免 IM SDK 登录进入死循环。 if code == 6206 || code == 70001 { print("UserSig expired, please get a new UserSig.") } else { print("Login failure, code: \\(code), message: \\(message)") }}NSString *userID = @"your user id";NSString *userSig = @"userSig from your server";[[V2TIMManager sharedInstance] login:userID userSig:userSig succ:^{ NSLog(@"success");} fail:^(int code, NSString *desc) { // 如果返回以下错误码,表示使用 UserSig 已过期,请你使用新签发的 UserSig 进行再次登录。 // 1. ERR_USER_SIG_EXPIRED(6206) // 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001) // 注意:其他的错误码,请不要在这里调用登录接口,避免 IM SDK 登录进入死循环。 NSLog(@"failure, code:%d, desc:%@", code, desc);}];class LoginCallback final : public V2TIMCallback {public: LoginCallback() = default; ~LoginCallback() override = default; using SuccessCallback = std::function<void()>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess() override { if (success_callback_) { success_callback_(); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMString userID = "your user id";V2TIMString userSig = "userSig from your server";auto callback = new LoginCallback;callback->SetCallback( [=]() { std::cout << "success"; delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 如果返回以下错误码,表示使用 UserSig 已过期,请你使用新签发的 UserSig 进行再次登录。 // 1. ERR_USER_SIG_EXPIRED(6206) // 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001) // 注意:其他的错误码,请不要在这里调用登录接口,避免 IM SDK 登录进入死循环。 std::cout << "failure, code:" << error_code << ", desc:" << error_message.CString(); delete callback; });V2TIMManager::GetInstance()->Login(userID, userSig, callback);

三、获取登录用户

在登录成功后,通过调用getLoginUser(Java / Swift / ObjectiveC / C++) 获取登录用户 UserID。

如果登录失败,获取的登录用户 UserID 为空。

示例代码如下:

JavaSwiftObjective-CC++// 获取登录成功的用户 UserIDString loginUserID = V2TIMManager.getInstance().getLoginUser();// 获取登录成功的用户 UserIDlet loginUserID = V2TIMManager.shared.getLoginUser()// 获取登录成功的用户 UserIDNSString *loginUserID = [[V2TIMManager sharedInstance] getLoginUser];// 获取登录成功的用户 UserIDV2TIMString loginUserID = V2TIMManager::GetInstance()->GetLoginUser();

四、获取登录状态

通过调用getLoginStatus(Java / Swift / Objective-C / C++) 获取登录状态,如果用户已经处于已登录和登录中状态,请勿再频繁调用登录接口登录。IM SDK 支持的登录状态,如下表所示:

登录状态 含义
V2TIM_STATUS_LOGINED 已登录
V2TIM_STATUS_LOGINING 登录中
V2TIM_STATUS_LOGOUT 无登录

示例代码如下:

JavaSwiftObjective-CC++int loginStatus = V2TIMManager.getInstance().getLoginStatus();let loginStatus = V2TIMManager.shared.getLoginStatus()V2TIMLoginStatus loginStatus = [[V2TIMManager sharedInstance] getLoginStatus];V2TIMLoginStatus loginStatus = V2TIMManager::GetInstance()->GetLoginStatus();

五、多端登录与互踢

你可以在腾讯云控制台配置 IM SDK 的多端登录策略。
多端登录策略有多种可选,例如“移动或桌面平台可有1种平台在线+Web可同时在线”、“不同平台均可同时在线”。
相关配置请参考:登录设置。

你可以在腾讯云控制台配置 IM SDK 的同平台可登录实例数配置,即相同平台的设备可支持几个同时在线。

此功能仅限旗舰版或企业版使用。目前 Web 端可同时在线个数最多为 10 个。Android、iPhone、iPad、Windows、Mac 平台可同时在线设备个数最多为 3 个。

相关配置请参考:登录设置。

调用 login 接口时,如果同一个账号的多端登录策略超出限制,新登录的实例会把之前已登录的实例踢下线。
如果你在初始化时调用了 addIMSDKListener(Java / Swift / Objective-C / C++) 添加了 SDK 监听器,对于之前已登录的一方,会收到 onKickedOffline(Java / Swift / Objective-C / C++) 回调。

六、登出

普通情况下,如果你的应用生命周期跟 IM SDK 生命周期一致,退出应用前可以不登出,直接退出即可。
但有些特殊场景,例如你只在进入特定界面后才使用 IM SDK,退出界面后不再使用,此时可以调用logout(Java / Swift / Objective-C / C++) 接口登出 SDK。登出成功后,不会再收到其他人发送的新消息。注意这种情况下,登出成功后还需要调 unInitSDK(Java / Swift / Objective-C / C++) 对 SDK 进行反初始化。

示例代码如下:

JavaSwiftObjective-CC++V2TIMManager.getInstance().logout(new V2TIMCallback() { @Override public void onSuccess() { Log.i("imsdk", "success"); } @Override public void onError(int code, String desc) { Log.i("imsdk", "failure, code:" + code + ", desc:" + desc); }});V2TIMManager.shared.logout(succ: { print("logout succ.")}, fail: { code, desc in print("logout fail, code: \\(code), desc: \\(desc)")})[[V2TIMManager sharedInstance] logout:^{ NSLog(@"success");} fail:^(int code, NSString *desc) { NSLog(@"failure, code:%d, desc:%@", code, desc);}];class Callback final : public V2TIMCallback {public: using SuccessCallback = std::function<void()>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; Callback() = default; ~Callback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess() override { if (success_callback_) { success_callback_(); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMString userID = "your user id";V2TIMString userSig = "userSig from your server";auto callback = new Callback{};callback->SetCallback( [=]() { std::cout << "success"; delete callback; }, [=](int error_code, const V2TIMString& error_message) { std::cout << "failure, code:" << error_code << ", desc:" << error_message.CString(); delete callback; });V2TIMManager::GetInstance()->Logout(callback);

七、账号切换

如果你希望在应用中实现账号切换的需求,只需要每次切换账号时调用 login 即可。

例如已经登录了 alice,现在要切换到 bob,只需要直接 login bob 即可。login bob 前无需调用 logout alice,IM SDK 内部会自动处理。

赞 (0)
上一篇 4天前
下一篇 4天前