自定义用户信息
更新时间: 2024/07/26 13:39:23
IM UIKit 自 v9.2.9 起,提供用户信息代理IUserInfoDelegate
,用于向您的应用获取用户信息。设置IUserInfoDelegate
后,您的应用仅需负责提供数据源,IM UIKit 获取数据后将自动调用IUserInfoDelegate
包含的方法设置、刷新用户头像与昵称等用户信息,并进行相关界面展示。
用户信息代理
用户信息代理 IUserInfoDelegate
支持同步获取用户信息、异步获取用户信息和更新用户信息。
swift@objc
public protocol IUserInfoDelegate: NSObjectProtocol {
//同步获取用户信息数据
@objc
optional func getUserInfo(account: String) -> User?
//异步获取用户数据
@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
//同步获取用户信息数据
- (User * _Nullable)getUserInfoWithAccount:(NSString * _Nonnull)account SWIFT_WARN_UNUSED_RESULT;
//异步获取用户数据
- (void)fetchUserInfoList:(NSArray<NSString *> * _Nonnull)list completion:(void (^ _Nullable)(NSArray<User *> * _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) -> User? {
let user = User.init(userId: account, nickName: "昵称", avatarUrl: "头像")
return user
}
- (User * _Nullable)getUserInfoWithAccount:(NSString * _Nonnull)account {
User * user = [[User alloc] initWithUserId:account nickName:@"昵称" avatarUrl:@"头像"];
return user
}
异步获取用户信息
IM UIKit 调用 fetchUserInfo
方法,可从您的应用服务端异步获取用户信息,在获取成功之后将用户信息回调给 IM UIKit。IM UIKit 调用该方法时,您可进行耗时操作(请求网络等)。
该接口会将获取到的用户信息缓存在本地,所以需要避免此接口的滥调,导致存储过多无用数据到本地。
func fetchUserInfo(accountList list: [String], completion: FetchCallback?) {
var userList = [User]()
for uid in list {
userList.append(User.init(userId: uid, nickName: "昵称", avatarUrl: "头像"))
}
completion!(userList,nil)
}
- (void)fetchUserInfoList:(NSArray<NSString *> *)list completion:(void (^)(NSArray<User *> * _Nullable, NSError * _Nullable))completion {
NSMutableArray<User *> *userList;
for (NSString *uid in list) {
[userList addObject:[[User 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) -> User? { let user = User.init(userId: account, nickName: "昵称", avatarUrl: "头像") return user } func fetchUserInfo(accountList list: [String], completion: FetchCallback?) { var userList = [User]() for uid in list { userList.append(User.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]; - (User * _Nullable)getUserInfoWithAccount:(NSString * _Nonnull)account { User * user = [[User alloc] initWithUserId:account nickName:@"昵称" avatarUrl:@"头像"]; return user } - (void)fetchUserInfoList:(NSArray<NSString *> *)list completion:(void (^)(NSArray<User *> * _Nullable, NSError * _Nullable))completion { NSMutableArray<User *> *userList; for (NSString *uid in list) { [userList addObject:[[User alloc] initWithUserId:uid nickName:@"昵称" avatarUrl:@"头像"]]; } completion(userList, nil); } - (void)updateUserInfo:(NSDictionary<NSNumber *,id> *)values completion:(void (^)(NSError * _Nullable))completion { } //移除代理 [[IMKitClient instance] removeDelegate:self];
用户信息说明
IM UIKit 通过 User
字段定义用户信息。
User
参数说明:
属性 |
类型 | 说明 |
---|---|---|
userId |
String | 用户ID |
alias |
String | 备注名 |
ext |
String | 扩展字段 |
serverExt |
String | 服务器扩展字段,客户端只能读取 |
userInfo |
UserInfo |
用户资料,仅当用户选择托管信息到云信时有效 |
UserInfo
参数说明:
属性 |
类型 | 说明 |
---|---|---|
nickName |
String | 用户昵称 |
avatarUrl |
String | 用户头像 |
thumbAvatarUrl |
String | 用户缩略图 |
sign |
String | 用户签名 |
gender |
Gender | 用户性别 |
email |
String | 用户邮箱 |
birth |
String | 用户生日 |
mobile |
String | 用户手机号 |
ext |
String | 用户自定义扩展字段 |
用户信息处理逻辑
在您设置用户信息代理并自行实现相应逻辑之后,IM UIKit 处理用户信息的流程如下:
流程 |
说明 |
---|---|
1. | 如果设置了 IUserInfoDelegate 代理,IM UIKit 会先调用同步方法(getUserInfo )从应用本地获取用户信息,同步方法中允许您自行实现相应逻辑,让 IM UIKit 读取持久化存储的本地数据。获取用户信息成功之后,IM UIKit 进行界面的渲染 |
2. | 如果同步方法(getUserInfo )获取的用户信息为空,IM UIKit 会自动调用异步方法(fetchUserInfo )从应用服务端获取用户信息,并在获取成功之后将用户信息回调给 IM UIKit。IM UIKit 收到数据之后进行界面渲染 |