IM 即时通讯
iOS
产品介绍
简介
主要功能
产品优势
功能介绍
帐号集成与登录
基础消息功能
群组功能
聊天室功能
聊天室标签功能
圈组功能
多端登录与互踢策略
质量数据监控台
海外数据中心
IM平滑迁移方案
接口及业务限制
更新日志
IM UIKit 更新日志
NIM SDK 开发版更新日志
NIM SDK 稳定版更新日志
体验 Demo
下载 SDK 与 Demo 源码
快速开始
跑通 IM Demo 源码
跑通圈组 Demo 源码
实现单聊消息收发(不含 UI)
实现圈组消息收发(不含 UI)
含 UI 集成
什么是 IM UIKit
IM UIKit 功能概览
快速集成 IM UIKit
组件导入
初始化与登录
界面跳转
自定义用户信息
会话列表相关
集成会话列表界面
自定义会话列表 UI
会话列表 API 概览
会话消息相关
集成会话消息界面
实现地理位置消息功能
实现音视频通话
实现自定义消息收发
自定义会话消息 UI
会话消息 API 概览
通讯录相关
集成通讯录界面
自定义通讯录 UI
通讯录 API 概览
IM UIKit API 概览
不含 UI 集成
集成 SDK
初始化
登录相关
登录 IM
多端登录与互踢
登出 IM
消息相关
消息概述
消息收发
自定义消息收发
消息配置选项
NOS 资源场景
广播消息收发
消息已读回执
消息撤回
消息重发与转发
消息更新
消息过滤
语音消息处理
本地消息插入
历史消息
最近会话
服务端会话服务
用户资料
用户关系
在线状态订阅
系统通知
离线推送
群组功能
群组概述
群组管理
群成员管理
群消息管理
超大群功能
聊天室
圈组功能
圈组概述
登录管理
服务器相关
服务器概述
服务器管理
服务器成员管理
游客功能
服务器未读数管理
频道相关
频道概述
频道管理
频道黑白名单
实时互动频道
频道分组
频道分组黑白名单
频道未读数管理
搜索服务器与频道
身份组相关
身份组概述
身份组应用场景
服务器身份组
频道身份组
频道分组身份组
用户定制权限
自定义权限项
成员权限查询与判定
身份组相关查询
圈组订阅机制
圈组消息相关
图解圈组消息流转
圈组消息收发
圈组消息撤回
圈组消息更新
圈组消息删除
消息正在输入
会话消息回复(Thread)
圈组快捷评论
圈组消息缓存
圈组消息搜索
查询历史消息
查询@我的消息
圈组系统通知相关
圈组系统通知概述
圈组系统通知收发
圈组系统通知更新
圈组离线推送
圈组内容审核
圈组第三方回调
圈组相关抄送
圈组各端接口命名差异
反垃圾
聊天扩展
其他
最佳实践
IM 登录最佳实践
聊天室重要消息投递
参考文档
iOS PushKit 配置
iOS苹果推送配置
API 参考
iOS SDK API
iOS SDK 状态码
IM 控制台指南
创建应用
注册 IM 账号
升级服务
开通聊天室功能
配置客户端应用标识
常见问题
FAQ
错题集
iOS 推送问题排查
服务协议

群成员管理

更新时间: 2022/12/05 17:07: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: 方法来禁言群组全体成员或解除全体成员的禁言。

群组全员禁言分为两种模式。

  • 若群组的禁言模式 NIMTeamAllMuteModeNIMTeamAllMuteModeMuteAll,那么调用该接口禁言的对象是包含群主和管理员的所有成员。
  • 若群组的禁言模式 NIMTeamAllMuteModeNIMTeamAllMuteModeMuteNormal,那么调用该接口禁言的对象是全体普通成员,不包括群主和管理员。

参数说明:

参数 说明
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 方法禁言的用户列表。
  • 若需要查询群整体禁言情况,可调用 inAllMuteMode 来实现。
  • 查询某用户是否被禁言,可通过 NIMTeamMember#isMuted 来获取。
  • 当被整体禁言后,但未被 updateMuteState:userId 方法禁言过,则 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];

API 参考

API
说明
addManagersToTeam 添加群组管理员
removeManagersFromTeam 移除群组管理员
updateUserNick 修改群组成员的昵称
updateMyCustomInfo 修改群组中自己的扩展字段
updateMuteState:inTeam 禁言群组全体成员
updateMuteState:userId 禁言指定群组成员
fetchTeamMembers 查询群组所有成员
fetchTeamMembersFromServer 通过网络请求获取群组成员
teamMember 查询群组指定成员的信息
fetchInviterAccids 查询群组成员的邀请者
fetchTeamMutedMembers 查询被禁言的群组成员
isMyTeam 根据群组 ID 查询是否是否是我所在的群
此文档是否对你有帮助?
有帮助
我要吐槽
  • 技术原理
  • 前提条件
  • 管理群组管理员
  • 添加群组管理员
  • 移除群组管理员
  • 修改群成员信息
  • 修改群组成员的群昵称
  • 修改自身扩展字段
  • 禁言群组成员
  • 群组全员禁言
  • 禁言指定成员
  • 查询群组成员
  • 查询群组所有成员信息
  • 从云端查询群组成员
  • 查询指定群组成员信息
  • 查询群成员的邀请者
  • 查询被禁言的群成员
  • API 参考