群成员用户信息
IMKit 支持两种用户信息展示方式
- 用户信息提供者代理方式(当前文档):必须由应用开发者主动从 App 服务端获取用户信息、群组信息、群成员用户信息,并提供给 SDK。融云服务端注册获取 Token 时传入的用户昵称及头像仅用于推送服务。
- [用户信息托管方式]:5.12.0 版本及之后,IMKit 支持用户切换信息托管方式实现会话页面和会话列表用户、群组信息的显示。
IMKit 使用 RongUserInfoManager 类统一管理以下数据。App 需要使用 RongUserInfoManager
向 IMKit 提供数据,用于在 UI 上展示。
- 用户信息:包含昵称、头像
- 群组信息:包含群组名称、群组头像
- 群成员用户信息:仅支持群用户昵称
本文仅描述了应用层(App)如何为 IMKit SDK 提供群成员昵称与头像(GroupUserInfo)。
刷新群成员用户信息
如果 App 本地持有群组用户信息数据(群昵称),可直接刷新本地缓存和数据库中存储的群组用户信息数据。刷新后,IMKit UI 会展示最新的群成员用户信息 GroupUserInfo。
刷新群组用户信息必须在 IMKit 已成功建立 IM 连接后操作,否则无法刷新本地数据。可能适用场景如下:
- App 首次启动,并成功建立 IM 连接以后,可以将自身业务所需的群组用户信息批量提供给 SDK,由 SDK 写入缓存与本地数据库,供后续使用。
- 在 IM 建立连接后,如果群组用户昵称变动,由 App 服务端通知客户端(例如使用消息),客户端调用接口刷新群组用户信息。
RongUserInfoManager.getInstance().refreshGroupUserInfoCache(groupUserInfo);
如果 App 本地不持有数据,推荐在 IMKit 需要展示数据时动态提供群成员用户信息。
动态提供群成员用户信息
从 IMKit 5.X 版本开始,SDK 设计了「群成员用户信息提供者」UserDataProvider.GroupUserInfoProvider 接口类。如果 IMKit 无法从 RongUserInfoManager
中获取群成员用户信息,将触发 GroupUserInfoProvider
的 getGroupUserInfo
回调方法。App 应在该回调中提供 SDK 所需要的群成员昵称。
获取群成员用户信息数据后,SDK 会自动设置、群成员的群内昵称,以及实现相关 UI 展示。
设置群成员用户信息提供者,提供群组信息给 SDK
在应用生命周期内,初始化之后、连接之前调用 RongUserInfoManager
的 setGroupUserInfoProvider 方法设置群成员用户信息提供者。
在 App 的生命周期中,如果 SDK 获取过群成员用户信息,并允许持久化存储(isCacheGroupInfo
为 true
)后,便会在内存中缓存该信息,SDK 优先从本地数据库中获取群成员用户信息,App 下次启动时数据仍然可用。SDK 在处理对应信息时默认行为如下:
- 当 SDK 需要在 UI 上显示群成员用户信息时,首先从内存中查询已获取的数据。
- 如果 SDK 可从缓存或本地数据库中查询到所需信息,将直接将数据返回 UI 层并刷新 UI。
- 如果 SDK 未能从缓存或本地数据库查询到所需信息,则将触发 UserDataProvider.GroupUserInfoProvider 的回调方法,并尝试从应用层获取信息。收到应用层提供的相应信息后,SDK 将刷新 UI。
建议设置 isCacheGroupUserInfo
为 true
,即在本地持久化存储群成员用户信息。
请在 UserDataProvider.GroupUserInfoProvider 的 getGroupUserInfo
回调触发时,向 SDK 提供的群成员用户信息。
-
异步获取群成员用户信息,再手动刷新:App 可以使用该方式避免耗时操作影响 UI。
-
App 应在
getGroupUserInfo
方法直接返回null
,同时,App 需要在该方法中触发自行获取userId
的群组用户信息的逻辑。注意,该步骤会将userId
在群组内的昵称临时置为空。JavaRongUserInfoManager.getInstance().setGroupUserInfoProvider(new UserDataProvider.GroupUserInfoProvider() {
@Override
public GroupUserInfo getGroupUserInfo(String groupId, String userId) {
... // 在需要展示群组信息时(例如会话列表页面、会话页面),IMKit 首先会根据群组 ID 和用户 ID 逐次调用 getGroupUserInfo。
// 此处由 App 自行完成异步请求用户信息的逻辑。后续通过 refreshGroupUserInfoCache 提供给 SDK。
return null;
}
}, true); -
App 成功获取
userId
的在群组内的昵称数据后,再调用refreshGroupUserInfoCache
方法,手动刷新群组成员昵称。SDK 在收到该群成员用户信息后会刷新 UI。详见刷新群成员用户信息。
-
-
同步返回群成员信息:App 也可以直接返回
userId
的群成员用户信息。SDK 在收到该数据后会刷新 UI。JavaRongUserInfoManager.getInstance().setGroupUserInfoProvider(new UserDataProvider.GroupUserInfoProvider() {
@Override
public GroupUserInfo getGroupUserInfo(String groupId, String userId) {
GroupUserInfo groupUserInfo = new GroupUserInfo(groupId, userId, "小花");
return groupUserInfo; //同步返回群成员昵称。
}
}, true);
获取群成员用户信息
App 可以主动调用 RongUserInfoManager 的 getGroupUserInfo
方法获取群成员用户信息。SDK 的行为如下:
- 首先尝试从本地缓存获取应用层提供的数据。如果在设置群成员用户信息提供者时,已授权 SDK 在本地数据库中存储用户信息(即
isCacheGroupUserInfo
为true
),SDK 还会尝试从本地数据库中获取群成员用户信息。 - 如果本地没有相关信息的数据,SDK 会触发
GroupUserInfoProvider
的getGroupUserInfo
回调方法。如果您的 App 应用层已在该回调中提供数据,则 SDK 可成功获取群成员用户信息 GroupUserInfo。
GroupUserInfo groupUserInfo = RongUserInfoManager.getInstance().getGroupUserInfo(groupId, userId);
输入参数 | 类型 | 说明 |
---|---|---|
groupId | String | 群组 ID |
userId | String | 用户 ID |