跳到主要内容

用户信息托管

本文档旨在指导开发者如何在融云即时通讯 iOS 客户端 SDK 中实现用户信息订阅、查询和监听,同时支持用户信息与权限的修改、查询。 通过本文档, iOS 开发者将了解如何获取和跟踪用户信息,以及如何在用户信息变更、订阅状态变更时接收通知。

提示

此功能在 5.10.0 版本开始支持。

开通服务

使用此功能前,您须在控制台开通信息托管服务。

用户信息管理

SDK 提供了用户信息修改、查询、订阅的相关接口。但客户端 SDK 仅支持修改自已的用户信息。

用户信息设置

使用 updateMyUserProfile:success:error: 接口可以修改自已的用户信息。

RCUserProfile 属性介绍:

属性名类型描述
nameNSString昵称,长度不超过 32 个字符。
portraitUriNSString头像地址,长度不超过 128 个字符。
uniqueIdNSString用户应用号,支持大小写字母、数字,长度不超过 32 个字符。请注意 SDK 不支持设置此字段。
emailNSStringEmail,长度不超过 128 个字符。
birthdayNSString生日,长度不超过 32 个字符
genderRCUserGender性别
locationNSString所在地,长度不超过 32 个字符。
roleNSUInteger角色,支持 0~100 以内数字。
levelNSUInteger级别,支持 0~100 以内数字。
userExtProfileNSDictionary<NSString *, NSString *>自定义扩展信息,默认最多可以设置 20 个用户信息(以 Key、Value 方式设置,扩展用户信息的 Key 需通过开发者后台进行设置)
  1. Key:支持大小写字母、数字,长度不超过 32 个字符,需要保障 AppKey 下唯一。Key 不存在时,设置不成功返回错识提示。
  2. Value:字符串,不超过 256 个字符。

代码示例

RCUserProfile *userProfile = [[RCUserProfile alloc] init];
userProfile.name = @"name";

[[RCCoreClient sharedCoreClient] updateMyUserProfile:userProfile success:^{
// 更新成功
} error:^(RCErrorCode errorCode, NSString * _Nullable errorKey) {
// 更新失败
}];

获取当前用户信息

您可以使用 getMyUserProfile:error: 方法获取当前用户信息。

代码示例

[[RCCoreClient sharedCoreClient] getMyUserProfile:^(RCUserProfile *userProfile) {
// 获取成功
} error:^(RCErrorCode errorCode) {
// 获取失败
}];

批量获取他人用户信息

您可以使用 getUserProfiles:success:error: 方法查询指定用户的用户信息。一次最多查询 20个 用户的用户信息。

代码示例

NSArray *userIds = @[@"userId1", @"userId2"];
[[RCCoreClient sharedCoreClient] getUserProfiles:userIds success:^(NSArray<RCUserProfile *> *userProfiles) {
// 获取成功
} error:^(RCErrorCode errorCode) {
// 获取失败
}];

用户权限

客户端 SDK 提供了用户权限的设置和获取接口,通过 RCUserProfileVisibility 枚举来表示用户权限。

RCUserProfileVisibility 枚举介绍

枚举值用户权限
RCUserProfileVisibilityNotSet未设置:以 AppKey 权限设置为准,默认是此状态。
RCUserProfileVisibilityInvisible都不可见:任何人都不能搜索到我的用户信息,名称、头像除外。
RCUserProfileVisibilityEveryone所有人:应用中任何用户都可以查看到我的用户信息。

用户权限设置

您可以使用 updateMyUserProfileVisibility:success:error 方法设置当前用户的用户信息访问权限。

代码示例

[[RCCoreClient sharedCoreClient] updateMyUserProfileVisibility:RCUserProfileVisibilityEveryone success:^{
// 修改成功
} error:^(RCErrorCode errorCode) {
// 修改失败
}];

用户权限获取

您可以使用 getMyUserProfileVisibility: 方法获取当前用户的用户信息访问权限。

代码示例

[[RCCoreClient sharedCoreClient] getMyUserProfileVisibility:^(RCUserProfileVisibility visibility) {
// 获取成功
} error:^(RCErrorCode errorCode) {
// 获取失败
}];

用户权限说明

AppKey 默认用户信息访问权限为 都不可见,用户级别默认为 未设置。都为默认值时, SDK 仅可查看他人的用户名和头像信息。

下面列举了 AppKey 级 权限与 用户级 权限综合说明:

AppKey 级权限用户级权限结果
都不可见、仅好友可见、所有人可见未设置以 AppKey 级权限设置为准
都不可见、仅好友可见、所有人可见设置为(都不可见、所有人可见)以用户级权限设置为准

用户搜索

按用户应用号精确搜索

支持按用户应用号搜索用户信息,可以使用 searchUserProfileByUniqueId:success:error 方法

// 使用应用号查询用户信息
[[RCCoreClient sharedCoreClient] searchUserProfileByUniqueId:@"uniqueId" success:^(RCUserProfile * _Nonnull userProfile) {
// 查询成功
} error:^(RCErrorCode errorCode) {
// 查询失败
}];

用户信息&权限变更订阅

订阅用户信息&权限变更

当您需要跟踪用户信息和权限的变更时,可以使用 subscribeEvent:completion: 方法订阅用户信息变更事件。

  1. 导入 SDK 头文件。
