用户关系托管


NIMUserManager 提供了用户用户关系管理,以及对用户会话的消息设置。在云信中,不是好友也允许聊天。用户关系如果不托管给云信,开发者需要自己在应用服务器维护。

好友关系

获取好友列表

@protocol NIMUserManager <NSObject>
/**
 *  返回我的好友列表
 *
 *  @return NIMUser列表
 */
- (nullable NSArray<NIMUser *> *)myFriends;
@end

好友列表有本地缓存,缓存会在手动/自动登录后与服务器自动进行同步更新。接口返回的是 NIMUser 列表。 NIMUser 封装了开发者向云信托管的好友ID,对此好友的会话设置(是否需要消息提醒,是否是拉黑用户等), 以及用户的详细信息 NIMUserInfo (需要将用户信息交给云信托管)。

好友请求

原型

@protocol NIMUserManager <NSObject>
/**
 *  添加好友
 *
 *  @param request    添加好友请求
 *  @param completion 完成回调
 */
- (void)requestFriend:(NIMUserRequest *)request
            completion:(NIMUserBlock)block;
@end

请求 NIMUserRequest 参数列表

参数 类型 说明
userId NSString 目标用户 ID
operation NIMUserOperation 操作类型
message NSString 附言

示例:

NIMUserRequest *request = [[NIMUserRequest alloc] init];
request.userId          = self.user.usrId;                            //封装用户ID
request.operation       = NIMUserOperationRequest;                    //封装验证方式
request.message         = @"跪求通过";                                 //封装自定义验证消息

监听好友请求

当好友邀请发出后,对方会收到一条系统通知消息 ( NIMSystemNotification ) ,可以通过注册 NIMSystemNotificationManager 中的 addDelegate: 回调来监听。

系统通知的原型和参数说明,请参考系统通知章节

示例

//NIMSystemNotificationManager.m
//全局监听
- (void)viewDidLoad {
    ...
    [[NIMSDK sharedSDK].systemNotificationManager addDelegate:self];
}

好友通知类型 NIMSystemNotificationType 字段值统一为 NIMSystemNotificationTypeFriendAdd

好友的具体通知类型可在 NIMSystemNotification 中的 attachment 字段获取。好友通知类型的 attachment 统一为 NIMUserAddAttachment 类型,在获取时需要强类型转换

加好友的过程会分为多个状态(申请,拒绝,通过),在每个状态都会有系统通知回调。

参数 说明
NIMUserOperationAdd 添加好友,直接添加为好友,无需验证
NIMUserOperationRequest 请求添加好友
NIMUserOperationVerify 通过添加好友请求
NIMUserOperationReject 拒绝添加好友请求

示例

收到请求或者状态变更

//NTESSystemNotificationCell.m
 NIMSystemNotificationType type = self.notification.type;
 switch (type) {
    ...
    case NIMSystemNotificationTypeFriendAdd:
    {
        NSString *text = @"未知请求";
        id object = self.notification.attachment;
        if ([object isKindOfClass:[NIMUserAddAttachment class]]) {
            //强类型转换
            NIMUserOperation operation = [(NIMUserAddAttachment *)object operationType];
            //根据不同的操作类型去处理不同业务
            switch (operation) {
                case NIMUserOperationAdd:
                    // 对方直接加你为好友
                    break;
                case NIMUserOperationRequest:
                    // 对方请求加你为好友
                    break;
                case NIMUserOperationVerify:
                    //对方通过了你的好友请求
                    break;
                case NIMUserOperationReject:
                    //对方拒绝了你的好友请求
                    break;
                default:
                    break;
            }
        }
        self.detailTextLabel.text = text;
    }
    ...
 }

同意或拒绝请求

//SystemNotificationViewController.m
...
 NIMUserRequest *request = [[NIMUserRequest alloc] init];
            request.userId = notification.sourceID;
            request.operation = NIMUserOperationVerify;         
            [[[NIMSDK sharedSDK] userManager] requestFriend:request
                                                 completion];
...

修改系统通知的处理状态

为了让界面交互对部分系统通知做出一些修改,保存处理结果, 比如在好友邀请中,可能存在等待同意,成功,被拒绝等修改。系统通知专门提供了 handleStatus 做为上层自定义装填标记位。修改这个属性,后台会自动更新 db 中对应的数据,默认为 0。

示例

