用户资料

功能描述

用户可以查询自己、好友、非好友的信息;可以修改自己的昵称、头像、签名等信息;可以修改好友的备注、分组等信息。

关系链事件监听器

您可以调用 addFriendListener (Android / iOS & Mac / Windows) 添加关系链事件监听器。
当不想再接收关系链事件时,可调用 removeFriendListener (Android / iOS & Mac / Windows) 移除关系链事件监听器。
注意
只有预先设置好关系链事件监听器,才能正常接收到下文中的各种事件通知。
示例代码如下:
Android
iOS & Mac
Windows
// 添加关系链监听器
V2TIMManager.getFriendshipManager().addFriendListener(listener);
// 移除关系链监听器
V2TIMManager.getFriendshipManager().removeFriendListener(listener);
// 添加关系链监听器
// self 为 id<V2TIMFriendshipListener>
[[V2TIMManager sharedInstance] addFriendListener:self];

// 移除关系链监听器
[[V2TIMManager sharedInstance] removeFriendListener:self];
class FriendshipListener final : public V2TIMFriendshipListener {
// 成员 ...
};

// 添加关系链事件监听器,注意在移除监听器之前需要保持 friendshipListener 的生命期,以免接收不到事件回调
FriendshipListener friendshipListener;
V2TIMManager::GetInstance()->GetFriendshipManager()->AddFriendListener(&friendshipListener);

// 移除关系链监听器
V2TIMManager::GetInstance()->GetFriendshipManager()->RemoveFriendListener(&friendshipListener);

查询和修改用户资料

查询和修改自己的资料

您可以调用 getUsersInfo (Android / iOS & Mac / Windows) 接口查询个人资料,其中参数 userIDList 需填入自己的 UserID。
示例代码如下:
Android
iOS & Mac
Windows
// 获取个人资料
String loginUser = V2TIMManager.getInstance().getLoginUser();
List<String> userIDList = new ArrayList<>();
userIDList.add(loginUser);
V2TIMManager.getInstance().getUsersInfo(userIDList, new V2TIMValueCallback<List<V2TIMUserFullInfo>>() {
@Override
public void onSuccess(List<V2TIMUserFullInfo> profiles) {
// 获取个人资料成功
}
@Override
public void onError(int code, String desc) {
// 获取个人资料失败
}
});
// 获取个人资料
NSString *loginUser = [[V2TIMManager sharedInstance] getLoginUser];
[[V2TIMManager sharedInstance] getUsersInfo:@[loginUser] succ:^(NSArray<V2TIMUserFullInfo *> *infoList) {
// 获取个人资料成功
} 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();
V2TIMStringVector userIDList;
userIDList.PushBack(loginUser);

auto callback = new ValueCallback<V2TIMUserFullInfoVector>{};
callback->SetCallback(
[=](const V2TIMUserFullInfoVector& userFullInfoList) {
// 获取个人资料成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 获取个人资料失败
delete callback;
});

V2TIMManager::GetInstance()->GetUsersInfo(userIDList, callback);
您可以调用 setSelfInfo (Android / iOS & Mac / Windows) 接口修改个人资料。 个人资料包括昵称、头像、签名、性别、出生日期、好友验证方式等,详情可参考 V2TIMUserFullInfo(Android / iOS & Mac / Windows) 类定义。 资料修改成功后,您会收到 onSelfInfoUpdated (Android / iOS & Mac / Windows) 回调。
示例代码如下:
Android
iOS & Mac
Windows
// 设置个人资料
V2TIMUserFullInfo info = new V2TIMUserFullInfo();
info.setNickname("nickName");
info.setFaceUrl("faceUrl");
V2TIMManager.getInstance().setSelfInfo(info, new V2TIMCallback() {
@Override
public void onSuccess() {
// 设置个人资料成功
}

@Override
public void onError(int code, String desc) {
// 设置个人资料失败
}
});

// 监听个人资料变更回调
V2TIMManager.getInstance().addIMSDKListener(new V2TIMSDKListener() {
@Override
public void onSelfInfoUpdated(V2TIMUserFullInfo info) {
// 收到个人资料变更回调
}
});
// 设置个人资料
V2TIMUserFullInfo *info = [[V2TIMUserFullInfo alloc] init];
info.nickName = @"nickName";
info.faceURL = @"faceURL";
[[V2TIMManager sharedInstance] setSelfInfo:info succ:^{
// 设置个人资料成功
} fail:^(int code, NSString *desc) {
// 设置个人资料失败
}];

// 监听个人资料变更回调
[[V2TIMManager sharedInstance] addIMSDKListener:self];
- (void)onSelfInfoUpdated:(V2TIMUserFullInfo *)Info {
// 收到个人资料变更回调
}
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_;
};

V2TIMUserFullInfo info;
info.nickName = u8"nickName";
info.faceURL = u8"faceUrl";
info.modifyFlag = V2TIMUserInfoModifyFlag::V2TIM_USER_INFO_MODIFY_FLAG_NICK |
V2TIMUserInfoModifyFlag::V2TIM_USER_INFO_MODIFY_FLAG_FACE_URL;

