logout (Java / Swift / Objective-C / C++) 退出登录,但长连接中断的状态。通常情况下,此时可以接收到离线推送的消息。logout 退出登录。Set user status query and status change notification 开关,开关路径:Applications > Your App > Chat > Configuration > Login and Message > Set user status query and status change notification。
setSelfStatus(Java / Swift / Objective-C / C++) 设置 customStatus 字段来设置自己的自定义状态。
如果您提前调用 addIMSDKListener(Java / Swift / Objective-C / C++) 添加了 SDK 监听器,设置成功后会触发 onUserStatusChanged(Java / Swift / Objective-C / C++)回调。onUserStatusChanged 的使用请参见下文的 状态变更通知。setSelfStatus 接口时,设置 customStatus 为空来主动清除状态。setSelfStatus 不需要升级到专业版、专业版plus或企业版。customStatus最大为 100 字节。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([=]() {// 设置自己的状态成功delete callback;},[=](int error_code, const V2TIMString& error_message) {// 设置自己的状态失败delete callback;});V2TIMManager::GetInstance()->SetSelfStatus(status, callback);
getUserStatus,设置 userIDList 仅包含自己的 userID,可查询自己的状态。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) {// 查询自己的状态成功}@Overridepublic void onError(int code, String desc) {// 查询自己的状态失败}});
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) {// 查询自己的状态成功} fail:^(int code, NSString *desc) {// 查询自己的状态失败}];
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) {// 查询自己的状态成功delete callback;},[=](int error_code, const V2TIMString& error_message) {// 查询自己的状态失败delete callback;});V2TIMManager::GetInstance()->GetUserStatus(userIDList, callback);}
userIDList 为其他人的 userID 列表,可查询其他人的状态。Set user status query and status change notification,开关路径:Applications > Your App > Chat > Configuration > Login and Message。如果开关关闭,调用 getUserStatus 会报错。List<String> ids = Arrays.asList("userid1", "userid2", "userid3");V2TIMManager.getInstance().getUserStatus(ids, new V2TIMValueCallback<List<V2TIMUserStatus>>() {@Overridepublic void onSuccess(List<V2TIMUserStatus> v2TIMUserStatuses) {// 查询其他人的状态成功}@Overridepublic void onError(int code, String desc) {// 查询其他人的状态失败}});
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) {// 查询其他人的状态成功} fail:^(int code, NSString *desc) {// 查询其他人的状态失败}];
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) {// 查询其他人的状态成功delete callback;},[=](int error_code, const V2TIMString& error_message) {// 查询其他人的状态失败delete callback;});V2TIMManager::GetInstance()->GetUserStatus(userIDList, callback);
subscribeUserStatus(Java / Swift / Objective-C / C++) 订阅指定用户的状态。SDK 默认只支持订阅 200 个用户,当超过限制后,会淘汰掉最早订阅的用户。
当您所订阅的用户状态变更时(包括普通状态和自定义状态),您可以在 onUserStatusChanged(Java / Swift / Objective-C / C++) 回调中收到该用户的状态变更通知。subscribeUserStatus接口特性:onUserStatusChanged 回调。详情请参见下文的 状态变更通知。Set user status query and status change notification开关,开启后可以在 onUserStatusChanged 回调中收到所有好友的状态变更通知。subscribeUserStatus 主动订阅。订阅后可以在 onUserStatusChanged 回调中所订阅的好友的状态变更通知。Set user status query and status change notification,开关路径:Applications > Your App > Chat > Configuration > Login and Message。如果开关关闭,调用 subscribeUserStatus 会报错。List<String> useridList = Arrays.asList("userid1", "userid2", "userid3");V2TIMManager.getInstance().subscribeUserStatus(useridList, new V2TIMCallback() {@Overridepublic void onSuccess() {// 订阅用户状态成功}@Overridepublic void onError(int code, String desc) {// 订阅用户状态失败}});
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:^ {// 订阅用户状态成功} fail:^(int code, NSString *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_;};V2TIMStringVector userIDList;userIDList.PushBack("userid1");userIDList.PushBack("userid2");auto callback = new Callback{};callback->SetCallback([=]() {// 订阅用户状态成功delete callback;},[=](int error_code, const V2TIMString& error_message) {// 订阅用户状态成功delete callback;});V2TIMManager::GetInstance()->SubscribeUserStatus(userIDList, callback);
unsubscribeUserStatus (Java / Swift / Objective-C / C++) 取消订阅用户的状态或清空订阅列表。
如果您不想主动清空订阅列表,当账号离线或者退出登录后,SDK 默认延迟一段时间后自动清空订阅列表。List<String> useridList = Arrays.asList("userid1", "userid2", "userid3");V2TIMManager.getInstance().unsubscribeUserStatus(useridList, new V2TIMCallback() {@Overridepublic void onSuccess() {// 取消订阅用户状态成功}@Overridepublic void onError(int code, String desc) {// 取消订阅用户状态失败}});
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:^ {// 取消订阅用户状态成功} fail:^(int code, NSString *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_;};V2TIMStringVector userIDList;userIDList.PushBack("userid1");userIDList.PushBack("userid2");auto callback = new Callback{};callback->SetCallback([=]() {// 取消订阅用户状态成功delete callback;},[=](int error_code, const V2TIMString& error_message) {// 取消订阅用户状态失败delete callback;});V2TIMManager::GetInstance()->UnsubscribeUserStatus(userIDList, callback);
onUserStatusChanged (Java / Swift / Objective-C / C++) 回调出来,但不同类型的用户触发该通知的方式不同。addIMSDKListener 添加了 SDK 监听器,设置成功后,当自己的状态发生变更时,会触发 onUserStatusChanged 回调,您可以在其中获取到自己的最新状态。Set user status query and status change notification,当好友的状态发生变更时,会自动触发 onUserStatusChanged 回调。Set user status query and status change notification,并且仍然想感知好友的状态变更,您需要调用 subscribeUserStatus 主动订阅好友的状态。当好友的状态发生变更时,会自动触发 onUserStatusChanged 回调。subscribeUserStatus 的使用有限制,详情请参见上文的 订阅用户状态。subscribeUserStatus 主动订阅好友状态,那么当好友状态发生变更时,您将无法感知到。subscribeUserStatus 主动订阅。当该用户状态发生变更时,会触发 onUserStatusChanged 回调。subscribeUserStatus 的使用有限制,详情请参见上文的 订阅用户状态。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)) {// 自己的状态发生变更} else {// 其他人的状态发生变更}}}};V2TIMManager.getInstance().addIMSDKListener(v2TIMSDKListener);}
// 添加监听器V2TIMManager.shared.addIMSDKListener(listener: self)// 通知回调func onUserStatusChanged(userStatusList: [V2TIMUserStatus]) {let myselfUserID = V2TIMManager.shared.getLoginUser()for userStatus in userStatusList {if userStatus.userID == myselfUserID {// 自己的状态发生变更} else {// 其他人的状态发生变更}}}
// 添加监听器[V2TIMManager.sharedInstance addIMSDKListener:self];// 通知回调- (void)onUserStatusChanged:(NSArray<V2TIMUserStatus *> *)userStatusList {NSString *myselfUserID = V2TIMManager.sharedInstance.getLoginUser;for (V2TIMUserStatus *userStatus in userStatusList) {if ([userStatus.userID isEqualToString:myselfUserID]) {// 自己的状态发生变更} else {// 其他人的状态发生变更}}}
class SDKListener final : public V2TIMSDKListener {public:SDKListener() = default;~SDKListener() override = default;// 用户状态变更通知void OnUserStatusChanged(const V2TIMUserStatusVector& userStatusList) override {V2TIMString myselfUserID = V2TIMManager::GetInstance()->GetLoginUser();for (size_t i = 0; i < userStatusList.Size(); ++i) {if (myselfUserID == userStatusList[i].userID) {// 自己的状态发生变更} else {// 其他人的状态发生变更}}}};// 添加事件监听器,注意在移除监听器之前需要保持 sdkListener 的生命期,以免接收不到事件回调SDKListener sdkListener;V2TIMManager::GetInstance()->AddSDKListener(&sdkListener);
onUserStatusChanged (Java / Swift / Objective-C / C++) 通知。setSelfStatus 接口不限制专业版、专业版plus或企业版。getUserStatus 查询自己的状态,不限制专业版、专业版plus或企业版。getUserStatus 除了查询自己外的其他能力,均需要升级到专业版、专业版plus或企业版。subscribeUserStatus / unsubscribeUserStatus 接口的所有能力,均需要升级到专业版、专业版plus或企业版。setSelfStatus 接口不限频。getUserStatus 查询自己的状态,不限频。getUserStatus 除了查询自己的状态外,默认限制 5 秒 20 次请求,单次查询最大用户数不超过 500。subscribeUserStatus 接口,默认限制 5 秒 20 次请求,单次订阅最大用户数不超过 100。unsubscribeUserStatus 接口,默认限制 5 秒 20 次请求,单次取消订阅最大用户数不超过 100。文档反馈