用户关系托管


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;
@end

参数列表

参数 类型 说明
userId NSString 目标用户 ID
NIMUserBlock NIMUserBlock 完成回调
@protocol NIMUserManagerDelegate <NSObject>

@optional

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

黑名单

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

@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