跳到主要内容

提示

Kit 开启信息托管方式后,会话页面和会话列表用户信息显示会从信息托管服务获取,下面接口会失效。

用户信息

本文主要描述如何设置用户、群组、群成员的昵称、头像等信息,具体涵盖以下内容:

  • 设置当前登录的用户的昵称与头像。
  • 通过多种信息提供者协议,从 App 层获取用户、群组、群成员、群成员列表等信息,提供给 SDK,用于设置与显示。
  • 如何持久化存储用户信息、群组信息、群成员信息。

启用持久化存储

IMKit SDK 支持将用户信息、群组信息、群成员信息持久化存储到本地数据库中。不支持持久化存储群成员列表信息。

当需要将用户信息、群组信息、群成员信息在本地持久化保存的时候,可以设置 RCIM 类的 enablePersistentUserInfoCache 属性为 YES,信息将被同时缓存到内存和数据库,App 下次启动时缓存仍然有效。

提示

请在初始化之后,连接之前设置持久化存储属性。

@property (nonatomic, assign) BOOL enablePersistentUserInfoCache;

默认为 NO。信息只缓存到内存,在 App 生命周期结束时会被清除,App 下次启动时将再次通过对应的信息提供者协议获取信息。

了解信息提供者协议

IMKit SDK 设计并提供了以下信息提供者协议,用于向应用层获取信息。开发者需要实现该协议,提供正确的数据。

应用层仅需负责提供数据源,SDK 获取数据后会自动设置、刷新用户头像与昵称,以及相关 UI 展示。

提示

建议在 AppDelegate 或者其他单例中遵循以上协议。

在 App 的生命周期中,如果 SDK 获取过用户或群组的信息,便会在内存中缓存该信息。只要 SDK 可从缓存中获取到所需信息,便不会再触发获取该信息的回调。

在处理用户、群组信息时,SDK 的默认行为如下:

  1. 当 SDK 需要在 UI 上显示用户或者群组信息时,首先从内存中查询已获取的数据。
  2. 如果 SDK 可从缓存或本地数据库中查询到所需信息,将直接将数据返回 UI 层并刷新 UI;该过程不会触发从应用层获取信息的回调方法。
  3. 如果 SDK 未能从缓存或本地数据库查询到所需信息,则将触发相应信息提供者接口的回调方法,并尝试从应用层获取信息。收到应用层提供的相应信息后,SDK 将刷新 UI。

设置当前登录的用户信息

开发者与融云服务器建立连接之后,应该设置当前登录用户的用户信息,已确保 SDK 可正常在界面上显示本端用户头像。

如果传入的用户信息中的用户 ID 与当前登录的用户 ID 不匹配,SDK 会将其忽略。

RCUserInfo *_currentUserInfo = [[RCUserInfo alloc] initWithUserId:userId name:userNickName portrait:userPortraitUri];

[RCIM sharedRCIM].currentUserInfo = _currentUserInfo;
提示

请在成功与融云服务端建立连接之后设置,您可以在连接成功的回调中进行设置。

设置其他用户的用户信息

用户信息提供者(RCIMUserInfoDataSource 协议)用于获取非本端登录用户的用户信息,例如昵称、头像等。

代理回调

SDK 通过代理向应用层获取用户信息。

设置代理委托

请在 SDK 初始化之后,连接融云服务器之前设置代理委托。

[RCIM sharedRCIM].userInfoDataSource = self;

代理方法

@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);
}];
}

获取用户信息

可以调用以下方法获取用户信息。SDK 将首先尝试从本地缓存获取数据。如已允许 SDK 进行持久化存储(即已在 RCIM.h 里开启 enablePersistentUserInfoCache),SDK 还会尝试从本地数据库中获取用户信息。

如果本地没有相关信息的数据,则会触发相应的回调方法,从应用层获取数据。

调用示例

[[RCIM sharedRCIM] getUserInfoCache:@"userId"];

刷新用户信息

您可以通过下面的方法更新 SDK 在本地缓存的用户信息。如已允许 SDK 进行持久化存储(即已在 RCIM.h 里开启 enablePersistentUserInfoCache),SDK 还会更新本地数据库中的用户信息。

调用示例

RCUserInfo *user = [[RCUserInfo alloc] initWithUserId:@"userId" name:@"userName" portrait:@"http://portrait"];

[[RCIM sharedRCIM] refreshUserInfoCache:user withUserId:user.userId];

清除用户信息

您可以通过下面的方法清除 SDK 在本地缓存的用户信息。如已允许 SDK 进行持久化存储(即已在 RCIM.h 里开启 enablePersistentUserInfoCache),SDK 还会清除本地数据库中的用户信息。

调用示例

[[RCIM sharedRCIM] clearUserInfoCache];

设置群组信息

群组信息提供者(RCIMGroupInfoDataSource 协议)用于获取群组的昵称、头像。

代理回调

SDK 通过代理向应用层获取群组信息。

设置代理委托

[RCIM sharedRCIM].groupInfoDataSource = self;

代理方法

@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);
}];
}

获取群组信息

可以调用以下方法获取群组信息。SDK 将首先尝试从本地缓存获取数据。如已允许 SDK 进行持久化存储(即已在 RCIM.h 里开启 enablePersistentUserInfoCache),SDK 还会尝试从本地数据库中获取群组信息。

如果本地没有相关信息的数据,则会触发相应的回调方法,从应用层获取数据。

调用示例

[[RCIM sharedRCIM] getGroupInfoCache:@"groupId"];

刷新群组信息