// SystemNotificationViewController.m
- (void)onAccept:(NIMSystemNotification *)notification
{
    ...
    case NIMSystemNotificationTypeFriendAdd:
    {
        NIMUserRequest *request = [[NIMUserRequest alloc] init];
        request.userId = notification.sourceID;
        request.operation = NIMUserOperationVerify;

        [[[NIMSDK sharedSDK] userManager] requestFriend:request
                                                completion:^(NSError *error) {
                                                    if (!error) {
                                                        //验证成功,将状态改掉
                                                        notification.handleStatus = NotificationHandleTypeOk;
                                                    }
                                                    else
                                                    {
                                                        //失败不做修改
                                                    }
                                                    //刷新界面
                                                    [wself.tableView reloadData];
                                                }];
    }
    ...
}

好友添加成功后,会触发回调:

@protocol NIMUserManagerDelegate <NSObject>

@optional
/**
 *  好友状态发生变化 (在线)
 *
 *  @param user 用户对象
 */
- (void)onFriendChanged:(NIMUser *)user;
@end

删除好友

用户和用户之间可以解除好友关系。

@protocol NIMUserManager <NSObject>
/**
 *  删除好友
 *
 *  @param userId      好友Id
 *  @param completion  完成回调
 */
- (void)deleteFriend:(NSString *)userId
          completion:(nullable NIMUserBlock)completion;

/**
 *  删除好友
 *
 *  @param userId      好友Id
 *  @param remove      是否同时删除备注
 *  @param completion  完成回调
 */
- (void)deleteFriend:(NSString *)userId
         removeAlias:(BOOL)remove
          completion:(nullable NIMUserBlock)completion;
@end

参数列表

参数 类型 说明
userId NSString 目标用户 ID
remove BOOL 是否同时删除备注
NIMUserBlock NIMUserBlock 完成回调
@protocol NIMUserManagerDelegate <NSObject>

@optional

/**
 *  好友状态发生变化 (在线)
 *
 *  @param user 用户对象
 */
- (void)onFriendChanged:(NIMUser *)user;
@end

是否好友

/**
 *  判断是否是我的好友
 *
 *  @param userId 用户Id
 *
 *  @return 是否是我的好友 (云信关系)
 */
- (BOOL)isMyFriend:(NSString *)userId;

参数列表

参数 类型 说明
userId NSString 查询目标用户 ID

黑名单

云信中,黑名单和好友关系是互相独立的,即修改好友关系不会影响黑名单关系,同时,修改黑名单也不会对好友关系进行操作。

获取黑名单成员列表

@protocol NIMUserManager <NSObject>
/**
 *  返回所有在黑名单中的用户列表
 *
 *  @return 黑名单成员NIMUser列表
 */
- (nullable NSArray<NIMUser *> *)myBlackList;
@end

黑名单列表有本地缓存,缓存会在手动/自动登录后与服务器自动进行同步更新。接口返回的是 NIMUser 列表。 NIMUser 封装了开发者向云信托管的好友ID,对此好友的会话设置(是否需要消息提醒,是否是拉黑用户等), 以及用户的详细信息 NIMUserInfo (需要将用户信息交给云信托管)。

添加用户到黑名单

@protocol NIMUserManager <NSObject>
/**
 *  添加用户到黑名单
 *
 *  @param userId          用户Id
 *  @param completion      完成回调
 */
- (void)addToBlackList:(NSString *)userId
            completion:(NIMUserBlock)completion;
@end

参数列表

参数 类型 说明
userId NSString 目标用户 ID
NIMUserBlock NIMUserBlock 完成回调

拉黑成功后,会同时修改本地缓存,并触发回调:

@protocol NIMUserManagerDelegate <NSObject>

@optional
/**
 *  黑名单列表发生变化 (在线)
 */
- (void)onBlackListChanged;
@end

将用户从黑名单移除

@protocol NIMUserManager <NSObject>

/**
 *  将用户从黑名单移除
 *
 *  @param userId        用户Id
 *  @param completion    完成回调
 */
- (void)removeFromBlackBlackList:(NSString *)userId
                      completion:(NIMUserBlock)completion;
@end

参数列表

参数 类型 说明
userId NSString 目标用户 ID
NIMUserBlock NIMUserBlock 完成回调

移除成功后,会同时修改本地缓存,并触发回调:

@protocol NIMUserManagerDelegate <NSObject>

@optional
/**
 *  黑名单列表发生变化 (在线)
 */
- (void)onBlackListChanged;

@end

