iOS

用户资料

更新时间: 2024/08/08 15:50:51

NetEase IM SDK(以下简称 NIM SDK)提供用户信息的托管,实现用户资料的统一管理和共享。

技术原理

NIM SDK 支持获取以及更新自己的用户资料信息,其中用户资料包括用户昵称、性别、头像、签名、手机、邮箱、生日等信息。

SDK 中 NIMUserManager 提供了用户帐号资料管理。NIMUserManager 里,使用 NIMUser 对用户进行封装。其中用户信息为 NIMUserInfo 属性。

本文介绍的所有功能,仅当 选择云信托管用户资料 时有效,如果开发者不希望云信获取自己的用户数据,则需自行维护用户资料。

NIM SDK 会将用户资料缓存到本地,但是除自身的资料外,SDK 不保证其他用户资料的实时更新。以下事件会触发其他用户资料的更新:

  • 登录后数据同步阶段,SDK 会自动同步好友的用户资料。
  • 收到其他用户发来消息时,如果消息发送者有资料变更,则 SDK 会同步更新对方的用户资料并进行通知。
  • 直接调用 - (void)fetchUserInfos:completion: 方法主动从服务器获取并刷新最新的用户资料。

如果需要同步的用户资料较多,SDK 的同步时间会相对较长。

前提条件

登录 IM

监听用户资料变更事件回调

在进行用户相关操作前,可以提前注册用户资料变更事件(onUserInfoChanged)的监听。注册成功后,当用户资料发生变更时,SDK 会触发对应回调通知。

objc@protocol NIMUserManagerDelegate <NSObject>
/** 
* 用户个人信息发生变化 (在线)
*/
- (void)onUserInfoChanged:(NIMUser *)user;
@end

更新本人的用户资料

调用 updateMyUserInfo 方法更新自己的用户资料。

更新资料成功后,SDK 会返回用户资料变更回调,并同步缓存到本地。

objc@protocol NIMUserManager <NSObject>
/**
 *  修改自己的用户资料
 *
 *  @param values      需要更新的用户信息键值对
 *  @param completion  修改结果回调
 *
 *  @discussion   这个接口可以一次性修改多个属性,如昵称,头像等,传入的数据键值对是 {@(NIMUserInfoUpdateTag) : NSString},
 *                无效数据将被过滤。一些字段有修改限制,具体请参看 NIMUserInfoUpdateTag 的相关说明
 */
- (void)updateMyUserInfo:(NSDictionary<NSNumber *,NSString *> *)values
              completion:(nullable NIMUserBlock)completion;
@end

只允许用户编辑自己的资料。此接口可以一次性编辑多个属性。如昵称、头像等,传入的数据键值对是 {@(NIMUserInfoUpdateTag) : NSString},无效数据将被过滤。一些字段有修改格式校验。具体限制为:

属性名 具体字段 类型限制 格式校验
用户昵称 NIMUserInfoUpdateTagNick NSString
用户头像 NIMUserInfoUpdateTagAvatar NSString
用户签名 NIMUserInfoUpdateTagSign NSString
用户性别 NIMUserInfoUpdateTagGender NIMUserGender 只支持指定枚举
用户邮箱 NIMUserInfoUpdateTagEmail NSString 只支持合法邮箱
用户生日 NIMUserInfoUpdateTagBirth NSString yyyy-MM-dd
用户手机 NIMUserInfoUpdateTagMobile NSString 合法手机号 如13588888888、+(86)-13055555555
拓展字段 NIMUserInfoUpdateTagExt NSString
对某些资料内容另外的反垃圾的业务ID NIMUserInfoUpdateTagAntispamBusinessId NSString
  • 如果需要更新头像,需要先将头像图片上传到云端后,再将 URL 传给 SDK。可以使用云信提供文件资源上传与下载服务,或其他第三方服务。

  • 云信自带的文件资源上传与下载接口,具体请参考下文。

文件资源上传和下载

objc@protocol NIMResourceManager <NSObject>
/**
 *  上传文件
 *  @param filepath    上传文件路径
 *  @param scene       场景类别
 *  @param progress    进度Block
 *  @param completion  结果回调
 *
 *  @discussion   该接口可以一次性修改多个属性,如昵称,头像等,传入的数据键值对是 {@(NIMUserInfoUpdateTag) : NSString},
 *                无效数据将被过滤。一些字段有修改限制,具体请参看 NIMUserInfoUpdateTag 的相关说明
 */
- (void)upload:(NSString *)filepath 
         scene:(nonnull NSString *)scene 
      progress:(nullable NIMHttpProgressBlock)progress 
    completion:(nullable NIMUploadCompleteBlock)completion;
@end

其中,scene具体参见 NOS 资源场景

NIMResourceManager 协议主要方法如下:

objc@protocol NIMResourceManager <NSObject>
/**
 *  下载文件
 */
- (void)download:(NSString *)urlString 
        filepath:(NSString *)filepath 
        progress:(nullable NIMHttpProgressBlock)progress 
      completion:(nullable NIMDownloadCompleteBlock)completion;

/**
 *  取消上传/下载任务
 */
- (void)cancelTask:(NSString *)filepath;

/**
 *  规范化 URL 地址
 */
- (NSString *)normalizeURLString:(NSString *)urlString;

/**
 *  将传入的 nos 图片 url 调整为缩略图形式 url
 */
- (NSString *)imageThumbnailURL:(NSString *)urlString;

/**
 *  将传入的 nos 视频 url 调整为缩略图形式 url
 */
- (NSString *)videoThumbnailURL:(NSString *)urlString;
@end

获取所有用户资料

从本地获取用户资料

建议在您的应用中做好用户资料缓存,查询用户资料都通过本地缓存进行。在用户资料有变化时,SDK 会通过您注册的观察者触发回调来通知您。此时,您的应用可更新缓存,并刷新界面。

调用 userInfo: 方法可从本地获取用户资料。

目前 userInfo: 只支持在主线程调用,否则可能导致程序崩溃和数据读写丢失。

objc@protocol NIMUserManager <NSObject>

/**
 *  从本地获取用户资料
 *
 *  @param  userId 用户id
 *
 *  @return NIMUser
 *
 *  @discussion 需要将用户信息交给云信托管,且数据已经正常缓存到本地,此接口才有效。
 *              用户资料除自己之外,不保证其他用户资料实时更新
 *              其他用户资料更新的时机为: 1.调用 - (void)fetchUserInfos:completion: 方法刷新用户
 *                                    2.收到此用户发来消息
 *                                    3.程序再次启动,此时会同步部分好友信息
 */
- (nullable NIMUser *)userInfo:(NSString *)userId;

@end

示例代码如下:

objcNIMUser *user = [[NIMSDK sharedSDK].userManager userInfo:@"userId"];

从云端获取用户资料

调用 fetchUserInfos 方法从服务器获取用户资料,一般在本地用户资料不存在时调用,获取后 SDK 会负责更新本地数据库。每次最多获取 150 个用户,如果量大,上层请自行分批获取。

该接口可以批量从服务器获取用户资料,出于用户体验和流量成本考虑,不建议应用频繁调用此接口。对于用户数据实时性要求不高的页面,应尽量调用读取本地缓存接口。

objc@protocol NIMUserManager <NSObject>
/**
 *  从云信服务器批量获取用户资料
 *
 *  @param users       用户id列表
 *  @param completion  用户信息回调
 *
 *  @discussion 需要将用户信息交给云信托管,此接口才有效。调用此接口,不会触发 - (void)onUserInfoChanged: 回调。
 *              该接口会将获取到的用户信息缓存在本地,所以需要避免此接口的滥调,导致存储过多无用数据到本地而撑爆缓存:如在聊天室请求请求每个聊天室用户数据将造成缓存过大而影响程序性能
 *              本接口一次最多支持 150 个用户信息获取
 */
- (void)fetchUserInfos:(NSArray<NSString *> *)users
            completion:(nullable NIMUserInfoBlock)completion;
@end

用户检索

云信 IM 支持根据关键字信息搜索用户的资料信息。

调用 searchUserWithOption 方法从本地数据库中获取具有指定昵称的用户的账号列表。

objc@protocol NIMUserManager <NSObject>
/**
*  查找成员
*
*  @param option      查询条件
*  @param completion  完成回调
*/
- (void)searchUserWithOption:(NIMUserSearchOption *)option
                  completion:(nullable NIMUserInfoBlock)completion;

NIMUserSearchOption原型:

objc@interface NIMUserSearchOption : NSObject
/**
*  搜索文本的搜索范围。(默认:NIMUserSearchRangeOptionFriends)
*/
@property (nonatomic, assign) NIMUserSearchRangeOption searchRange;

/**
*  搜索文本的匹配区域。(默认:NIMUserSearchContentOptionAll)
*/
@property (nonatomic, assign) NIMUserSearchContentOption searchContentOption;

/**
*  忽略大小写。(默认:YES)
*/
@property (nonatomic, assign) BOOL ignoreingCase;

/**
*  搜索文本。
*/
@property (nullable,nonatomic,copy) NSString *searchContent;
此文档是否对你有帮助?
有帮助
去反馈
  • 技术原理
  • 前提条件
  • 监听用户资料变更事件回调
  • 更新本人的用户资料
  • 文件资源上传和下载
  • 获取所有用户资料
  • 从本地获取用户资料
  • 从云端获取用户资料
  • 用户检索