自定义用户信息
更新时间: 2025/09/11 14:15:56
IM UIKit 自 v9.2.9 起,提供用户信息代理IUserInfoDelegate,用于向您的应用获取用户信息。设置IUserInfoDelegate后,您的应用仅需负责提供数据源,IM UIKit 获取数据后将自动调用IUserInfoDelegate包含的方法设置、刷新用户头像与昵称等用户信息,并进行相关界面展示。
用户信息处理逻辑
在您 设置用户信息代理 并自行实现相应逻辑之后,IM UIKit 内部处理用户信息的流程如下:
| 流程 | 说明 |
|---|---|
| 1. | 如果设置了 IUserInfoDelegate 代理,IM UIKit 会先调用同步方法(getUserInfo)从应用本地获取用户信息,同步方法中允许您自行实现相应逻辑,让 IM UIKit 读取持久化存储的本地数据。获取用户信息成功之后,IM UIKit 进行界面的渲染。 |
| 2. | 如果同步方法(getUserInfo)获取的用户信息为空,IM UIKit 会自动调用异步方法(fetchUserInfo)从应用服务端获取用户信息,并在获取成功之后将用户信息回调给 IM UIKit。IM UIKit 收到数据之后进行界面渲染。 |
用户信息说明
IM UIKit 通过 NEKitUser 字段定义用户信息。
NEKitUser 参数说明:
| 属性 | 类型 | 说明 |
|---|---|---|
userId |
String | 用户 ID。 |
alias |
String | 备注名。 |
ext |
String | 扩展字段。 |
serverExt |
String | 服务器扩展字段,客户端只能读取。 |
-
userInfo |
NEKitUserInfo |
用户资料,仅当用户选择托管信息到云信时有效。 |
nickName |
String | 用户昵称。 |
avatarUrl |
String | 用户头像。 |
thumbAvatarUrl |
String | 用户缩略图。 |
sign |
String | 用户签名。 |
gender |
Gender | 用户性别。 |
email |
String | 用户邮箱。 |
birth |
String | 用户生日。 |
mobile |
String | 用户手机号。 |
ext |
String | 用户自定义扩展字段。 |
用户信息代理
用户信息代理 IUserInfoDelegate 支持同步获取用户信息、异步获取用户信息和更新用户信息。
swift@objc
public protocol IUserInfoDelegate: NSObjectProtocol {
//同步获取用户信息数据
@objc
optional func getUserInfo(account: String) -> NEKitUser?
//异步获取用户数据
@objc(fetchUserInfoList:completion:)
optional func fetchUserInfo(accountList list: [String], completion: FetchCallback?)
//用户数据更新
@objc(updateUserInfo:completion:)
optional func updateUserInfo(values: [NSNumber: Any], completion: UpdateCallback?)
}
@protocol IUserInfoDelegate <NSObject>
@optional
//同步获取用户信息数据
- (NEKitUser * _Nullable)getUserInfoWithAccount:(NSString * _Nonnull)account SWIFT_WARN_UNUSED_RESULT;
//异步获取用户数据
- (void)fetchUserInfoList:(NSArray<NSString *> * _Nonnull)list completion:(void (^ _Nullable)(NSArray<NEKitUser *> * _Nullable, NSError * _Nullable))completion;
//用户数据更新
- (void)updateUserInfo:(NSDictionary<NSNumber *, id> * _Nonnull)values completion:(void (^ _Nullable)(NSError * _Nullable))completion;
@end
同步获取用户信息
IM UIKit 调用 getUserInfo 方法,可从您的应用本地同步获取用户信息。若本地没有用户数据,则该方法返回值为空。
为了不影响界面加载性能,建议不要在 IM UIKit 调用该方法时进行耗时操作。
func getUserInfo(account: String) -> NEKitUser? {
let user = NEKitUser.init(userId: account, nickName: "昵称", avatarUrl: "头像")
return user
}
- (NEKitUser * _Nullable)getUserInfoWithAccount:(NSString * _Nonnull)account {
NEKitUser * user = [[NEKitUser alloc] initWithUserId:account nickName:@"昵称" avatarUrl:@"头像"];
return user
}
异步获取用户信息
IM UIKit 调用 fetchUserInfo 方法,可从您的应用服务端异步获取用户信息,在获取成功之后将用户信息回调给 IM UIKit。IM UIKit 调用该方法时,您可进行耗时操作(请求网络等)。
func fetchUserInfo(accountList list: [String], completion: FetchCallback?) {
var userList = [NEKitUser]()
for uid in list {
userList.append(NEKitUser.init(userId: uid, nickName: "昵称", avatarUrl: "头像"))
}
completion!(userList,nil)
}
- (void)fetchUserInfoList:(NSArray<NSString *> *)list completion:(void (^)(NSArray<NEKitUser *> * _Nullable, NSError * _Nullable))completion {
NSMutableArray<NEKitUser *> *userList;
for (NSString *uid in list) {
[userList addObject:[[NEKitUser alloc] initWithUserId:uid nickName:@"昵称" avatarUrl:@"头像"]];
}
completion(userList, nil);
}
更新用户信息
IM UIKit 调用 updateUserInfo 方法更新用户信息并获取被修改的用户信息字段。
该接口可一次性修改多个属性,如昵称,头像等,传入的数据键值对是 {@(NIMUserInfoUpdateTag) : NSString},无效数据将被过滤。
func updateUserInfo(values: [NSNumber : Any], completion: UpdateCallback?) {
}
- (void)updateUserInfo:(NSDictionary<NSNumber *,id> *)values completion:(void (^)(NSError * _Nullable))completion {
}
设置用户信息代理
您可调用IMKitClient类中addDelegate方法设置用户信息代理。设置之后,由您的应用来提供需要在界面显示的用户信息。如不再需要用户信息代理,可调用IMKitClient类中removeDelegate方法进行移除。移除之后,由 NIM SDK 提供需要在界面显示的用户信息。
- 建议您在界面加载之前设置用户信息代理(
IUserInfoDelegate)。以 IM Demo 中的使用场景为例,建议放在首页NETabBarController中的viewDidLoad方法中,确保用户信息的获取在界面加载之前进行。 getUserInfo和fetchUserInfo协议方法都需实现。
-
API 原型
Swiftswift/// 设置用户信息代理 /// - Parameter delegate: 代理 public func addDelegate(_ delegate: IUserInfoDelegate) /// 移除用户信息代理 /// - Parameter delegate: 代理 public func removeDelegate(_ delegate: IUserInfoDelegate)Objective-C/// 设置用户信息代理 /// - param delegate 代理 - (void)addDelegate:(id <IUserInfoDelegate> _Nonnull)delegate; /// 移除用户信息代理 /// - param delegate 代理 - (void)removeDelegate:(id <IUserInfoDelegate> _Nonnull)delegate; -
示例代码
Swiftswift//设置代理 IMKitClient.instance.addDelegate(self) func getUserInfo(account: String) -> NEKitUser? { let user = NEKitUser.init(userId: account, nickName: "昵称", avatarUrl: "头像") return user } func fetchUserInfo(accountList list: [String], completion: FetchCallback?) { var userList = [NEKitUser]() for uid in list { userList.append(NEKitUser.init(userId: uid, nickName: "昵称", avatarUrl: "头像")) } completion!(userList,nil) } func updateUserInfo(values: [NSNumber : Any], completion: UpdateCallback?) { } //移除代理 IMKitClient.instance.removeDelegate(self)Objective-C//设置代理 [[IMKitClient instance] addDelegate:self]; - (NEKitUser * _Nullable)getUserInfoWithAccount:(NSString * _Nonnull)account { NEKitUser * user = [[NEKitUser alloc] initWithUserId:account nickName:@"昵称" avatarUrl:@"头像"]; return user } - (void)fetchUserInfoList:(NSArray<NSString *> *)list completion:(void (^)(NSArray<NEKitUser *> * _Nullable, NSError * _Nullable))completion { NSMutableArray<NEKitUser *> *userList; for (NSString *uid in list) { [userList addObject:[[NEKitUser alloc] initWithUserId:uid nickName:@"昵称" avatarUrl:@"头像"]]; } completion(userList, nil); } - (void)updateUserInfo:(NSDictionary<NSNumber *,id> *)values completion:(void (^)(NSError * _Nullable))completion { } //移除代理 [[IMKitClient instance] removeDelegate:self];