#import <RongIMLibCore/RongIMLibCore.h>
  1. 创建 RCSubscribeEventRequest 对象,设置订阅类型为 RCSubscribeTypeUserProfile, 订阅用户 ID 列表和订阅时长。一次订阅用户的上限为 200 个, 订阅的用户数最多为 1000 个,一个用户最多可以被 5000 个用户订阅。
RCSubscribeEventRequest *request = [[RCSubscribeEventRequest alloc] init];
// 订阅的用户列表
request.userIds = @[@"userId1", @"userId2"];
// 本次订阅的类型
request.subscribeType = RCSubscribeTypeUserProfile;
// 订阅时长,单位秒
request.expiry = 180000;

[[RCCoreClient sharedCoreClient] subscribeEvent:request completion:^(RCErrorCode status, NSArray<NSString *> * _Nullable failedUserIds) {
if (RC_SUCCESS == status) {
// 订阅成功
}
}];

取消订阅用户信息&权限变更

当您不再需要跟踪用户信息和权限的变更时,可以使用 unSubscribeEvent:completion: 方法取消订阅。

示例代码

RCSubscribeEventRequest *request = [[RCSubscribeEventRequest alloc] init];
request.subscribeType = RCSubscribeTypeUserProfile;
request.userIds = @[@"userId1", @"userId2"];

[[RCCoreClient sharedCoreClient] unSubscribeEvent:request completion:^(RCErrorCode status, NSArray<NSString *> * _Nullable failedUserIds) {
if (RC_SUCCESS == status) {
// 取消订阅成功
}
}];

查询订阅用户信息&权限变更状态

您可以使用 querySubscribeEvent:completion: 方法查询指定用户和订阅类型的状态信息。

示例代码

RCSubscribeEventRequest *request = [[RCSubscribeEventRequest alloc] init];
request.subscribeType = RCSubscribeTypeUserProfile;
request.userIds = @[@"userId1", @"userId2"];

[[RCCoreClient sharedCoreClient] querySubscribeEvent:request completion:^(RCErrorCode status, NSArray<RCSubscribeInfoEvent *> * _Nullable subscribeEvents) {
if (RC_SUCCESS == status) {
// 查询成功
}
}];

分页查询订阅用户信息&权限变更状态

如果您需要分页获取已订阅的所有事件状态信息,可以使用 querySubscribeEvent:pageSize:startIndex:completion:方法, 并指定分页大小和起始索引。

  • pageSize:分页大小,最大值为 100。
  • startIndex:起始索引。第一页传 0, 下一页取返回所有数据的数组数量(比如 pageSize = 20,第二页传 20,第三页传40)。

示例代码

RCSubscribeEventRequest *request = [[RCSubscribeEventRequest alloc] init];
request.subscribeType = RCSubscribeTypeUserProfile;
request.userIds = @[@"userId1", @"userId2"];

[[RCCoreClient sharedCoreClient] querySubscribeEvent:request
pageSize:20
startIndex:0
completion:^(RCErrorCode status, NSArray<RCSubscribeInfoEvent *> * _Nullable subscribeEvents) {
if (RC_SUCCESS == status && subscribeEvents.count > 0) {
// 查询成功
}
}];

监听订阅事件

为了接收订阅事件的变更通知,您需要设置订阅监听器。实现此功能需要开发者遵守 RCSubscribeEventDelegate 协议。

在应用初始化之后,建立连接之前,您需要设置监听器的代理委托。

// 添加监听代理
[[RCCoreClient sharedCoreClient] addSubscribeEventDelegate:self];

// 移除监听代理
[[RCCoreClient sharedCoreClient] removeSubscribeEventDelegate:self];

实现代理:

  1. 当订阅事件发生变化时,以下方法将被调用。您可以通过实现此方法来处理事件的变化,例如更新用户界面或处理新的数据。通常,该方法在后台线程中被调用,因此更新UI时需要切换到主线程。subscribeEvents 是订阅事件的列表,包含所有发生变化的事件。 请注意,订阅过期没有通知, 您需自行关注过期时间。

    // 需要判断 RCSubscribeInfoEvent 的 subscribeType,等于 RCSubscribeTypeUserProfile 时代表用户信息订阅事件。
    - (void)onEventChange:(NSArray<RCSubscribeInfoEvent *> *)subscribeEvents;
  2. 订阅数据同步完成。当订阅数据成功同步到本地设备或系统后,将调用此方法来执行后续业务逻辑。

    /// 订阅数据同步完成
    /// 使用 type 区分不同的订阅类型,等于 RCSubscribeTypeUserProfile 时代表用户信息订阅事件。
    - (void)onSubscriptionSyncCompleted:(RCSubscribeType)type;
  3. 远程设备订阅信息变更。当用户在其他设备上的订阅信息发生变更时,此方法将被调用。您可以利用这个方法来更新当前设备上的状态信息,以保证订阅信息的一致性。 subscribeEvents 包含发生变化的订阅事件的列表。

/// 需要判断 RCSubscribeEvent 的 subscribeType,等于 RCSubscribeTypeUserProfile 时代表用户信息订阅事件。
- (void)onSubscriptionChangedOnOtherDevices:(NSArray<RCSubscribeEvent *> *)subscribeEvents;