当您 开启信息托管 后,IMKit SDK 的会话页面和会话列表用户信息显示会从信息托管服务获取,下面的功能会失效。
用户信息
本文主要描述如何设置用户、群组、群成员的昵称、头像等信息,具体涵盖以下内容:
- 设置当前登录的用户的昵称与头像。
- 通过多种信息提供者协议,从应用层获取用户、群组、群成员、群成员列表等信息,提供给 IMKit SDK,用于设置与显示。
- 如何持久化存储用户信息、群组信息、群成员信息。
启用持久化存储
IMKit SDK 支持将用户信息、群组信息、群成员信息持久化存储到本地数据库中。不支持持久化存储群成员列表信息。
当需要将用户信息、群组信息、群成员信息在本地持久化保存的时候,可以设置 RCIM
类的 enablePersistentUserInfoCache
属性为 YES
,信息将被同时缓存到内存和数据库,App 下次启动时缓存仍然有效 。
- 请在初始化 SDK 之后,连接之前设置用户信息持久化存储属性。
enablePersistentUserInfoCache
默认为NO
,信息只缓存到内存,在 App 生命周期结束时会被清除,App 下次启动时将再次通过对应的信息提供者协议获取信息。
示例代码
[RCIM sharedRCIM].enablePersistentUserInfoCache = YES;
了解信息提供者协议
IMKit SDK 设计并提供了以下信息提供者协议,用于向应用层获取用户信息。开发者需要实现该协议,提供正确的用户信息数据。
应用层仅需负责提供数据源,IMKit SDK 会在需要展示用户信息的时候请求相关代理方法,并在获取数据后自动设置、刷新用户头像与昵称,以及相关 UI 展示。
- 请在初始化 SDK 之后,连接之前设置用户信息提供者。
- 建议在 AppDelegate 或者其他单例中遵循以下协议。
- 用户信息提供者:RCIMUserInfoDataSource,用于获取非本端登录用户的用户信息,例如昵称、头像等。
- 群组信息提供者:RCIMGroupInfoDataSource,用于获取群组的昵称、头像。
- 群成员信息提供者:RCIMGroupUserInfoDataSource,用于获取群成员在群组内的昵称(群名片)。
- 群成员列表信息提供者:RCIMGroupMemberDataSource,用于获取群成员列表。
在 App 的生命周期中,如果 IMKit SDK 获取过用户或群组的信息,便会在内存中缓存该信息。只要 IMKit SDK 可从缓存中获取到所需信息,便不会再触发获取该信息的回调。
在处理用户、群组信息时,IMKit SDK 的默认行为如下:
- 当 IMKit SDK 需要在 UI 上显示用户或者群组信息时,首先从内存中查询已获取的数据。
- 如果 IMKit SDK 可从缓存或本地数据库中查询到所需信息,将 直接将数据返回 UI 层并刷新 UI;该过程不会触发从应用层获取信息的回调方法。
- 如果 IMKit SDK 未能从缓存或本地数据库查询到所需信息,则将触发相应信息提供者接口的回调方法,并尝试从应用层获取信息。收到应用层提供的相应信息后,IMKit SDK 将刷新 UI。
设置当前登录的用户信息
开发者与融云服务器建立连接之后,应该设置当前登录用户的用户信息,已确保 SDK 可正常在界面上显示本端用户头像。
如果传入的用户信息中的用户 与当前登录的用户 userId 不匹配,IMKit SDK 会将其忽略。
示例代码
RCUserInfo *_currentUserInfo = [[RCUserInfo alloc] initWithUserId:userId name:userNickName portrait:userPortraitUri];
[RCIM sharedRCIM].currentUserInfo = _currentUserInfo;
请在成功与融云服务端建立连接之后设置,您可以在连接成功的回调中进行设置。
设置其他用户的用户信息
您可以通过实现用户信息提供者(RCIMUserInfoDataSource
协议)用于获取非本端登录用户的用户信息,例如昵称、头像等。
代理回调
IMKit SDK 会在需要展示用户信息的时候通过代理方法向应用层获取对应用户的信息。
- 在 IMKit SDK 初始化之后,连接融云服务器之前设置用户信息提供者。
[RCIM sharedRCIM].userInfoDataSource = self;
- 实现用户信息提供者代理方法,并在 IMKit SDK 回调此方法时,根据 groupId 返回对应的群组信息:
接口原型
@protocol RCIMUserInfoDataSource <NSObject>
/*!
SDK 的回调,用于向 App 获取用户信息
@param userId 用户ID
@param completion 获取用户信息完成之后需要执行的Block [userInfo:该用户ID对应的用户信息]
@discussion SDK通过此方法获取用户信息并显示,请在completion中返回该用户ID对应的用户信息。
在您设置了用户信息提供者之后,SDK在需要显示用户信息的时候,会调用此方法,向您请求用户信息用于显示。
*/
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void (^)(RCUserInfo *userInfo))completion;
@end
示例代码
以下代码示例来自 sealtalk-ios 项目(GitHub · Gitee) 。
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void (^)(RCUserInfo *userInfo))completion{
//开发者调自己的服务器接口,根据 userID 异步请求用户信息
[RCDUserInfoManager getUserInfoFromServer:userId
complete:^(RCUserInfo *userInfo) {
//将请求回来的用户信息通过 completion 回调给 SDK
return completion(userInfo);
}];
}
获取用户信息
您可以调用 getUserInfoCache:
方法主动获取对应 userId 的用户信息。
IMkit SDK 将首先尝试从本地缓存获取数据。如已允许 IMkit SDK 进行持久化存储(即已在 RCIM.h
里开启 enablePersistentUserInfoCache
),IMkit SDK 还会尝试从本地数据库中获取用户信息。
如果本地没有相关信息的数据,则会触发相应的回调方法,从应用层实现的用户信息提供者代理方法中获取数据。
示例代码
[[RCIM sharedRCIM] getUserInfoCache:@"userId"];
刷新用户信息
您可以通过 refreshUserInfoCache:
方法主动更新 IMKit SDK 在本地缓存的用户信息。
如已允许 IMkit SDK 进行持久化存储(即已在 RCIM.h
里开启 enablePersistentUserInfoCache
),IMKit SDK 还会更新本地数据库中的用户信息。
::: tip
处于性能和使用场景权衡,IMKit SDK 不会在当前 View 立即自动刷新,会在切换到其他 View 的时候再刷新该用户的显示信息。如果您想立即刷新,您可以在会话列表或者会话页面 reload 强制刷新。
:::
示例代码
RCUserInfo *user = [[RCUserInfo alloc] initWithUserId:@"userId" name:@"userName" portrait:@"http://portrait"];
[[RCIM sharedRCIM] refreshUserInfoCache:user withUserId:user.userId];
清除所有用户信息
您可以通过 clearUserInfoCache
方法清除 IMKit SDK 在本地缓存的用户信息。
如已允许 IMKit SDK 进行持久化存储(即已在 RCIM.h
里开启 enablePersistentUserInfoCache
),IMKit SDK 还会清除本地数据库中的用户信息。
::: tip
处于性能和使用场景权衡,IMKit SDK 不会在当前 View 立即自动刷新,会在切换到其他 View 的时候再刷新该用户的显示信息。如果您想立即刷新,您可以在会话列表或者会话页面 reload 强制刷新。
:::
示例代码
[[RCIM sharedRCIM] clearUserInfoCache];
设置群组信息
您可以通过实现群组信息提供者(RCIMGroupInfoDataSource
协议))用于获取群组的名称、头像。
代理回调
IMKit SDK 会在需要展示群组信息的时候通过代理方法向应用层获取对应用户的信息。
- 在 IMKit SDK 初始化之后,连接融云服务器之前设置群组信息提供者。
[RCIM sharedRCIM].groupInfoDataSource = self;
- 实现群组信息提供者代理方法,并在 IMKit SDK 回调此方法时,根据 groupId 返回对应的群组信息:
接口原型
@protocol RCIMGroupInfoDataSource <NSObject>
/*!
SDK 的回调,用于向 App 获取群组信息
@param groupId 群组ID
@param completion 获取群组信息完成之后需要执行的Block [groupInfo:该群组ID对应的群组信息]
@discussion SDK通过此方法获取群组信息并显示,请在completion的block中返回该群组ID对应的群组信息。
在您设置了群组信息提供者之后,SDK在需要显示群组信息的时候,会调用此方法,向您请求群组信息用于显示。
*/
- (void)getGroupInfoWithGroupId:(NSString *)groupId completion:(void (^)(RCGroup *groupInfo))completion;
@end
示例代码
以下代码示例来自 sealtalk-ios 项目(GitHub · Gitee) 。
- (void)getGroupInfoWithGroupId:(NSString *)groupId completion:(void (^)(RCGroup *))completion {
//开发者调自己的服务器接口根据userID异步请求数据
[RCDGroupManager getGroupInfoFromServer:groupId
complete:^(RCGroup * groupInfo) {
return completion(groupInfo);
}];
}
获取群组信息
您可以调用 getGroupInfoCache:
方法主动获取对应 groupId 的群组信息。
IMkit SDK 将首先尝试从本地缓存获取数据。如已允许 IMkit SDK 进行持久化存储(即已在 RCIM.h
里开启 enablePersistentUserInfoCache
),IMkit SDK 还会尝试从本地数据库中获取群组信息。
如果本地没有相关信息的数据,则会触发相应的回调方法,从应用层实现的群组信息提供者代理方法中获取数据。
示例代码
[[RCIM sharedRCIM] getGroupInfoCache:@"groupId"];
刷新群组信息
您可以通过 refreshGroupInfoCache:
方法主动更新 IMKit SDK 在本地缓存的群组信息。
如已允许 IMkit SDK 进行持久化存储(即已在 RCIM.h
里开启 enablePersistentUserInfoCache
),IMKit SDK 还会更新本地数据库中的群组信息。
接口原型
- (void)refreshGroupInfoCache:(RCGroup *)groupInfo withGroupId:(NSString *)groupId;
参数说明
参数 | 类型 | 说明 |
---|---|---|
groupInfo | RCGroup | 群组信息 |
groupId | NSString | 群组 targetId |