用户资料
更新时间: 2025/07/02 10:00:13
网易云信即时通讯 SDK(NetEase IM SDK,简称 NIM SDK)提供用户信息的托管,实现用户资料的统一管理和共享。
本文介绍了如何使用 NIM SDK 管理用户资料。您将了解如何更新、获取和搜索用户信息,以及如何监听用户资料变更事件。
支持平台
本文内容适用的开发平台或框架如下表所示,涉及的接口请参考下文 相关接口 章节:
安卓 | iOS | macOS/Windows | Web/uni-app/小程序 | Node.js/Electron | 鸿蒙 | Flutter |
---|---|---|---|---|---|---|
✔️️️️️️ | ✔️️️️️️ | ✔️️️️️️ | ✔️️️️️️ | ✔️️️️️️ | ✔️️️️️️ | ✔️️️ |
技术原理
NIM SDK 提供了完整的用户资料管理功能,包括:
- 更新自身用户资料
- 获取指定用户资料
- 根据关键信息搜索用户资料
- 监听用户资料变更事件
用户资料包括用户昵称、性别、头像、签名、手机、邮箱、生日等信息。SDK 会将用户资料缓存到本地,但是除自身的资料外,SDK 不保证其他用户资料的实时更新。以下事件会触发其他用户资料的更新:
- 登录时会同步好友的用户资料(注册数据同步
addLoginDetailListener.onDataSync
回调,完成会发出通知)。 - 收到其他用户发来消息时,如果消息发送者的用户资料有更新,则 SDK 会同步更新对方的用户资料。
- 直接调用 SDK 接口从服务器拉取最新的用户资料,具体请参考本文的 云端获取用户信息。
- 如果既不是好友,也未收到该用户发送的消息,则 SDK 不会实时更新对方的用户资料。
- 如果需要同步的用户资料较多,SDK 的同步时间可能会较长。
graph LR
A[登录] --> B[同步好友的用户资料]
B --> C{是否需要更新其他用户资料?}
C -->|是| D[收到消息时更新发送者资料]
C -->|是| E[主动调用 API 获取最新资料]
C -->|否| F[使用本地缓存资料]
前提条件
在使用用户资料管理功能之前,请确保您已完成以下步骤:
- 已实现 登录 IM。
- 了解 NIM SDK 中用户资料管理功能的原理。
监听用户相关事件
在进行用户相关操作前,您可以提前注册相关事件。注册成功后,当用户相关事件发生时,SDK 会触发对应回调通知。
注册监听
用户相关回调:
onUserProfileChanged
:用户资料变更回调,返回变更的用户资料列表。
示例代码:
调用 addUserListener
方法注册监听:
JavaNIMClient.getService(V2NIMUserService.class).addUserListener(new V2NIMUserListener() {
@Override
public void onUserProfileChanged(List<V2NIMUser> users) {
// 处理用户资料变更
}
});
调用 addUserListener
方法注册监听:
Objective-C[[[NIMSDK sharedSDK] V2NIMUserService] addUserListener:self];
- (void)onUserProfileChanged:(NSArray<V2NIMUser *> *)users {
// 处理用户资料变更
}
调用 addUserListener
方法注册监听:
C++V2NIMUserListener listener;
listener.onUserProfileChanged = [](std::vector<V2NIMUser> users) {
// user profile changed
};
listener.onBlockListAdded = [](V2NIMUser user) {
// user added to blocklist
};
listener.onBlockListRemoved = [](std::string accountId) {
// user removed from blocklist
};
userService.addUserListener(listener);
调用 on("EventName")
方法注册监听:
TypeScriptnim.V2NIMUserService.on("onUserProfileChanged", function (users: V2NIMUser[]) {})
调用 on("EventName")
方法注册监听:
TypeScriptv2.userService.on("userProfileChanged", function (users: V2NIMUser[]) {})
调用 on("EventName")
方法注册监听:
TypeScriptnim.userService.on("onUserProfileChanged", function (users: V2NIMUser[]) {})
调用 listen 方法注册监听:
Dartsubsriptions.add(NimCore.instance.userService.onUserProfileChanged.listen((e) {
//do somethin
移除监听
如需移除用户相关监听器,可调用 removeUserListener
方法。
JavaNIMClient.getService(V2NIMUserService.class).removeUserListener(listener);
如需移除用户相关监听器,可调用 removeUserListener
方法。
Objective-C[[[NIMSDK sharedSDK] V2NIMUserService] removeUserListener:self];
如需移除用户相关监听器,可调用 removeUserListener
方法。
C++V2NIMUserListener listener;
// ...
userService.addUserListener(listener);
// ...
userService.removeUserListener(listener);
如需移除用户相关监听器,可调用 off("EventName")
方法。
TypeScriptnim.V2NIMUserService.off("onUserProfileChanged", function (users: V2NIMUser[]) {})
如需移除用户相关监听器,可调用 off("EventName")
方法。
TypeScriptv2.userService.off("userProfileChanged", function (users: V2NIMUser[]) {})
如需移除用户相关监听器,可调用 off("EventName")
方法。
TypeScriptnim.userService.off("onUserProfileChanged", function (users: V2NIMUser[]) {})
如需移除用户相关监听器,可调用 cancel 方法。
Dartsubsriptions.forEach((subsription) {
subsription.cancel();
});
更新本人用户资料
调用 updateSelfUserProfile
方法更新自身的用户资料。
可可更新的字段包括:
name
:用户昵称avatar
:头像 URLgender
:性别birthday
:生日mobile
:手机号email
:邮箱sign
:个性签名serverExtension
:服务器扩展字段
更新用户资料成功后,SDK 会返回用户资料变更回调 onUserProfileChanged
,并同步缓存到本地。
示例代码:
JavaV2NIMUserUpdateParams updateParams = V2NIMUserUpdateParams.V2NIMUserUpdateParamsBuilder.builder()
.withAvatar(avatar)
.withBirthday(birthday)
.withEmail(email)
.withGender(gender)
.withMobile(mobile)
.withName(name)
.withServerExtension(serverExtension)
.withSign(sign)
.build();
NIMClient.getService(V2NIMUserService.class).updateSelfUserProfile(updateParams,
new V2NIMSuccessCallback<List<Void>>() {
@Override
public void onSuccess(List<Void> voids) {
// 处理成功回调
}
},
new V2NIMFailureCallback() {
@Override
public void onFailure(V2NIMError error) {
// 处理失败回调
}
});
Objective-C[[[NIMSDK sharedSDK] V2NIMUserService] updateSelfUserProfile:userService success:^{
//成功回调
} failure:^(V2NIMError * _Nonnull error) {
//失败回调
}];
C++V2NIMUserUpdateParams updateParams;
updateParams.name = "name";
userService.updateSelfUserProfile(
updateParams,
[]() {
// update success
},
[](V2NIMError error) {
// update failed, handle error
});
TypeScriptnim.V2NIMUserService.updateSelfUserProfile({
name: 'ab',
});
TypeScriptawait v2.userService.updateSelfUserProfile(updateParams)
name: 'ab',
});
TypeScriptnim.userService.updateSelfUserProfile({
name: 'ab'
})
});
Dartawait NimCore.instance.userService.updateSelfUserProfile(param)
获取用户资料
调用 getUserList
方法根据用户账号 ID 批量查询指定的用户资料列表。
该方法根据用户账号 ID 先从客户端本地获取用户资料数据,若本地数据缺失或不足,再查询服务端中的用户资料数据。
- 单次最多查询 150 个用户资料。
- 若传入的账号 ID 都不存在,则调用接口失败。若部分账号 ID 存在,则调用接口成功。调用结果只返回账号 ID 存在的用户资料,错误的账号 ID 不返回。
示例代码:
JavaNIMClient.getService(V2NIMUserService.class).getUserList(accountIds,
new V2NIMSuccessCallback<List<V2NIMUser>>() {
@Override
public void onSuccess(List<V2NIMUser> v2NIMUsers) {
// TODO: Implement onSuccess logic
}
},
new V2NIMFailureCallback() {
@Override
public void onFailure(V2NIMError error) {
// TODO: Implement onFailure logic
}
});
Objective-C[[[NIMSDK sharedSDK] V2NIMUserService] getUserList:@[@"accountId1",@"accountId2"] success:^(NSArray<V2NIMUser *> * _Nonnull result) {
// 成功回调
} failure:^(V2NIMError * _Nonnull error) {
// 失败回调
}];
C++nstd::vector<nstd::string> accountIds = {"test1", "test2"};
userService.getUserList(
accountIds,
[](nstd::vector<V2NIMUser> users) {
for (auto&& user : users) {
// do something
}
},
[](V2NIMError error) {
// get user list failed, handle error
});
TypeScriptconst userProfiles = await nim.V2NIMUserService.getUserList(['accid1', 'accid2'])
TypeScriptconst users = await v2.userService.getUserList(accountIds)
TypeScriptconst userProfiles = await nim.userService.getUserList(['accid1', 'accid2'])
Dartawait NimCore.instance.userService.getUserList(accountIds)
根据关键字搜索用户信息
调用 searchUserByOption
方法根据关键字信息搜索用户的资料信息。
该方法默认搜索用户的昵称,若有需要,也可以指定同时搜索用户账号和手机号。
示例代码:
JavaV2NIMUserSearchOption option = V2NIMUserSearchOption.V2NIMUserSearchOptionBuilder.builder("搜索关键字")
// 按需配置
// .withSearchAccountId()
// .withSearchMobile()
// .withSearchName()
.build();
NIMClient.getService(V2NIMUserService.class).searchUserByOption(option,
new V2NIMSuccessCallback<List<V2NIMUser>>() {
@Override
public void onSuccess(List<V2NIMUser> v2NIMUsers) {
}
}, new V2NIMFailureCallback() {
@Override
public void onFailure(V2NIMError error) {
}
});
Objective-CV2NIMUserSearchOption *option = [V2NIMUserSearchOption optionWithKeyword:@"keyword"];
// 按需配置
option.searchName = YES;
option.searchAccountId = YES;
option.searchMobile = YES;
[NIMSDK.sharedSDK.V2NIMUserService searchUserByOption:option
success:^(NSArray <V2NIMUser *> *result)
{
}
failure:^(V2NIMError *error)
{
}];
C++V2NIMUserSearchOption option;
option.keyword = "test";
userService.searchUserByOption(
option,
[](nstd::vector<V2NIMUser> users) {
for (auto&& user : users) {
// do something
}
},
[](V2NIMError error) {
// search user failed, handle error
});
TypeScripttry {
const users = await nim.V2NIMUserService.searchUserByOption({
keyword: 'nick',
searchName: true,
searchAccountId: false,
searchMobile: true
})
} catch(err) {
console.error('searchUserByOption Error:', err)
}
TypeScripttry {
const users = await v2.userService.searchUserByOption({
keyword: 'Alice',
searchName: true
})
} catch(err) {
console.error('searchUserByOption Error:', err)
}
TypeScripttry {
const users = await nim.userService.searchUserByOption({
keyword: 'nick',
searchName: true,
searchAccountId: false,
searchMobile: true
})
} catch(err) {
console.error('searchUserByOption Error:', err)
}
Dartawait NimCore.instance.userService.searchUserByOption(userSearchOption)
云端获取用户信息
调用 getUserListFromCloud
方法根据用户账号列表从服务器获取最新的用户信息。
- 查询用户信息一般建议使用
getUserList
接口,只有需要强制拉取最新用户信息才需要调用getUserListFromCloud
接口。 - 避免频繁调用云端接口,合理使用本地缓存。
示例代码:
JavaList<String> accountIds = new ArrayList<>();
accountIds.add("test01");
accountIds.add("test02");
NIMClient.getService(V2NIMUserService.class).getUserListFromCloud(accountIds, users -> {
//Query successful
}, error -> {
//Query failed
});
Objective-C[NIMSDK.sharedSDK.V2NIMUserService getUserListFromCloud:@[@"accounId1",@"accountId2"] success:^(NSArray<V2NIMUser *> * _Nonnull result) {
// 成功回调
} failure:^(V2NIMError * _Nonnull error) {
// 失败回调
}];
C++nstd::vector<nstd::string> accountIds = {"test1", "test2"};
userService.getUserListFromCloud(
accountIds,
[](nstd::vector<V2NIMUser> usersList) {
for (auto&& user : usersList) {
// do something
}
},
[](V2NIMError error) {
// get UserListFromCloud failed, handle error
});
TypeScriptconst users = await nim.V2NIMUserService.getUserListFromCloud(["AccountID1", "AccountID2"])
TypeScriptconst users = await v2.userService.getUserListFromCloud(accountIds)
TypeScriptconst users = await nim.userService.getUserListFromCloud(["AccountID1", "AccountID2"])
Dartawait NimCore.instance.userService.getUserListFromCloud(accountIds)
相关接口
通过使用以下 API,开发者可以为用户提供有效的用户资料管理功能,提升应用的用户体验。在实际开发中,请结合具体需求和场景,合理使用用户资料管理功能。
API | 说明 |
---|---|
addUserListener |
注册用户资料相关监听器 |
removeUserListener |
取消注册用户资料相关监听器 |
updateSelfUserProfile |
更新自己的用户资料 |
getUserList |
根据用户账号 ID 列表获取用户资料 |
searchUserByOption |
根据关键字信息搜索用户信息 |
getUserListFromCloud |
根据用户账号列表从服务器获取用户信息 |
API | 说明 |
---|---|
on("EventName") |
注册用户资料相关监听器 |
off("EventName") |
取消注册用户资料相关监听器 |
updateSelfUserProfile |
更新自己的用户资料 |
getUserList |
根据用户账号 ID 列表获取用户资料 |
searchUserByOption |
根据关键字信息搜索用户信息 |
getUserListFromCloud |
根据用户账号列表从服务器获取用户信息 |
API | 说明 |
---|---|
listen |
注册用户资料相关监听器 |
cancel |
取消注册用户资料相关监听器 |
updateSelfUserProfile |
更新自己的用户资料 |
getUserList |
根据用户账号 ID 列表获取用户资料 |
searchUserByOption |
根据关键字信息搜索用户信息 |
getUserListFromCloud |
根据用户账号列表从服务器获取用户信息 |
常见问题
Q: 为什么有时获取不到其他用户的最新资料?
A: SDK 不保证实时更新其他用户的资料。如需最新资料,请使用 getUserListFromCloud
方法。
Q: 更新自己的资料后,其他用户何时能看到?
A: 其他用户需要主动刷新或收到您发送的消息才会更新您的资料。
Q: 搜索用户时,如何提高搜索效率?
A: 可以通过设置 V2NIMUserSearchOption
的参数来缩小搜索范围,如只搜索昵称或只搜索账号。
Q: 如何处理用户资料变更的通知?
A: 注册 onUserProfileChanged
监听器,在回调中更新 UI 或本地存储的用户信息。
Q: 单次最多可以获取多少个用户的资料?
A: 单次最多可以获取 150 个用户的资料。如需获取更多,请分批次调用。