用户信息
要在 IMKit UI 上展示用户头像、昵称等,需要应用层(App)主动向 IMKit SDK 提供用户信息。
IMKit 使用 UserDataService 类统一管理用户信息数据。App 需要使用 UserDataService 向 IMKit 提供用户数据,用于在 UI 上展示。SDK 会在需要使用的时候回调 UserDataService 的相关方法。
- 用户信息:包含昵称、头像
- 群组信息:包含群组名称、群组头像
- 群成员用户信息:仅支持群用户昵称
提示
用户信息、群组信息 、群成员用户信息必须由应用您主动从 App 服务端获取,并提供给 IMKit SDK。融云鸿蒙 SDK 不提供 App 用户与群组信息托管服务。融云服务端的用户昵称及头像仅用于推送服务。
本文仅描述了应用层(App)如何使用 IMKit SDK 提供用户信息:
用户信息提供者
流程
用户信息、群组信息、群组成员信息流程完全一致,此处以用户信息为例
- IMKit 在收发消息时,会在会话列表和聊天页面展示消息内容,并展示对应的用户信息,此时 IMKit 检查内部是否缓存的有对应的用户信息
- IMKit 如果缓存有用户信息就正常展示
- IMKit 没有缓存的用户信息,就需要从 App 获取用户信息。IMKit 会触发
UserDataProvider.fetchUserInfo方法。 - App 没有缓存的情况下,从 APPServer 获取用户信息。
- APPServer 将用户信息返给 App,App 可以视情况将用户信息缓存。
- App 通过
UserDataProvider.fetchUserInfo将用户信息 return 给 IMKit - IMKit 获取用户信息,缓存起来,内部通过
UserDataListener.onUserInfoChanged来刷新消息 UI。
设置用户信息提供者
使用 UserDataService 的 setUserDataProvider 方法设置用户信息提供者。必须在 SDK 初始化之后,建立 IM 连接之前设置。建议在应用生命周期内设置。
TypeScript
// 设置用户信息提供者
RongIM.getInstance().userDataService().setUserDataProvider(userDataProvider);
动态提供用户信息
如果 IMKit 无法从 userDataService 中获取用户信息,将触发 UserDataProvider.fetchUserInfo 回调方法。App 应在该回调中提供 SDK 所需要的用户头像与昵称。
获取用户信息数据后,SDK 会自动设置、刷新用户头像与昵称,以及实现相关 UI 展示。
示例代码
TypeScript
let userDataProvider: UserDataProvider = {
fetchUserInfo: (userId: string): Promise<UserInfoModel> => {
// app 拿到用户信息后通过 Promise 返给 IMKit
// App 可以从数据库或者 APPServer 获取用户信息
return new Promise((resolve: Function) => {
let userInfo = new UserInfoModel(userId, "用户名称", "用户头像")
resolve(userInfo);
});
},
fetchGroupInfo: (groupId: string): Promise<GroupInfoModel> => {
// app 拿到群组信息后通过 Promise 返给 IMKit
// App 可以从数据库或者 APPServer 获取信息
return new Promise((resolve: Function) => {
let info = new GroupInfoModel(groupId, "群组名称", "群组头像")
resolve(info);
});
},
fetchGroupMemberInfo: (groupId: string, userId: string): Promise<GroupMemberInfoModel> => {
// app 拿到群组成员信息后通过 Promise 返给 IMKit
// App 可以从数据库或者 APPServer 获取信息
return new Promise((resolve: Function) => {
let info = new GroupMemberInfoModel(groupId, userId, "群成员名称", "群成员头像")
resolve(info);
});
},
fetchGroupMemberInfos: (groupId: string): Promise<Array<GroupMemberInfoModel>> => {
// app 拿到群组所有成员信息后通过 Promise 返给 IMKit
// App 可以从数据库或者 APPServer 获取信息
return new Promise((resolve: Function) => {
let array = new Array<GroupMemberInfoModel>();
for (let i = 0; i < 10; i++) {
let userId = "userId" + i;
let info = new GroupMemberInfoModel(groupId, userId, "群成员名称", "群成员头像")
array.push(info);
}
resolve(array);
});
},
/**
* 是否持久化存储用户信息到 SDK 的本地数据库, 默认为 true,
* @since 1.6.0
*/
isCacheUserInfo: true,
/**
* 是否持久化存储群组信息到 SDK 的本地数据库, 默认为 true,
* @since 1.6.0
*/
isCacheGroupInfo: true,
/**
* 是否持久化存储群成员信息到 SDK 的本地数据库, 默认为 true,
* @since 1.6.0
*/
isCacheGroupMemberInfo: true,
}
RongIM.getInstance().userDataService().setUserDataProvider(userDataProvider);