自定义用户信息

更新时间: 2024/03/15 18:25:48

IM UIKit 自 v9.2.9 起,提供用户信息代理IUserInfoDelegate,用于向您的应用获取用户信息。设置IUserInfoDelegate后,您的应用仅需负责提供数据源,IM UIKit 获取数据后将自动调用IUserInfoDelegate包含的方法设置、刷新用户头像与昵称等用户信息,并进行相关界面展示。

用户信息代理

用户信息代理 IUserInfoDelegate 支持同步获取用户信息、异步获取用户信息和更新用户信息。

Swift
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?)
}
Objective-C
@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 调用该方法时进行耗时操作。

Swift
func getUserInfo(account: String) -> User? {
        let user = User.init(userId: account, nickName: "昵称", avatarUrl: "头像")
        return user
    }
    
Objective-C
- (User * _Nullable)getUserInfoWithAccount:(NSString * _Nonnull)account {
    User * user = [[User alloc] initWithUserId:account nickName:@"昵称" avatarUrl:@"头像"];
    return user
}

异步获取用户信息

IM UIKit 调用 fetchUserInfo 方法,可从您的应用服务端异步获取用户信息,在获取成功之后将用户信息回调给 IM UIKit。IM UIKit 调用该方法时,您可进行耗时操作(请求网络等)。

该接口会将获取到的用户信息缓存在本地,所以需要避免此接口的滥调,导致存储过多无用数据到本地。

Swift
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)
    }
Objective-C
- (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},无效数据将被过滤。

Swift
func updateUserInfo(values: [NSNumber : Any], completion: UpdateCallback?) {
        
    }
Objective-C
- (void)updateUserInfo:(NSDictionary<NSNumber *,id> *)values completion:(void (^)(NSError * _Nullable))completion {
    
}

设置用户信息代理

您可调用IMKitClient类中addDelegate方法设置用户信息代理。设置之后,由您的应用来提供需要在界面显示的用户信息。如不再需要用户信息代理,可调用IMKitClient类中removeDelegate方法进行移除。移除之后,由 NIM SDK 提供需要在界面显示的用户信息。

  • 建议您在界面加载之前设置用户信息代理(IUserInfoDelegate)。以 IM Demo 中的使用场景为例,建议放在首页 NETabBarController 中的viewDidLoad方法中,确保用户信息的获取在界面加载之前进行。
  • getUserInfofetchUserInfo 协议方法都需实现。
  • API 原型

    Swift
    swift/// 设置用户信息代理
    /// - 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;
    
  • 示例代码

    Swift
    swift//设置代理
    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 收到数据之后进行界面渲染
此文档是否对你有帮助?
有帮助
去反馈
  • 用户信息代理
  • 同步获取用户信息
  • 异步获取用户信息
  • 更新用户信息
  • 设置用户信息代理
  • 用户信息说明
  • 用户信息处理逻辑