iOS

群成员管理

更新时间: 2024/03/14 17:08:36

网易云信 NIM SDK 支持用户查询、添加、移除群组成员,管理成员角色等功能,拥有完善的成员权限体系及管理功能,群组内所有用户根据权限分为群主、管理员、以及普通成员。

技术原理

网易云信 NIM SDK 的 NIMTeamManager 提供管理群组成员的相关方法,帮助您快速实现和使用群组的成员权限体系及管理功能。

群组中有三种角色,群主(NIMTeamMemberTypeOwner),群组管理员(NIMTeamMemberTypeManager)以及群组普通成员(NIMTeamMemberTypeNormal),具体请参见 NIMTeamMemberType

前提条件

管理群组管理员

添加群组管理员

只有群主才拥有添加群组管理员的权限。

通过调用addManagersToTeam:users:completion: 方法添加群组管理员。

群主添加管理员后,所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为NIMTeamOperationTypeAddManager

参数说明:

参数 说明
teamId 群ID
users 待添加的管理员账号列表
completion 完成后的回调

示例代码:

NSString *teamId = @"6271272396";
    /// users 用户列表
    NSArray<NSString *> *users = [NSArray arrayWithObjects:@"ios02", @"ios03", nil];
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 添加管理员成功
            NSLog(@"[Add manager in team %@ succeed.]", teamId);
            /// your code ...
        } else {
            /// 添加管理员失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 添加管理员
    [[[NIMSDK sharedSDK] teamManager] addManagersToTeam:teamId
                                                  users:users
                                             completion:completion];

移除群组管理员

只有群主拥有移除群组管理员的权限。

通过调用 removeManagersFromTeam:users:completion: 方法来移除群组管理员。

群主移除群管理员后,身份变为普通成员。所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为NIMTeamOperationTypeRemoveManager

参数说明:

参数 说明
teamId 群ID
users 待移除的管理员账号列表
completion 完成后的回调

示例代码:

NSString *teamId = @"6271272396";
    /// users 用户列表
    NSArray<NSString *> *users = [NSArray arrayWithObjects:@"ios02", nil];
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 移除管理员成功
            NSLog(@"[Remove manager in team %@ succeed.]", teamId);
            /// your code ...
        } else {
            /// 移除管理员失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 移除管理员
    [[[NIMSDK sharedSDK] teamManager] removeManagersFromTeam:teamId
                                                       users:users
                                                  completion:completion];

修改群成员信息

修改群组成员的群昵称

只有群主才有修改群组成员的群昵称的权限。

通过调用 updateUserNick:newNick:inTeam:completion: 来修改群组成员的群昵称。

参数说明:

参数 说明
teamId 群ID
userId 需要修改群昵称的用户账号
newNick 新的群昵称
completion 完成后的回调

示例代码:

NSString *userId = @"ios02";
    /// newNick 成员新昵称
    NSString *newNick = @"ios02's new name";
    /// teamId 群组ID
    NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 更新成员群昵称成功
            NSLog(@"[Update user %@'s nickname to '%@' succeed.]", userId, newNick);
            /// your code ...
        } else {
            /// 更新成员群昵称失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 更新成员群昵称
    [[[NIMSDK sharedSDK] teamManager] updateUserNick:userId
                                             newNick:newNick
                                              inTeam:teamId
                                          completion:completion];

修改自身扩展字段

通过调用 updateMyCustomInfo:inTeam:completion: 方法修改群组中自己的扩展字段。

修改后,其他在线用户自动同步获得修改后的属性。

参数说明:

参数 说明
teamId 群ID
newInfo 新的扩展字段(自定义属性)
completion 完成后的回调

示例代码:

/// newInfo 自定义属性
    NSString *newInfo = @"我的个性化属性";
    /// teamId 群组ID
    NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 更新自定义属性成功
            NSLog(@"[Update my custom info as %@ succeed.]", newInfo);
            /// your code ...
        } else {
            /// 更新自定义属性失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 更新自定义属性
    [[[NIMSDK sharedSDK] teamManager] updateMyCustomInfo:newInfo
                                                  inTeam:teamId
                                              completion:completion];

禁言群组成员

群组全员禁言

只有群主才有禁言全体成员或取消全体成员禁言的权限。

通过调用 updateMuteState:inTeam:completion: 方法来禁言群组全体成员或解除全体成员的禁言。

该接口禁言的对象是包含群主和管理员的所有成员,若只需要禁言普通成员,可以通过调用服务端 API 禁言群组 实现。

群组全员禁言后, 所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为NIMTeamOperationTypeMute

其中,群通知消息中的群组全员禁言模式 NIMTeamAllMuteMode有两个枚举值:

  • NIMTeamAllMuteMode=NIMTeamAllMuteModeMuteAll,表示禁言包含群主和管理员的所有成员。
  • NIMTeamAllMuteMode=NIMTeamAllMuteModeMuteNormal,表示禁言全体普通成员,不包括群主和管理员。

参数说明:

参数 说明
teamId 群ID
mute 是否禁言全体成员。
true:表示禁言
false:表示解除禁言
completion 完成后的回调

示例代码:

/// mute 是否禁言 YES 为是,NO 为否
    BOOL mute = NO;
    /// teamId 群组ID
    NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 修改全体禁言状态 成功
            NSLog(@"[Update mute state to %@ succeed.]", mute ? @"YES" : @"NO");
            /// your code ...
        } else {
            /// 修改全体禁言状态 失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 修改全体禁言状态
    [[[NIMSDK sharedSDK] teamManager] updateMuteState:mute
                                               inTeam:teamId
                                           completion:completion];

禁言指定成员

只有群主才能禁言指定成员。

通过调用 updateMuteState:userId:inTeam:completion: 来禁言指定群组成员或解除群成员的禁言。

修改群成员禁言状态后, 所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为NIMTeamOperationTypeMute

参数说明:

参数 说明
teamId 群ID
userId 被禁言/被解除禁言的用户帐号
mute 是否禁言。
true:表示禁言
false:表示解除禁言
completion 完成后的回调

示例代码:

/// mute 是否禁言 YES 为是,NO 为否
    BOOL mute = NO;
    /// userId 被禁言用户ID
    NSString *userId = @"ios01";
    /// teamId 群组ID
    NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 修改群成员禁言状态 成功
            NSLog(@"[Update %@'s mute state to %@ succeed.]", userId, mute ? @"YES" : @"NO");
            /// your code ...
        } else {
            /// 修改群成员禁言状态 失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 修改群成员禁言状态
    [[[NIMSDK sharedSDK] teamManager] updateMuteState:mute
                                               userId:userId
                                               inTeam:teamId
                                           completion:completion];

查询群组成员

  • 由于群组成员数据较大,且除了进入群组成员列表界面外,其他场景不需要群组成员列表的数据,因此 SDK 不会在登录时同步群组成员数据,而是按照按需获取的原则,当上层主动调用获取指定群的群组成员列表时,才判断是否需要同步。
  • 对于同步或主动远程获取过的群成员,SDK 会将数据缓存在本地。
  • 群成员信息 SDK 本地存储说明: 当自己退群、或者被移出群时,本地数据库会继续保留这个群成员信息,只是设置了无效标记。

查询群组所有成员信息

通过调用 fetchTeamMembers:completion: 方法来获取群组所有成员的信息。

  • 绝大多数情况,该请求将从本地读取缓存并同步返回,但是由于群成员信息量较大,SDK 采取登录后延迟拉取的策略。考虑到用户网络等问题,SDK 有可能没有及时缓存群成员信息,那么该请求将是个带网络请求的异步操作(增量请求)。 同时该接口将请求本地没有缓存的群用户的信息,但不会触发 - (void)onUserInfoChanged: 回调。
  • 获取到的群成员只有云信服务器托管的群相关数据,需要开发者结合自己管理的用户数据进行界面显示。

示例代码:

NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamMemberHandler completion = ^(NSError * __nullable error, NSArray<NIMTeamMember *> * __nullable members)
    {
        if (error == nil) {
            /// 获取群组成员 成功
            NSLog(@"[Fetch team %lu menbers succeed.]", (unsigned long)members.count);
            /// your code ...
        } else {
            /// 获取群组成员 失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 获取群组成员
    [[[NIMSDK sharedSDK] teamManager] fetchTeamMembers:teamId
                                            completion:completion];

从云端查询群组成员

通过调用 fetchTeamMembersFromServer:completion: 方法通过网络请求从云端获取群组成员。

通过网络请求获取群成员列表,不同于fetchTeamMembers,是个必然带网络请求的异步操作(增量请求) 。同时该接口将请求本地没有缓存的群用户的信息,但不会触发 - (void)onUserInfoChanged: 回调。

示例代码:

NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamMemberHandler completion = ^(NSError * __nullable error, NSArray<NIMTeamMember *> * __nullable members)
    {
        if (error == nil) {
            /// 通过网络请求获取群组成员 成功
            NSLog(@"[Fetch team %lu menbers from server succeed.]", (unsigned long)members.count);
            /// your code ...
        } else {
            /// 通过网络请求获取群组成员 失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 通过网络请求获取群组成员
    [[[NIMSDK sharedSDK] teamManager] fetchTeamMembersFromServer:teamId
                                                      completion:completion];

查询指定群组成员信息

通过调用 teamMember:inTeam:来获取群组指定某个成员的信息。

参数说明:

参数 说明
teamId 群ID
userId 需要查询的群成员账号

示例代码:

NSString *userId = @"ios01";
    /// teamId 群组ID
    NSString *teamId = @"6271272396";
    /// 获取群信息
    NIMTeamMember *userConcrete = [[[NIMSDK sharedSDK] teamManager] teamMember:userId
                                                                        inTeam:teamId];

查询群成员的邀请者

通过调用 fetchInviterAccids:withTargetMembers:completion: 来查询群组成员的邀请者。

群成员入群邀请人为空表示主动入群,没有邀请人。

参数说明:

参数 说明
teamID 群ID
memberIDs 需要查询邀请者的群成员账号列表,一次最多查200个
completion 完成后的回调

示例代码:

NSString *teamId = @"6271272396";
    /// users 用户列表
    NSArray<NSString *> *users = [NSArray arrayWithObjects:@"ios01", nil];
    /// completion 完成后的回调
    NIMTeamFetchInviterAccidsHandler completion = ^(NSError * _Nullable error,
                                        NSDictionary<NSString *,NSString *> * _Nullable inviters)
    {
        if (error == nil) {
            /// 获取群成员邀请人Accid 成功
            NSLog(@"[Fetch %@’s inviter: %@ succeed.]", users[0], inviters[users[0]]);
            /// your code ...
        } else {
            /// 获取群成员邀请人Accid 失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 获取群成员邀请人Accid
    [[[NIMSDK sharedSDK] teamManager] fetchInviterAccids:teamId
                                       withTargetMembers:users
                                              completion:completion];

查询被禁言的群成员

通过调用 fetchTeamMutedMembers:completion: 方法来查询被禁言的群成员。

  • 该接口只返回调用 updateMuteState:userId:inTeam:completion: 方法禁言的用户列表。
  • 若需要查询群整体禁言情况,可调用 inAllMuteMode 来实现。
  • 查询某用户是否被禁言,可通过 NIMTeamMember#isMuted 来获取。
  • 当被整体禁言后,但未被 updateMuteState:userId:inTeam:completion: 方法禁言过,则 isMuted 仍为 NO。
  • 绝大多数情况该请求从本地读取缓存并同步返回,但由于群成员信息量较大, SDK 采取登录后延迟拉取的策略。考虑到用户网络等问题, SDK 有可能没有及时缓存群成员信息,那么该请求将是个带网络请求的异步操作(增量请求)。同时该接口将会请求本地没有缓存的群用户信息,但不会触发 onUserInfoChanged: 回调。

示例代码:

NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamMemberHandler completion = ^(NSError * __nullable error, NSArray<NIMTeamMember *> * __nullable members)
    {
        if (error == nil) {
            /// 获取群组被禁言成员 成功
            NSLog(@"[Fetch team %lu menbers succeed.]", (unsigned long)members.count);
            /// your code ...
        } else {
            /// 获取群组被禁言成员 失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 获取群组被禁言成员
    [[[NIMSDK sharedSDK] teamManager] fetchTeamMutedMembers:teamId
                                                 completion:completion];
此文档是否对你有帮助?
有帮助
去反馈
  • 技术原理
  • 前提条件
  • 管理群组管理员
  • 添加群组管理员
  • 移除群组管理员
  • 修改群成员信息
  • 修改群组成员的群昵称
  • 修改自身扩展字段
  • 禁言群组成员
  • 群组全员禁言
  • 禁言指定成员
  • 查询群组成员
  • 查询群组所有成员信息
  • 从云端查询群组成员
  • 查询指定群组成员信息
  • 查询群成员的邀请者
  • 查询被禁言的群成员