====== 用户属性 ====== 更新时间:2021-12-31 新版文档见:[[ccim:ios:userprofile|用户属性]]。 ===== 产品介绍 ===== 用户属性指的是用户的信息,包括:昵称、头像、年龄、手机号等。 用户属性为可选服务,如果不希望敏感信息存储在环信服务器,用户可以自行维护。 使用用户属性功能可以获得以下能力: * 标准的用户属性的读写能力,包括:昵称、头像url、邮箱、电话、性别、签名、生日; * 自定义用户属性的读写能力,提供自定义扩展,可以通过JSON字符串添加多个属性。 ===== 集成概述 ===== SDK提供了用户属性托管服务,可供用户保存头像、昵称等常用字段以及一个扩展字段。如果用户不希望环信获取您的用户属性信息,则需用户自行维护相关数据。 用户属性管理模块可使用以下方式从SDK获取如下 [[EMClient sharedClient] userInfoManager]; 环信可以管理的用户属性信息如下: @interface EMUserInfo : NSObject @property (nonatomic,copy) NSString *userId; /*! *\~chinese 用户环信Id *\~english user's id */ @property (nonatomic,copy) NSString *nickName; /*! *\~chinese 用户昵称,建议最大64字节 *\~english user's nickname */ @property (nonatomic,copy) NSString *avatarUrl; /*! *\~chinese 用户头像地址,建议最大256字节 *\~english user's avatar file uri */ @property (nonatomic,copy) NSString *mail; /*! *\~chinese 用户邮箱地址,建议最大64字节 *\~english user's mail address */ @property (nonatomic,copy) NSString *phone; /*! *\~chinese 用户联系方式,建议最大32字节 *\~english user's phone number */ @property (nonatomic) NSInteger gender; /*! *\~chinese 用户性别,默认为0 ,1表示男,2表示女,其他为非法 *\~english user's phone number */ @property (nonatomic,copy) NSString* sign; /*! *\~chinese 用户签名,建议最大256字节 *\~english user's sign info */ @property (nonatomic,copy) NSString* birth; /*! *\~chinese 用户生日,建议最大64字节 *\~english user's birth */ @property (nonatomic,copy) NSString *ext; /*! *\~chinese 扩展字段 *\~english extention info */ @end ===== 设置用户属性 ===== 每一个用户只能设置自己的用户属性,而不能修改别人的。 设置用户属性时,可以设置用户的所有属性,也可以只设置用户的某一项属性 * 设置用户所有属性 设置用户所有属性的接口如下 /*! * \~chinese * 设置自己的所有用户属性 * * @param aUserData 要设置的用户属性信息 * @param aCompletionBlock 完成回调 * * \~english * Set all own user info * * @param aUserData The user info data to set * @param aCompletionBlock The completion callback */ - (void)updateOwnUserInfo:(EMUserInfo*)aUserData completion:(void (^)(EMUserInfo*aUserInfo,EMError *aError))aCompletionBlock; 调用过程如下: EMUserInfo* userInfo = [[EMUserInfo alloc] init]; userInfo.nickName = @"昵称"; userInfo.avatarUrl = @"http://www.a.com/Image1.png"; userInfo.mail = @"1111@qq.com"; userInfo.phone = @"1234556666"; userInfo.gender = 1; userInfo.sign = @"我的签名"; userInfo.birth = @"生日"; userInfo.ext = @"ext"; [[[EMClient sharedClient] userInfoManager] updateOwnUserInfo:userInfo completion:^(EMUserInfo* aUserInfo,EMError *aError) { }]; * 设置用户指定属性 用户可以指定的用户属性类型包括: typedef NS_ENUM(NSInteger, EMUserInfoType) { EMUserInfoTypeNickName = 0, EMUserInfoTypeAvatarURL, EMUserInfoTypePhone, EMUserInfoTypeMail, EMUserInfoTypeGender, EMUserInfoTypeSign, EMUserInfoTypeBirth, EMUserInfoTypeExt = 100, }; 设置指定用户属性的接口如下: /*! * \~chinese * 设置自己的指定用户属性 * * @param aValue 要设置的用户属性信息 * @param aType 要设置的用户属性类型 * @param aCompletionBlock 完成回调 * * \~english * Set special own user info * * @param aValue The user info data to set * @param aType The user info type to set * @param aCompletionBlock The completion callback */ - (void)updateOwnUserInfo:(NSString*)aValue withType:(EMUserInfoType)aType completion:(void (^)(EMUserInfo*aUserInfo,EMError *aError))aCompletionBlock; 调用过程如(以昵称为例): [[[EMClient sharedClient] userInfoManager] updateOwnUserInfo:@"新的昵称" withType:EMUserInfoTypeNickName completion:^(EMUserInfo* aUserInfo,EMError *aError) { }]; ===== 获取用户属性 ===== 获取用户属性时,可以获取用户的所有属性,也可以获取用户的指定属性,如只获取昵称、头像等 * 获取用户所有属性 获取用户所有属性的接口如下: /*! * \~chinese * 根据用户ID获取用户属性 * * @param aUserIds 要获取用户属性的的用户ID * @param aCompletionBlock 完成回调 * * \~english * Get user info by id * * @param aUserIds The users's id to get user info * @param aCompletionBlock The completion callback */ - (void)fetchUserInfoById:(NSArray*)aUserIds completion:(void (^)(NSDictionary*aUserDatas,EMError *aError))aCompletionBlock; 调用过程如下 [[[EMClient sharedClient] userInfoManager] fetchUserInfoById:[weakself.userIds copy] completion:^(NSDictionary *aUserDatas, EMError *aError) { if(!aError) { } }]; * 获取用户的指定用户属性 获取指定用户属性的接口如下: /*! * \~chinese * 根据用户ID获取用户指定属性 * * @param aUserIds 要获取用户属性的的用户ID * @param aType 要获取哪些类型的用户属性 * @param aCompletionBlock 完成回调 * * \~english * Get user special info by id * * @param aUserIds The users's id to get user info * @param aType The user info type to get * @param aCompletionBlock The completion callback */ - (void)fetchUserInfoById:(NSArray*)aUserIds type:(NSArray*)aType completion:(void (^)(NSDictionary*aUserDatas,EMError *aError))aCompletionBlock 调用过程如下: [[[EMClient sharedClient] userInfoManager] fetchUserInfoById:[weakself.userIds copy] type:@[[NSNumber numberWithInt:EMUserInfoTypeNickName],[NSNumber numberWithInt:EMUserInfoTypeAvatarURL]] completion:^(NSDictionary *aUserDatas, EMError *aError) { if(!aError && aUserDatas.count > 0) { // 这里存储下用户属性 } }]; ===== 用户头像管理 ===== 环信用户属性托管服务不负责管理用户头像文件,只存储头像文件的远程url地址,用户需要使用阿里云、腾讯云等第三方文件托管服务存储头像文件。当用户设置头像时,需要先将头像文件上传到第三方文件托管服务器,然后将上传后得到的url地址传入用户属性的头像url字段,设置用户属性。显示头像时,先从SDK获取用户属性,得到头像url字段,然后在UI层显示远程头像图片 ===== 名片消息 ===== SDK 中没有名片类型的消息,Demo中名片消息的收发使用已有的自定义消息类型,通过指定自定义消息的event为"userCard",并在ext中添加展示名片所需要的环信id、昵称和头像,来展示用户名片。 名片消息发送过程如下: EMCustomMessageBody* body = [[EMCustomMessageBody alloc] initWithEvent:@"userCard" ext:@{@"uid":aUid ,@"nickname":aNickName,@"avatar":aUrl}]; [self.chatController sendMessageWithBody:body ext:nil]; 用户如果需要在名片中展示更丰富的信息,可以在ext中增加更多字段。 展示部分参见Demo中的**EMUserCardMsgView**类