用户资料
更新时间: 2024/08/06 15:50:02
NetEase IM SDK(以下简称 NIM SDK)提供用户信息的托管,实现用户资料的统一管理和共享。
技术原理
NIM SDK 支持获取以及更新自己的用户资料信息,其中用户资料包括用户昵称、性别、头像、签名、手机、邮箱、生日等信息。SDK 中由 UserInfo
与其子接口 NimUserInfo
承载。
NIM SDK 会将用户资料缓存到本地,但是除自身的资料外,SDK 不保证其他用户资料的实时更新。以下事件会触发其他用户资料的更新:
- 登录后数据同步阶段,SDK 会自动同步好友的用户资料。
- 收到其他用户发来消息时,如果消息发送者有资料变更,则 SDK 会同步更新对方的用户资料并进行通知。
- 直接调用
fetchUserInfo
方法主动从服务器获取并刷新最新的用户资料。
如果需要同步的用户资料较多,SDK 的同步时间会相对较长。
前提条件
已 登录 IM。
监听用户资料变更事件回调
在进行用户相关操作前,可以调用 observeUserInfoUpdate
提前注册用户资料变更事件的监听。注册成功后,当用户资料发生变更时,SDK 会触发对应回调通知。
示例代码如下:
java// 注册/注销观察者
NIMClient.getService(UserServiceObserve.class).observeUserInfoUpdate(userInfoUpdateObserver, register);
// 用户资料变更观察者
private Observer<List<NimUserInfo>> userInfoUpdateObserver = new Observer<List<NimUserInfo>>() {
@Override
public void onEvent(List<NimUserInfo> users) {
...
}
};
更新本人的用户资料
调用 updateUserInfo
方法更新自己的用户资料。
更新资料成功后,SDK 会返回用户资料变更回调,并同步缓存到本地。
入参 fields
中传入需要更新的字段和新值,key 为字段,value 为对应的值。
示例代码如下:
javaMap<UserInfoFieldEnum, Object> fields = new HashMap<>(1);
fields.put(UserInfoFieldEnum.Name, "new name");
NIMClient.getService(UserService.class).updateUserInfo(fields)
.setCallback(new RequestCallbackWrapper<Void>() { ... });
-
如果需要更新头像,需要先将头像图片上传到云端后,再将 URL 传给 SDK。可以使用云信提供文件资源上传与下载服务,或其他第三方服务。
-
云信自带的文件资源上传与下载服务由接口
NosService
与NosServiceObserve
提供。
获取所有用户资料
从本地获取用户资料
建议在您的应用中做好用户资料缓存,查询用户资料都通过本地缓存进行。在用户资料有变化时,SDK 会通过您注册的观察者触发回调来通知您。此时,您的应用可更新缓存,并刷新界面。
获取批量用户资料
调用 getUserInfoList
方法通过用户帐号集合,从本地数据库批量获取用户资料列表。
示例代码如下:
javaList<NimUserInfo> users = NIMClient.getService(UserService.class).getUserInfoList(accounts);
获取指定用户资料
调用 getUserInfo
方法通过用户账号,从本地数据库获取用户资料。
示例代码如下:
javaNimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(account);
获取所有用户资料
调用 getAllUserInfo
方法获取本地数据库中所有的用户资料,一般适合在登录后构建用户资料缓存时使用。
示例代码如下:
javaList<NimUserInfo> users = NIMClient.getService(UserService.class).getAllUserInfo();
从云端获取用户资料
调用 fetchUserInfo
方法从服务器获取用户资料,一般在本地用户资料不存在时调用,获取后 SDK 会负责更新本地数据库。每次最多获取 150 个用户,如果量大,上层请自行分批获取。
示例代码如下:
javaNIMClient.getService(UserService.class).fetchUserInfo(accounts)
.setCallback(new RequestCallback<List<NimUserInfo>>() { ... });
此接口可以批量从服务器获取用户资料,从用户体验和流量成本考虑,不建议应用频繁调用此接口。对于用户数据实时性要求不高的页面,应尽量调用读取本地缓存接口。
用户检索
云信 IM 支持根据用户昵称或其他关键字信息搜索用户的资料信息。
根据用户昵称检索
调用 searchAccountByName
方法从本地数据库中获取具有指定昵称的用户的账号列表。
示例代码如下:
javaNIMClient.getService(UserService.class).searchAccountByName("nick").setCallback(new RequestCallbackWrapper<List<String>>() {
@Override
public void onResult(int code, List<String> result, Throwable exception) {
if (code == ResponseCode.RES_SUCCESS) {
// 成功
} else {
// 失败,错误码见code
}
if (exception != null) {
// error
}
}
});
根据关键字检索
调用 searchUserInfosByKeyword
方法搜索与关键字匹配的所有用户。
java/**
* 搜索与关键字匹配的所有用户
*
* @param keyword 关键字
* @return NimUserInfo
*/
InvocationFuture<java.util.List<NimUserInfo>> searchUserInfosByKeyword(java.lang.String keyword);