构造群组信息RCGroup),方法如下:

RCGroup *group = [[RCGroup alloc] initWithGroupId:@"groupId" groupName:@"groupName" portraitUri:@"http://portraitUri"];
/// 5.4.1 及之后,新增 NSString 类型的 extra 字段
group.extra = @"groupExtra";

您可以通过下面的方法更新 SDK 在本地缓存的群组信息。如已允许 SDK 进行持久化存储(即已在 RCIM.h 里开启 enablePersistentUserInfoCache),SDK 还会刷新本地数据库中的群组信息。

[[RCIM sharedRCIM] refreshGroupInfoCache:group withGroupId:group.groupId];

清除群组信息

您可以通过下面的方法清除 SDK 在本地缓存的群组信息。如已允许 SDK 进行持久化存储(即已在 RCIM.h 里开启 enablePersistentUserInfoCache),SDK 还会清除本地数据库中的群组信息。

调用示例

[[RCIM sharedRCIM] clearGroupInfoCache];

群成员信息

群成员信息提供者(RCIMGroupUserInfoDataSource协议)用于获取群组成员的昵称、头像。如果未遵循该协议,SDK 默认使用用户信息协议。

代理回调

SDK 通过代理向应用层获取群成员信息(昵称、头像)。

设置代理委托

请在 SDK 初始化之后,连接融云服务器之前设置代理委托。

[RCIM sharedRCIM].groupUserInfoDataSource = self;

代理方法

@protocol RCIMGroupUserInfoDataSource <NSObject>

/*!
SDK 的回调,用于向 App 获取用户在群组中的群名片信息

@param userId 用户ID
@param groupId 群组ID
@param completion 获取群名片信息完成之后需要执行的Block [userInfo:该用户ID在群组中对应的群名片信息]

@discussion 如果您使用了群名片功能,SDK需要通过您实现的群名片信息提供者,获取用户在群组中的名片信息并显示。
*/
- (void)getUserInfoWithUserId:(NSString *)userId
inGroup:(NSString *)groupId
completion:(void (^)(RCUserInfo *userInfo))completion;

@end

代码示例

以下代码示例来自 sealtalk-ios 项目(GitHub · Gitee) 。

- (void)getUserInfoWithUserId:(NSString *)userId
inGroup:(NSString *)groupId
completion:(void (^)(RCUserInfo *userInfo))completion {
[RCDGroupManager getGroupMemberDetailInfoFromServer:userId
groupId:groupId
complete:^(RCUserInfo *memberInfo) {
return completion(memberInfo);
}];
}

获取群成员信息

可以调用以下方法获取群成员信息(昵称、头像)。SDK 将首先尝试从本地缓存获取数据。如已允许 SDK 进行持久化存储(即已在 RCIM.h 里开启 enablePersistentUserInfoCache),SDK 还会尝试从本地数据库中获取群成员信息。

如果本地没有相关信息的数据,则会触发相应的回调方法,从应用层获取数据。

调用示例

[[RCIM sharedRCIM] getGroupUserInfoCache:@"userId" withGroupId:@"groupId"];

刷新群成员信息

您可以通过下面的方法更新 SDK 在本地缓存的群成员信息(昵称、头像)。如已允许 SDK 进行持久化存储(即已在 RCIM.h 里开启 enablePersistentUserInfoCache),SDK 还会更新本地数据库中的群成员信息。

调用示例

RCUserInfo *user = [[RCUserInfo alloc] initWithUserId:@"userId" name:@"userName" portrait:@"http://portrait"];

[[RCIM sharedRCIM] refreshGroupUserInfoCache:user withUserId:user.userId withGroupId:@"groupId"];

清除群成员信息

您可以通过下面的方法清除 SDK 在本地缓存的群成员信息(昵称、头像)。如已允许 SDK 进行持久化存储(即已在 RCIM.h 里开启 enablePersistentUserInfoCache),SDK 还会清除本地数据库中的群成员信息。

调用示例

[[RCIM sharedRCIM] clearGroupUserInfoCache];

设置群成员列表信息

在群组会话页面中使用 @ 等功能时,SDK 需要应用层提供群成员列表。

注意,SDK 不会缓存群成员列表信息。

代理回调

设置代理委托

请在 SDK 初始化之后,连接融云服务器之前设置代理委托。

[RCIM sharedRCIM].groupMemberDataSource = self;

代理方法

@protocol RCIMGroupMemberDataSource <NSObject>
@optional

/*!
SDK 的回调,用于向 App 获取当前群组成员列表(需要实现用户信息提供者 RCIMUserInfoDataSource)

@param groupId 群ID
@param resultBlock 获取成功之后需要执行的Block [userIdList:群成员ID列表]

@discussion SDK通过此方法群组中的成员列表,请在resultBlock中返回该群组ID对应的群成员ID列表。
在您设置了群组成员列表提供者之后,SDK在需要获取群组成员列表的时候,会调用此方法,向您请求群组成员用于显示。
*/
- (void)getAllMembersOfGroup:(NSString *)groupId result:(void (^)(NSArray<NSString *> *userIdList))resultBlock;
@end

代码示例

以下代码示例来自 sealtalk-ios 项目(GitHub · Gitee) 。

- (void)getAllMembersOfGroup:(NSString *)groupId result:(void (^)(NSArray<NSString *> *))resultBlock {
[RCDGroupManager getGroupMembersFromServer:groupId
complete:^(NSArray<NSString *> *_Nonnull memberIdList) {
return resultBlock(memberIdList);
}];
}