用户属性

更新时间:2022-02-28

用户属性指实时消息互动用户的信息,如用户昵称、头像、邮箱、电话、性别、签名、生日等。

例如,在招聘场景下,利用用户属性功能可以存储性别、邮箱、用户类型(面试者)、职位类型(web 研发)等。查看用户信息时,可以直接查询服务器存储的用户属性信息。

本文介绍如何通过管理用户属性设置、更新、存储并获取实时消息用户的相关信息。

注意

为保证用户信息安全,环信即时通讯 IM 仅支持用户本人或 app 管理员设置用户属性。

环信即时通讯 IM iOS SDK 提供一个 userInfoManager 类,支持获取、设置及修改用户属性信息,其中包含如下方法:

  • updateOwnUserInfo 设置和修改指定用户 ID 的用户信息;
  • updateOwnUserInfo 设置和修改指定用户 ID 的用户信息中的某个属性;
  • fetchUserInfoById 根据指定用户 ID 获取该用户的所有属性信息;
  • fetchUserInfoById 获取指定用户的属性。

设置用户属性前,请确保满足以下条件:

本节介绍如何在项目中设置及获取用户属性。

实现过程中注意单个用户所有属性最大不超过 2 KB,单个 app 所有用户属性数据最大不超过 10 GB。

设置用户属性

参考如下示例代码,在你的项目中为指定用户设置所有属性或者仅设置某一项属性。

//设置用户所有属性。
EMUserInfo *userInfo = [[EMUserInfo alloc] init];
userInfo.userId = EMClient.sharedClient.currentUsername;
userInfo.nickName = @"EM";
userInfo.avatarUrl = @"http://www.EM.io";
userInfo.birth = @"2000.10.10";
userInfo.sign = @"hello world";
userInfo.phone = @"12333333333";
userInfo.mail = @"123456@qq.com";
userInfo.gender = 1;
[EMClient.sharedClient.userInfoManager updateOwnUserInfo:userInfo completion:^(EMUserInfo *aUserInfo, EMError *aError)      

}];
        
//以修改用户头像为例,演示如何为用户设置指定用户属性。
NSString *url = @"https://download-sdk.oss-cn-beijing.aliyuncs.com/downloads/IMDemo/avatar/Image1.png";

[[EMClient sharedClient].userInfoManager updateOwnUserInfo:url withType:EMUserInfoTypeAvatarURL completion:^(EMUserInfo *aUserInfo, EMError *aError) {
        if (aUserInfo && completion) {
            completion(aUserInfo);
        }
    }];

SDK 端上的用户属性使用以下字段:

字段 类型 备注
nickname String用户昵称。长度在 64 字符内。
avatarurlString用户头像 URL 地址。长度在 256 字符内。
phone String用户联系方式。长度在 32 字符内。
mail String用户邮箱。长度在 64 字符内。
gender Number用户性别。
- 1:男;
- 2:女;
- (默认)0:未知;
- 设置为其他值无效。
sign String用户签名。长度在 256 字符内。
birth String用户生日。长度在 64 字符内。
ext String扩展字段。

获取用户属性

参考以下示例代码,获取用户的一项、多项或所有的属性,如只获取昵称或头像。

//获取用户所有属性,一次调用用户 ID 数量不能超过 100。
 [[EMClient sharedClient].userInfoManager fetchUserInfoById:@[EMClient.sharedClient.currentUsername]        completion:^(NSDictionary *aUserDatas, EMError *aError) {               
 }];
//获取指定用户属性。
 NSString *userIds = @[@"user1",@"user2"];
 NSArray<NSNumber *> *userInfoTypes = @[@(EMUserInfoTypeAvatarURL),@(EMUserInfoTypePhone),@(EMUserInfoTypeMail)];
 [[EMClient sharedClient].userInfoManager fetchUserInfoById:userIds type:userInfoTypes completion:^(NSDictionary *aUserDatas, EMError *aError) {
              
 }];

用户头像管理

如果你的应用场景中涉及用户头像管理,还可以参考如下步骤进行操作:

1. 开通第三方文件存储服务。详情可以参考文件储存服务商的文档。

2. 将头像文件上传到上述第三方文件存储服务。

3. 完成头像上传后,你会获取一个 URL 地址。将该 URL 地址设置为用户属性的头像 URL 字段。

4. 显示头像时,通过调用 fetchUserInfoById 获取头像 URL,并在本地 UI 中渲染头像。

名片消息

如果你的场景中涉及名片消息,你也可以使用自定义属性功能,并参考如下示例代码实现:

//设置自定义消息的 `event` 为 `userCard` ,并在 `ext` 中添加展示名片所需要的环信即时通讯 IM ID 、昵称和头像等字段。
EMCustomMessageBody *body = [[EMCustomMessageBody alloc] init];
    body.event = @"userCard";
    NSDictionary *messageExt = @{@"userId":EMClient.sharedClient.currentUsername,
                          @"nickname":@"nickname",
                          @"avatar":@"https://download-sdk.oss-cn-beijing.aliyuncs.com/downloads/IMDemo/avatar/Image1.png"
                        };
    body.ext = messageExt;
    EMChatMessage *message = [[EMChatMessage alloc] initWithConversationID:@"conversationID"
                                                          from:@"sender"
                                                            to:@"receiver"
                                                          body:body
                                                           ext:nil];
    // send message
    [[EMClient sharedClient].chatManager sendMessage:message progress:nil completion:^(EMChatMessage *message, EMError *error) {
    }];

如果需要在名片中展示更丰富的信息,可以在 ext 中增加更多字段。

可参考示例项目 中的以下类:

  • EMCustomMessageBody
  • EMChatMessage