auto callback = new Callback{};
callback->SetCallback(
[=]() {
// 设置个人资料成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 设置个人资料失败
delete callback;
});

V2TIMManager::GetInstance()->SetSelfInfo(info, callback);

// 监听个人资料变更回调
class SDKListener final : public V2TIMSDKListener {
public:
SDKListener() = default;
~SDKListener() override = default;

void OnSelfInfoUpdated(const V2TIMUserFullInfo& info) override {
// 收到个人资料变更回调
}
// 其他成员 ...
};
// 添加事件监听器,注意在移除监听器之前需要保持 sdkListener 的生命期,以免接收不到事件回调
SDKListener sdkListener;
V2TIMManager::GetInstance()->AddSDKListener(&sdkListener);

查询和修改好友资料

您可以调用 getFriendsInfo (Android / iOS & Mac / Windows) 接口查询指定的好友资料,调用 setFriendInfo(Android / iOS & Mac / Windows) 接口修改好友资料。详情请参考 好友管理

查询非好友用户资料

您可以调用 getUsersInfo (Android / iOS & Mac / Windows) 接口查询非好友资料,其中参数 userIDList 填入非好友的 UserID 即可。
说明
1. 不能修改非好友的资料。
2. 非好友资料更新时,由于没有好友关系,后台无法向 SDK 发送系统通知,因此 SDK 无法实时更新非好友资料。为了避免每次获取用户资料都向后台发起网络请求,节省网络资源,SDK 增加了缓存逻辑,对同一个用户主动向后台拉取资料的时间间隔为 10 分钟。
示例代码如下:
Android
iOS & Mac
Windows
List<String> userIDList = new ArrayList<>();
userIDList.add("userA");
V2TIMManager.getInstance().getUsersInfo(userIDList, new V2TIMValueCallback<List<V2TIMUserFullInfo>>() {
@Override
public void onSuccess(List<V2TIMUserFullInfo> profiles) {
// 获取非好友资料成功
}

@Override
public void onError(int code, String desc) {
// 获取非好友资料失败
}
});
// 获取非好友资料
[[V2TIMManager sharedInstance] getUsersInfo:@[@"userA"] succ:^(NSArray<V2TIMUserFullInfo *> *infoList) {
// 获取非好友资料成功
} 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(u8"userA");

auto callback = new ValueCallback<V2TIMUserFullInfoVector>{};
callback->SetCallback(
[=](const V2TIMUserFullInfoVector& userFullInfoList) {
// 获取非好友资料成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 获取非好友资料失败
delete callback;
});

V2TIMManager::GetInstance()->GetUsersInfo(userIDList, callback);

订阅非好友用户资料

您可以调用接口subscribeUserInfo (Android / iOS & Mac / Windows) 来订阅非好友用户的资料,订阅成功后,当被订阅的非好友用户资料发生变更时,IM SDK 会通过 onUserInfoChanged (Android / iOS & Mac / Windows) 回调通知给您。
通过订阅非好友用户资料,您可以实时感知某些非好友用户资料的变更。好友的资料和自己的资料都不需要订阅,当好友或自己的资料变更时,默认会通过onFriendInfoChanged onSelfInfoUpdated 回调来通知给您。
说明:
该功能仅对进阶版客户开放,购买进阶版并且在控制台开启“User Profile Change Subscription”后可以使用,开关路径:Applications > Your App > Chat > Configuration > Login and Message > User Profile Change Subscription。
该功能仅增强版 SDK 7.4 及以上版本支持。
订阅列表最多允许订阅 200 个,超过限制后,会自动淘汰最早订阅的用户(订阅好友也会占用这 200 个名额)。
该接口限频默认为 5 秒 20 次请求,且单次订阅最大用户数不超过 100 人。
示例代码如下:
Android
iOS & Mac
Windows
List<String> useridList = Arrays.asList("useridA", "useridB", "useridC");
V2TIMManager.getInstance().subscribeUserInfo(useridList, new V2TIMCallback() {
@Override
public void onSuccess() {
// 订阅用户资料成功
}

@Override
public void onError(int code, String desc) {
// 订阅用户资料失败
}
});
[V2TIMManager.sharedInstance subscribeUserInfo:@[@"useridA", @"useridB", @"useridC"]
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(u8"useridA");
userIDList.PushBack(u8"useridB");

auto callback = new Callback{};
callback->SetCallback(
[=]() {
// 订阅用户资料成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 订阅用户资料成功
delete callback;
});

V2TIMManager::GetInstance()->SubscribeUserInfo(userIDList, callback);

取消订阅非好友用户资料

如果您不想接收订阅用户资料变更通知,可以调用接口unsubscribeUserInfo (Android / iOS & Mac / Windows) 来取消某些已订阅用户。
当传入的用户列表为空时,会取消当前所有的订阅。
说明:
该功能仅对进阶版客户开放,购买进阶版并且在控制台开启“User Profile Change Subscription”后可以使用,开关路径:Applications > Your App > Chat > Configuration > Login and Message > User Profile Change Subscription。
该功能仅增强版 SDK 7.4 及以上版本支持。
该接口限频默认为 5 秒 20 次请求,且单次取消订阅最大用户数不超过 100 人。
示例代码如下所示:
Android
iOS
Windows
List<String> useridList = Arrays.asList("useridA", "useridB", "useridC");
V2TIMManager.getInstance().unsubscribeUserInfo(useridList, new V2TIMCallback() {
@Override
public void onSuccess() {
// 取消订阅用户资料成功
}

@Override
public void onError(int code, String desc) {
// 取消订阅用户资料失败
}
});
[V2TIMManager.sharedInstance unsubscribeUserInfo:@[@"useridA", @"useridB", @"useridC"]
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(u8"useridA");
userIDList.PushBack(u8"useridB");

auto callback = new Callback{};
callback->SetCallback(
[=]() {
// 取消订阅用户资料成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 取消订阅用户资料失败
delete callback;
});

V2TIMManager::GetInstance()->UnsubscribeUserInfo(userIDList, callback);

用户资料变更通知

根据用户类型的不同,用户资料变更可以分为如下三种:
1. 自己的资料变更,通过 onSelfInfoUpdated (Android / iOS & Mac / Windows) 回调通知。
2. 好友的资料变更,通过 onFriendInfoChanged (Android / iOS & Mac / Windows) 回调通知。
3. 订阅用户(非好友)的资料变更,通过 onUserInfoChanged (Android / iOS & Mac / Windows) 回调通知。
其中 onSelfInfoUpdatedonUserInfoChanged 回调需要您调用addIMSDKListener (Android / iOS & Mac / Windows) 通过添加 SDK 监听器来设置,onFriendInfoChanged回调需要您调用 addFriendListener (Android / iOS & Mac / Windows) 通过添加关系链监听器来设置。
注意:
只有满足如下条件的用户,其资料变更才会通过 onUserInfoChanged 回调进行通知:
1. 使用 subscribeUserInfo 订阅成功的用户
2. 非好友关系的用户
示例代码如下:
Android
iOS & Mac
Windows
V2TIMSDKListener v2TIMSDKListener = new V2TIMSDKListener() {
@Override
public void onSelfInfoUpdated(V2TIMUserFullInfo info) {
// 收到自己的资料变更通知
}
@Override
public void onUserInfoChanged(List<V2TIMUserFullInfo> infoList) {
// 收到订阅用户 (非好友) 的资料变更通知
}
};

// 添加 SDK 监听器
V2TIMManager.getInstance().addIMSDKListener(v2TIMSDKListener);


V2TIMFriendshipListener v2TIMFriendshipListener = new V2TIMFriendshipListener() {
@Override
public void onFriendInfoChanged(List<V2TIMFriendInfo> infoList) {
// 收到好友资料变更通知
}
};

// 添加关系链监听器
V2TIMManager.getFriendshipManager().addFriendListener(v2TIMFriendshipListener);
// 添加 SDK 监听器
[[V2TIMManager sharedInstance] addIMSDKListener:self];

- (void)onSelfInfoUpdated:(V2TIMUserFullInfo *)info {
// 收到自己的资料变更回调
}

- (void)onUserInfoChanged:(NSArray<V2TIMUserFullInfo *> *)infoList {
// 收到订阅用户 (非好友) 的资料变更通知
}


// 添加关系链监听器
[[V2TIMManager sharedInstance] addFriendListener:self];

- (void)onFriendProfileChanged:(NSArray<V2TIMFriendInfo *> *)infoList {
// 收到好友资料变更通知
}
class SDKListener final : public V2TIMSDKListener {
public:
SDKListener() = default;
~SDKListener() override = default;

void OnSelfInfoUpdated(const V2TIMUserFullInfo& Info) override {
// 收到自己的资料变更回调
}
void OnUserInfoChanged(const V2TIMUserFullInfoVector& InfoList) override {
// 收到订阅用户 (非好友) 的资料变更通知
}
// 其他成员函数 ...
};

// 添加 SDK 事件监听器,注意在移除监听器之前需要保持 sdkListener 的生命期,以免接收不到事件回调
SDKListener sdkListener;
V2TIMManager::GetInstance()->AddSDKListener(&sdkListener);


class FriendshipListener final : public V2TIMFriendshipListener {
public:
FriendshipListener() = default;
~FriendshipListener() override = default;

void OnFriendInfoChanged(const V2TIMFriendInfoVector& InfoList) override {
// 收到好友资料变更通知
}
// 其他成员函数 ...
};

// 添加关系链事件监听器,注意在移除监听器之前需要保持 friendshipListener 的生命期,以免接收不到事件回调
FriendshipListener friendshipListener;
V2TIMManager::GetInstance()->GetFriendshipManager()->AddFriendListener(&friendshipListener);