logout (Java / Swift / Objective-C / C++) to log out, and the persistent connection is disconnected. In general, the user can receive offline push messages.logout to log out.Set user status query and status change notification. The switch path is: Applications > Your App > Chat > Configuration > Login and Message > Set user status query and status change notification.
setSelfStatus API (Java / Swift / Objective-C / C++) to set a user's own custom status through the customStatus field.
If you have called addIMSDKListener (Java / Swift / Objective-C / C++) to add a SDK listener, the onUserStatusChanged callback (Java / Swift / Objective-C / C++) will be triggered after the field is set successfully.setSelfStatus API, you can leave the customStatus field empty to clear the status.setSelfStatus, you don't need to upgrade to the Pro edition 、Pro Plus edition、Enterprise edition or enable the feature in the console.customStatus is up to 100 bytes.V2TIMUserStatus status = new V2TIMUserStatus();boolean clearStatus = true;if (clearStatus) {status.setCustomStatus(null);} else {status.setCustomStatus("listening to music");}V2TIMManager.getInstance().setSelfStatus(status, new V2TIMCallback() {@Overridepublic void onSuccess() {Log.i(TAG, "setSelfStatus succeed, CustomStatus is " + status.getCustomStatus());}@Overridepublic void onError(int code, String desc) {Log.e(TAG, "setSelfStatus error code = " + code + ", desc = " + desc);}});
let status = V2TIMUserStatus()let clearStatus = trueif clearStatus {status.customStatus = nil} else {status.customStatus = "listening to music"}V2TIMManager.shared.setSelfStatus(status: status) {print( "setSelfStatus succ")} fail: { code, desc inprint( "setSelfStatus fail, \\(code), \\(desc)")}
V2TIMUserStatus *status = [[V2TIMUserStatus alloc] init];BOOL clearStatus = YES;if (clearStatus) {status.customStatus = nil;} else {status.customStatus = @"listening to music";}[V2TIMManager.sharedInstance setSelfStatus:statussucc:^{NSLog(@"setSelfStatus succeed, customStatus: %@", status.customStatus);} fail:^(int code, NSString *desc) {NSLog(@"setSelfStatus error, 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_;};V2TIMUserStatus status;bool clearStatus = true;status.customStatus = clearStatus ? {} : "listening to music";auto callback = new Callback{};callback->SetCallback([=]() {// Set the user's own status successfullydelete callback;},[=](int error_code, const V2TIMString& error_message) {// Failed to set to the statusdelete callback;});V2TIMManager::GetInstance()->SetSelfStatus(status, callback);
getUserStatus API (Java / Swift / Objective-C / C++) to query the status of the current user or another user. The API will return the general status and custom status of the queried user.getUserStatus and set userIDList to their own userID to query their own status.String loginUserID = V2TIMManager.getInstance().getLoginUser();if (loginUserID == null || loginUserID.isEmpty()) {return;}List<String> ids = Arrays.asList(loginUserID);V2TIMManager.getInstance().getUserStatus(ids, new V2TIMValueCallback<List<V2TIMUserStatus>>() {@Overridepublic void onSuccess(List<V2TIMUserStatus> v2TIMUserStatuses) {// Queried the user's own status successfully}@Overridepublic void onError(int code, String desc) {// Failed to query the user's own status}});
if let userID = V2TIMManager.shared.getLoginUser() {V2TIMManager.shared.getUserStatus(userIDList: [userID]) { result inresult.forEach { item inprint( item.description)}} fail: { code, desc inprint( "getUserStatus fail, \\(code), \\(desc)")}}
NSString *loginUserID = V2TIMManager.sharedInstance.getLoginUser;if (loginUserID == nil || loginUserID.length == 0) {return;}[V2TIMManager.sharedInstance getUserStatus:@[loginUserID]succ:^(NSArray<V2TIMUserStatus *> *result) {// Queried the user's own status successfully} fail:^(int code, NSString *desc) {// Failed to query the user's own status}];
template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public:using SuccessCallback = std::function<void(const T&)>;using ErrorCallback = std::function<void(int, const V2TIMString&)>;ValueCallback() = default;~ValueCallback() override = default;void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {success_callback_ = std::move(success_callback);error_callback_ = std::move(error_callback);}void OnSuccess(const T& value) override {if (success_callback_) {success_callback_(value);}}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 loginUser = V2TIMManager::GetInstance()->GetLoginUser();if (!loginUser.Empty()) {V2TIMStringVector userIDList;userIDList.PushBack(loginUser);auto callback = new ValueCallback<V2TIMUserStatusVector>{};callback->SetCallback([=](const V2TIMUserStatusVector& userStatusList) {// Queried the user's own status successfullydelete callback;},[=](int error_code, const V2TIMString& error_message) {// Failed to query the user's own statusdelete callback;});V2TIMManager::GetInstance()->GetUserStatus(userIDList, callback);}
userIDList to the list of the userID values of other users to query their statuses.Set user status query and status change notification in the Console in advance. The switch path is: Applications > Your App > Chat > Configuration > Login and Message. If the switch is off, calling getUserStatus will result in an error.List<String> ids = Arrays.asList("userid1", "userid2", "userid3");V2TIMManager.getInstance().getUserStatus(ids, new V2TIMValueCallback<List<V2TIMUserStatus>>() {@Overridepublic void onSuccess(List<V2TIMUserStatus> v2TIMUserStatuses) {// Queried the status successfully}@Overridepublic void onError(int code, String desc) {// Failed to query the status}});
V2TIMManager.shared.getUserStatus(userIDList: ["userID1", "userID2", "userID3"]) { result inresult.forEach { item inprint(item.description)}} fail: { code, desc inprint( "getUserStatus fail, \\(code), \\(desc)")}
[V2TIMManager.sharedInstance getUserStatus:@[@"userid1", @"userid2", @"userid3"] succ:^(NSArray<V2TIMUserStatus *> *result) {// Queried the status successfully} fail:^(int code, NSString *desc) {// Failed to query the status}];
template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public:using SuccessCallback = std::function<void(const T&)>;using ErrorCallback = std::function<void(int, const V2TIMString&)>;ValueCallback() = default;~ValueCallback() override = default;void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {success_callback_ = std::move(success_callback);error_callback_ = std::move(error_callback);}void OnSuccess(const T& value) override {if (success_callback_) {success_callback_(value);}}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_;};V2TIMStringVector userIDList;userIDList.PushBack("userid1");userIDList.PushBack("userid2");auto callback = new ValueCallback<V2TIMUserStatusVector>{};callback->SetCallback([=](const V2TIMUserStatusVector& userStatusList) {// Queried the status successfullydelete callback;},[=](int error_code, const V2TIMString& error_message) {// Failed to query the statusdelete callback;});V2TIMManager::GetInstance()->GetUserStatus(userIDList, callback);
subscribeUserStatus API (Java / Swift / Objective-C / C++) to subscribe to the status of the specified user. By default, the IM SDK supports subscribing to the statuses of up to 200 users. After this limit is exceeded, the earliest subscribed user statuses will be removed.
When the user status (including general status and custom status) subscribed to changes, the status change notification can be received in the onUserStatusChanged callback (Java / Swift / Objective-C / C++).onUserStatusChanged callback. For more information, see Status Change Notification.onUserStatusChanged callback.subscribeUserStatus for subscription, after which a status change notification can be received in the onUserStatusChanged callback.Set user status query and status change notification toggle in the Console. The toggle path: Applications > Your App > Chat > Configuration > Login and Message. If the toggle is off, calling subscribeUserStatus will result in an error.List<String> useridList = Arrays.asList("userid1", "userid2", "userid3");V2TIMManager.getInstance().subscribeUserStatus(useridList, new V2TIMCallback() {@Overridepublic void onSuccess() {// Subscribed to the status successfully}@Overridepublic void onError(int code, String desc) {// Failed to subscribe to the status}});
V2TIMManager.shared.subscribeUserStatus(userIDList: ["userID1", "userID2", "userID3"]) {print( "subscribeUserStatus succ")} fail: { code, desc inprint( "subscribeUserStatus fail, \\(code), \\(desc)")}
[V2TIMManager.sharedInstance subscribeUserStatus:@[@"userid1", @"userid2", @"userid3"] succ:^ {// Subscribed to the status successfully} fail:^(int code, NSString *desc) {// Failed to subscribe to the status}];
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_;};V2TIMStringVector userIDList;userIDList.PushBack(u8"userid1");userIDList.PushBack(u8"userid2");auto callback = new Callback{};callback->SetCallback([=]() {// Subscribed to the status successfullydelete callback;},[=](int error_code, const V2TIMString& error_message) {// Subscribed to the status successfullydelete callback;});V2TIMManager::GetInstance()->SubscribeUserStatus(userIDList, callback);
unsubscribeUserStatus API (Java / Swift / Objective-C / C++) to unsubscribe from the user status or clear the subscription list.
If you do not manually clear your subscription list, your account's subscription relationships will automatically be cancelled after a long period of offline time (for example: if you do not log in again within 24 hours).List<String> useridList = Arrays.asList("userid1", "userid2", "userid3");V2TIMManager.getInstance().unsubscribeUserStatus(useridList, new V2TIMCallback() {@Overridepublic void onSuccess() {// Unsubscribed from the status successfully}@Overridepublic void onError(int code, String desc) {// Failed to unsubscribe from the status}});
V2TIMManager.shared.unsubscribeUserStatus(userIDList: ["userID1", "userID2", "userID3"]) {print( "unsubscribeUserStatus succ")} fail: { code, desc inprint( "unsubscribeUserStatus fail, \\(code), \\(desc)")}
[V2TIMManager.sharedInstance unsubscribeUserStatus:@[@"userid1", @"userid2", @"userid3"] succ:^ {// Unsubscribed from the status successfully} fail:^(int code, NSString *desc) {// Failed to unsubscribe from the status}];
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_;};V2TIMStringVector userIDList;userIDList.PushBack(u8"userid1");userIDList.PushBack(u8"userid2");auto callback = new Callback{};callback->SetCallback([=]() {// Unsubscribed from the status successfullydelete callback;},[=](int error_code, const V2TIMString& error_message) {// Failed to unsubscribe from the statusdelete callback;});V2TIMManager::GetInstance()->UnsubscribeUserStatus(userIDList, callback);
onUserStatusChanged (Java / Swift / Objective-C / C++), but different types of users trigger the notification differently.addIMSDKListener to add an SDK listener, after a user's own status is set successfully, when the status changes, the onUserStatusChanged callback will be triggered, where the user can get the latest own status.onUserStatusChanged callback will be automatically triggered.subscribeUserStatus to subscribe to friends' statuses. When a friend's status changes, the onUserStatusChanged callback will be automatically triggered.subscribeUserStatus to subscribe to friends' statuses, changes in friends' statuses cannot be obtained.subscribeUserStatus to subscribe to the status. When the user's status changes, the onUserStatusChanged callback will be triggered, where the user can get the latest status of the non-friend user.private void initListener() {V2TIMSDKListener v2TIMSDKListener = new V2TIMSDKListener() {@Overridepublic void onUserStatusChanged(List<V2TIMUserStatus> userStatusList) {String myselfUserID = V2TIMManager.getInstance().getLoginUser();for (V2TIMUserStatus item : userStatusList) {if (item.getUserID().equals(myselfUserID)) {// The user's own status changed.} else {// The status of another user changed.}}}};V2TIMManager.getInstance().addIMSDKListener(v2TIMSDKListener);}
// Adding a listenerV2TIMManager.shared.addIMSDKListener(listener: self)// Notification callbackfunc onUserStatusChanged(userStatusList: [V2TIMUserStatus]) {let myselfUserID = V2TIMManager.shared.getLoginUser()for userStatus in userStatusList {if userStatus.userID == myselfUserID {// The user's own status changed.} else {// The status of another user changed.}}}
// Adding a listener[V2TIMManager.sharedInstance addIMSDKListener:self];// Notification callback- (void)onUserStatusChanged:(NSArray<V2TIMUserStatus *> *)userStatusList {NSString *myselfUserID = V2TIMManager.sharedInstance.getLoginUser;for (V2TIMUserStatus *userStatus in userStatusList) {if ([userStatus.userID isEqualToString:myselfUserID]) {// The user's own status changed.} else {// The status of another user changed.}}}
class SDKListener final : public V2TIMSDKListener {public:SDKListener() = default;~SDKListener() override = default;// User status change notificationvoid OnUserStatusChanged(const V2TIMUserStatusVector& userStatusList) override {V2TIMString myselfUserID = V2TIMManager::GetInstance()->GetLoginUser();for (size_t i = 0; i < userStatusList.Size(); ++i) {if (myselfUserID == userStatusList[i].userID) {// The user's own status changed.} else {// The status of another user changed.}}}};// Note that `sdkListener` should not be released before the IM SDK is uninitialized,// otherwise the message callback cannot be called.SDKListener sdkListener;V2TIMManager::GetInstance()->AddSDKListener(&sdkListener);
onUserStatusChanged notification (Java / Swift / Objective-C / C++) to other logged-in clients.setSelfStatus API.getUserStatus API to query a user's own status.getUserStatus API to query another user's status.subscribeUserStatus / unsubscribeUserStatus API.setSelfStatus API can be called an unlimited number of times.getUserStatus API is used to query a user's own status and can be called an unlimited number of times.getUserStatus API can be called 20 times every five seconds if used to query the status of another user, and the statuses of up to 500 users can be queried at a time.subscribeUserStatus API can be called 20 times every five seconds, and the statuses of up to 100 users can be subscribed to at a time.unsubscribeUserStatus API can be called 20 times every five seconds, and up to 100 users can be unsubscribed from at a time.Feedback