跳到主要内容

用户信息

提示

IMKit 支持两种用户信息展示方式

  • 用户信息提供者代理方式(当前文档):必须由应用开发者主动从 App 服务端获取用户信息、群组信息、群成员用户信息,并提供给 SDK。融云服务端注册获取 Token 时传入的用户昵称及头像仅用于推送服务。
  • 用户信息托管方式:5.12.0 版本及之后,IMKit 支持用户切换信息托管方式实现会话页面和会话列表用户、群组信息的显示。

IMKit 使用 RongUserInfoManager 类统一管理以下数据。App 需要使用 RongUserInfoManager 向 IMKit 提供数据,用于在 UI 上展示。

  • 用户信息:包含昵称、头像
  • 群组信息:包含群组名称、群组头像
  • 群成员用户信息:仅支持群用户昵称

本文仅描述了应用层(App)如何为 IMKit SDK 提供用户昵称与头像(UserInfo):

刷新用户信息

如果 App 本地持有用户信息数据(例如当前登录用户的昵称和头像),可直接刷新本地缓存和数据库中存储的用户信息(头像与昵称)。刷新后,IMKit UI 会自动展示最新的用户信息 UserInfo

刷新用户信息必须在 IMKit 已成功建立 IM 连接后操作,否则无法刷新本地数据。可能适用场景如下:

  • App 首次启动,并成功建立 IM 连接以后,可以将自身业务所需的用户信息批量提供给 SDK,由 SDK 写入缓存与本地数据库,供后续使用。
  • 在 IM 建立连接后,如果用户昵称、头像等信息变动,由 App 服务端通知客户端(例如使用消息),客户端调用接口刷新用户信息。
Java
UserInfo userInfo = new UserInfo(userId, "userId 对应的名称", Uri.parse("userId 对应头像地址"));
RongUserInfoManager.getInstance().refreshUserInfoCache(userInfo);

如果 App 本地不持有数据,推荐在 IMKit 需要展示数据时动态提供用户信息。

动态提供用户信息

从 IMKit 5.X 版本开始,SDK 设计了用户信息提供者 UserDataProvider.UserInfoProvider 接口类。如果 IMKit 无法从 RongUserInfoManager 中获取用户信息,将触发 UserInfoProvidergetUserInfo 回调方法。App 应在该回调中提供 SDK 所需要的用户头像与昵称。获取用户信息数据后,SDK 会自动设置、刷新用户头像与昵称,以及实现相关 UI 展示。

设置用户信息提供者,提供用户信息给 SDK

在应用生命周期内,初始化之后、连接之前调用 RongUserInfoManagersetUserInfoProvider 方法设置用户信息提供者。如果 SDK 获取过用户的信息,并允许持久化存储(isCacheGroupInfotrue)后,便会在内存中缓存该信息,SDK 优先从本地数据库中获取用户信息,App 下次启动时数据仍然可用。SDK 在处理对应信息时默认行为如下:

  1. 当 SDK 需要在 UI 上显示用户信息时,IMKit 首先会根据用户 ID 逐个调用 RongUserInfoManagergetUserInfo 方法,从缓存或本地数据库查询已获取的数据。
  2. 如果 SDK 可从缓存或本地数据库中查询到所需信息,将直接将数据返回 UI 层并刷新 UI。
  3. 如果 SDK 未能从缓存或本地数据库查询到所需信息,则将触发 UserDataProvider.UserInfoProvider 的回调方法,并尝试从应用层获取信息。收到应用层提供的相应信息后,SDK 将刷新 UI。
提示

建议设置 isCacheGroupInfotrue,即在本地持久化存储群组信息。

请在 UserDataProvider.UserInfoProvidergetUserInfo 回调触发时,向 SDK 提供用户信息数据。

  • 异步获取用户信息,再手动刷新: App 可以使用该方式避免耗时操作影响 UI。

    1. App 需要在 getUserInfo 方法中直接返回 null,同时,App 应在该方法中触发自行获取 userId 的用户信息的逻辑。注意,该步骤会将 userId 的用户信息临时置为空。

      Java
      RongUserInfoManager.getInstance().setUserInfoProvider(new UserDataProvider.UserInfoProvider {
      @Override
      public UserInfo getUserInfo(String userId) {
      ...// 在需要展示用户信息时(例如会话列表页面、会话页面),IMKit 首先会根据用户 ID 逐个调用 getUserInfo。
      // 此处由 App 自行完成异步请求用户信息的逻辑。后续通过 refreshUserInfoCache 提供给 SDK。
      return null;
      }

      }, true);
    2. App 成功获取 userId 的用户信息数据后,再调用 RongUserInfoManagerrefreshUserInfoCache 方法,手动刷新 userId 用户信息。SDK 在收到该用户的信息后会刷新 UI。详见刷新用户信息

      Java
      UserInfo userInfo = new UserInfo(userId, "userId 对应的名称", Uri.parse("userId 对应的头像地址"))
      RongUserInfoManager.getInstance().refreshUserInfoCache(userInfo);
  • 同步返回用户信息:App 也可以直接返回 userId 的用户信息。SDK 在收到该用户的信息后会刷新 UI。

    Java
    RongUserInfoManager.getInstance().setUserInfoProvider(new UserDataProvider.UserInfoProvider() {
    @Override
    public UserInfo getUserInfo(String userId) {
    UserInfo userInfo = new UserInfo(userId, "userId 对应的名称", Uri.parse("userId 对应的头像地址"))
    return userInfo;
    }
    }, true);

获取用户信息

App 可以主动调用 RongUserInfoManagergetUserInfo 方法获取 SDK 缓存的用户信息。SDK 的行为如下:

  1. 首先尝试从本地缓存获取应用层提供的数据。如果在设置用户信息提供者时,已授权 SDK 在本地数据库中存储用户信息(即 isCacheUserInfotrue),SDK 还会尝试从本地数据库中获取用户信息。
  2. 如果本地没有相关信息的数据,SDK 会触发 UserInfoProvidergetUserInfo 回调方法。如果您的 App 应用层已在该回调中提供数据,则 SDK 可成功获取用户信息 UserInfo
Java
String userId = "用户 Id"
UserInfo userInfo = RongUserInfoManager.getInstance().getUserInfo(userId)
输入参数类型说明
userIdString用户 ID