判断用户是否在自己的黑名单内

@protocol NIMUserManager <NSObject>
/**
 *  判断用户是否已被拉黑
 *
 *  @param userId 用户Id
 *
 *  @return 是否已被拉黑
 */
- (BOOL)isUserInBlackList:(NSString *)userId;
@end

参数列表

参数 类型 说明
userId NSString 目标用户 ID

此接口是根据本地缓存数据来判断是否拉黑的,在调用时请保证本地缓存是正确的(登录后有正常完成数据同步)。

当 A 用户 被 B 用户加入黑名单后,A 用户发送消息 B 用户给将会返回错误码 7101 。如果选择重发,此时为了避免开发者循环重试以及方便上层做 UI 展示,会返回成功状态码 200 ,但是这条消息仍不会投递给用户 A。

消息提醒

云信中,可以单独设置是否开启某个用户的消息提醒,即对某个用户静音。静音关系和好友关系是互相独立的,修改好友关系不会影响静音关系,同时,修改静音关系也不会对好友关系进行操作。

获取静音成员列表

@protocol NIMUserManager <NSObject>
/**
 *  静音列表
 *
 *  @return 返回被我设置为取消消息通知的NIMUser列表
 */
- (NSArray<NIMUser *> *)myMuteUserList;
@end

静音列表有本地缓存,缓存会在手动/自动登录后与服务器自动进行同步更新。接口返回的是 NIMUser 列表。 NIMUser 封装了开发者向云信托管的好友ID,对此好友的会话设置(是否需要消息提醒,是否是拉黑用户等), 以及用户的详细信息 NIMUserInfo (需要将用户信息交给云信托管)。

设置消息提醒

@protocol NIMUserManager <NSObject>
/**
 *  设置消息提醒
 *
 *  @param notify       是否提醒
 *  @param userId       用户Id
 *  @param completion   完成回调
 */
- (void)updateNotifyState:(BOOL)notify
                  forUser:(NSString *)userId
               completion:(nullable NIMUserBlock)completion
@end

参数列表

参数 类型 说明
notify BOOL 是否提醒
userId NSString 目标用户 ID
NIMUserBlock NIMUserBlock 完成回调

设置成功之后,同时更新本地缓存数据。

用户是否有消息提醒

@protocol NIMUserManager <NSObject>
/**
 *  是否需要消息通知
 *
 *  @param userId 用户Id
 *
 *  @return 是否需要消息通知
 */
- (BOOL)notifyForNewMsg:(NSString *)userId;
@end

参数列表

参数 类型 说明
userId NSString 目标用户 ID

此接口是根据本地缓存数据来判断是否有消息提醒的,在调用时请保证本地缓存是正确的(登录后有正常完成数据同步)。

当修改用户资料成功后,会触发回调:

@protocol NIMUserManagerDelegate <NSObject>

@optional
/**
 *  用户个人信息发生变化 (在线)
 *
 *  @param user 用户对象
 *  @discussion 出于性能和上层 APP 处理难易度的考虑,本地调用批量接口获取用户信息时不触发当前回调。
 */
- (void)onUserInfoChanged:(NIMUser *)user;
@end

好友信息

本地获取用户资料

原型:

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

参数列表

参数 类型 说明
userId NSString 目标用户 ID

更新好友信息

/**
 *  修改自己与目标用户的关系
 *
 *  @param user       目标用户
 *  @param completion 修改结果回调
 *  @discussion  这个接口提供了备注名的修改以及一些扩展。这些值是基于当前用户和目标用户关系的,
 *               同一个目标用户的的属性字段会随着登录用户的改变而改变。
 *
 */
- (void)updateUser:(NIMUser *)userId
        completion:(nullable NIMUserBlock)completion;

参数列表

参数 类型 说明
userId NSString 目标用户 ID
completion NIMUserBlock 完成回调

修改自己资料

原型:

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

参数列表

参数 类型 说明
values NSDictionary 用户信息键值对
completion NIMUserBlock 完成回调

示例:

NSDictionary *dict =@{
                     @(NIMUserInfoUpdateTagAvatar) : urlString
                           };
    [[NIMSDK sharedSDK].userManager updateMyUserInfo:dict
                                                  completion:^(NSError *error) {
        if (error) {
            msg = @"设置头像失败,请重试";
        } else {
            wself.team.avatarUrl = urlString;
        }
        if (completion) {
            completion(error, msg);
        }
    }];