iOS

群组管理

更新时间: 2024/11/21 15:38:17

网易云信 NIM SDK 提供了高级群形式的群组功能,支持用户创建、加入、退出、转让、修改、查询、解散群组,拥有完善的管理功能。

SDK 的 NIMTeamManager 提供群组操作相关接口, NIMTeamManagerDelegate 提供群组相关回调接口,帮助您快速实现和使用群组的管理功能。

群组相关事件监听

在进行群组操作前,您可以提前注册监听群相关事件。监听后,在进行群组管理相关操作时,会收到对应的通知。

可以根据用户需求,监听以下事件回调。

通过调用 addDelegate: 方法添加群组相关事件的监听。

示例代码如下:

/// 自定义类实现 NIMTeamManagerDelegate 接口

/// 群组委托接口调用类声明
/// NIMTeamAdapter.h
@interface NIMTeamAdapter :NSObject<NIMTeamManagerDelegate>

@end

/// 群组委托接口调用类实现
/// NIMTeamAdapter.m
@implementation NIMTeamAdapter
/// 更改群组信息时的回调
- (void)onTeamUpdated:(NIMTeam *)team {
    NSLog(@"[On team updated, teamId: %@]", [team teamId]);
}
@end
...

/// main.m
/// 实例化接口调用的类
static NIMTeamAdapter *adpater;
adpater = [[NIMTeamAdapter alloc] init];
/// 添加群组委托
[[[NIMSDK sharedSDK] teamManager] addDelegate:adpater];
/// 更新群信息,触发委托
// [[[NIMSDK sharedSDK] teamManager] updateTeamName:@"TestDelegate"
//                                           teamId:@"6271272396"
//                                       completion:nil];

若想要取消监听,可调用removeDelegate: 方法移除监听。

实现流程

本章节通过群主、管理员、普通成员之间的交互为例,介绍群组管理的实现流程。

sequenceDiagram



用户A ->> NIM SDK:创建群组<br>(createTeam)
用户A ->> NIM SDK:邀请用户B加入群组<br>(addUsers)
用户B ->> NIM SDK:接受入群邀请<br>(acceptInviteWithTeam)
用户C ->> NIM SDK:申请入群<br>(applyToTeam)
用户A ->> NIM SDK:接受用户C的入群申请<br>(passApplyToTeam)
用户A ->> NIM SDK:将群主转让给用户B<br>(transferManagerWithTeam)
用户B ->> NIM SDK:将用户A踢出群组<br>(kickUsers)
用户C ->> NIM SDK:主动退出群组<br>(quitTeam)
用户B ->> NIM SDK:解散群组<br>(dismissTeam)

创建群组

通过调用createTeam:completion:方法创建群组,创建者即为该群群主。

原创建群接口 createTeam:users:completion:已废弃。

参数 类型 说明
name NSString 群名
type NIMTeamType 群组类型默认为 NIMTeamTypeAdvanced,即高级群。高级群拥有完善的成员权限体系及管理功能。为避免产生问题,不建议使用其他取值。
avatarUrl NSString 群头像
intro NSString 群简介
announcement NSString 群公告
clientCustomInfo NSString 客户端自定义信息
postscript NSString 邀请他人的附言
joinMode NIMTeamJoinMode 群验证模式
NIMTeamJoinModeNoAuth:(默认)不需要验证,即允许所有人入群
NIMTeamJoinModeNeedAuth:加此群需要相关人员的验证
NIMTeamJoinModeRejectAll:不允许任何人加入 该参数只有在群类型为高级群时有效。
inviteMode NIMTeamInviteMode 群组邀请模式
NIMTeamInviteModeManager:(默认)管理员,仅限管理员可以邀请人进群
NIMTeamInviteModeAll:所有人,所有人都可以邀请人进群 该参数只有在群类型为高级群时有效。
beInviteMode NIMTeamBeInviteMode 被邀请模式
NIMTeamBeInviteModeNeedAuth:(默认)此群邀请某人,需要此人验证通过才能加入
NIMTeamBeInviteModeNoAuth:不需要验证
该参数只有在群类型为高级群时有效。
updateInfoMode NIMTeamUpdateInfoMode 群信息修改权限
NIMTeamUpdateInfoModeManager:(默认)管理员,仅限管理员可以修改群信息
NIMTeamUpdateInfoModeAll:所有人,所有人都可以修改 该参数只有在群类型为高级群时有效。
updateClientCustomMode NIMTeamUpdateClientCustomMode 客户端群信息自定义字段修改权限
NIMTeamUpdateClientCustomModeManager:(默认)管理员
NIMTeamUpdateClientCustomModeAll :所有人 该参数只有在群类型为高级群时有效。
maxMemberCountLimitation NSUInteger 群最大人数上限,默认 200 人
antispamBusinessId NSString 需要进行内容审核的业务ID
users NSArray<NSString *> 邀请用户列表

示例代码:

NIMCreateTeamExOption *option = [NIMCreateTeamExOption new];
[option setName:@"一个被创建的群聊"];
[option setType:NIMTeamTypeAdvanced];
[option setIntro:@"一个被创建的群聊的简介"];
/// users 用户Accid列表
[option setUsers:@[@"user01", @"user02"]];
/// completion 完成后的回调
NIMTeamCreateHandler completion = ^(NSError * __nullable error,
        NSString * __nullable teamId,
        NSArray<NSString *> * __nullable failedUserIds)
{
    if (error == nil) {
        /// 群组创建成功
        NSLog(@"[Create team succeeded, teamId: %@]", teamId);
        /// your code ...
    } else {
        /// 群组创建失败
        NSLog(@"[NSError message: %@]", error);
    }
};
/// 创建群组
[[[NIMSDK sharedSDK] teamManager] createTeam:option completion:completion];

加入群组

加入群组可以通过以下两种方式:

  • 用户接受邀请入群。
  • 用户主动申请入群。

邀请入群

邀请入群的权限可以通过 inviteMode 来定义,设为 NIMTeamInviteModeManager,那么仅限群主和管理员可以邀请人进群;设为 NIMTeamInviteModeAll ,那么群组内的所有人都可以邀请人进群。

通过调用 addUsers:toTeam:postscript:attach:completion: 方法邀请其他用户进入群组。

  • 若群组的被邀请模式 beInviteModeNIMTeamBeInviteModeNoAuth,那么无需验证,其他用户可直接加入群组。
  • 若群组的被邀请模式 beInviteModeNIMTeamBeInviteModeNeedAuth,那么需要被邀请用户同意才能加入群组。

如果在被邀请成员中存在成员拥有的群组数量已达上限,则会返回失败成员的账号列表。

参数说明:

参数 说明
teamId 群ID
users 邀请入群的用户账号列表
attach 自定义扩展字段,不需要的话设置为空 ,最长512字符
postscript 邀请附言,不需要的话设置为空
completion 完成后的回调
  • 发起邀请后,被邀请用户会收到 NIMSystemNotification 系统通知,其通知类型为NIMSystemNotificationTypeTeamInvite。在通知中可以获取邀请人 ID、邀请进入的群组 ID 以及邀请附言。
  • 被邀请用户可以调用 acceptInviteWithTeam 方法接受入群邀请,接受即入群。所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为 NIMTeamOperationTypeAcceptInvitation
  • 也可以调用 rejectInviteWithTeam 方法拒绝入群邀请。拒绝后,邀请者会收到 NIMSystemNotification 系统通知,其通知类型为 NIMSystemNotificationTypeTeamApplyReject

示例代码:

 /// users 待邀请入群用户Accid列表
    NSArray<NSString *> *users = [NSArray arrayWithObjects:@"ios01", @"ios02", nil];
    /// teamId 邀请进入的群组 ID
    NSString *teamId = @"6271272396";
    /// postscript 邀请附言,选填
    NSString *postscript = @"邀请你进入群聊";
    /// attach 扩展消息,选填
    NSString *attach = @"扩展消息";
    /// completion 完成后的回调
    NIMTeamMemberHandler completion = ^(NSError * __nullable error, NSArray<NIMTeamMember *> * __nullable members)
    {
        if (error == nil) {
            /// 邀请用户入群成功,members 为成功邀请的群成员列表
            NSLog(@"[Add %lu users to team: %@ succeed]", (unsigned long)[members count], teamId);
            /// your code ...
        } else {
            /// 邀请用户入群失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 邀请用户入群
    [[[NIMSDK sharedSDK] teamManager] addUsers:users
                                        toTeam:teamId
                                    postscript:postscript
                                        attach:attach
                                    completion:completion];

//接受入群邀请
    NSString *teamId = @"6271272396";
    /// invitorId 邀请者ID
    NSString *invitorId = @"ios02";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 接受入群邀请成功
            NSLog(@"[Accept invite of invitor: %@ in team: %@ succeed.]", invitorId, teamId);
            /// your code ...
        } else {
            /// 接受入群邀请失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 接受入群邀请
    [[[NIMSDK sharedSDK] teamManager] acceptInviteWithTeam:teamId
                                                 invitorId:invitorId
                                                completion:completion];


//拒绝入群邀请
    NSString *teamId = @"6271272396";
    /// invitorId 邀请者ID
    NSString *invitorId = @"ios02";
    /// rejectReason 拒绝原因
    NSString *rejectReason = @"不想加入该群";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 拒绝入群邀请成功
            NSLog(@"[Reject invite of invitor: %@ in team: %@ succeed.]", invitorId, teamId);
            /// your code ...
        } else {
            /// 拒绝入群邀请失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 拒绝入群邀请
    [[[NIMSDK sharedSDK] teamManager] rejectInviteWithTeam:teamId
                                                 invitorId:invitorId
                                              rejectReason:rejectReason
                                                completion:completion];

申请入群

通过调用 applyToTeam:message:completion: 方法申请加入群组。

  • 若群组的加入模式 joinModeNIMTeamJoinModeNoAuth,那么无需验证,其他用户可直接加入群组。
  • 若群组的加入模式 joinModeNIMTeamJoinModeNeedAuth,那么需要群主或者群管理员同意才能加入群组。
  • 若群组的加入模式 joinModeNIMTeamJoinModeRejectAll,那么该群组不接受入群申请,仅能通过邀请方式入群。

参数说明:

参数 说明
teamId 群ID
message 申请附言
completion 完成后的回调
  • 当用户发起入群申请后,该群群主和管理员会收到 NIMSystemNotification 系统通知,其通知类型为NIMSystemNotificationTypeTeamApply
  • 群主和群管理员可以调用 passApplyToTeam 方法接受入群申请,接受即入群。所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为 NIMTeamOperationTypeApplyPass
  • 群主和群管理员也可以调用 rejectApplyToTeam 方法拒绝入群申请。拒绝后,申请者会收到 NIMSystemNotification 系统通知,其通知类型为 NIMSystemNotificationTypeTeamIviteReject

示例代码:

    NSString *teamId = @"6271272396";
    /// message 申请时的附言
    NSString *message = @"我要申请加群";
    /// completion 完成后的回调
    NIMTeamApplyHandler completion = ^(NSError * __nullable error, NIMTeamApplyStatus applyStatus)
    {
        if (error == nil) {
            /// 群申请成功
            NSLog(@"[Apply to team: %@ succeed, apply status: %ld]", teamId,(long)applyStatus);
            /// your code ...
        } else {
            /// 群申请失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 群申请
    [[[NIMSDK sharedSDK] teamManager] applyToTeam:teamId
                                          message:message
                                       completion:completion];


  //同意入群申请
    NSString *teamId = @"6271272396";
    /// userId 申请人ID
    NSString *userId = @"ios02";
    /// completion 完成后的回调
    NIMTeamApplyHandler completion = ^(NSError * __nullable error, NIMTeamApplyStatus applyStatus)
    {
        if (error == nil) {
            /// 通过群申请成功
            NSLog(@"[Pass apply in team: %@ of user: %@ succeed, apply status: %ld]", teamId, userId, (long)applyStatus);
            /// your code ...
        } else {
            /// 通过群申请失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 通过群申请
    [[[NIMSDK sharedSDK] teamManager] passApplyToTeam:teamId
                                               userId:userId
                                           completion:completion];


  //拒绝入群申请
    NSString *teamId = @"6271272396";
    /// userId 申请人ID
    NSString *userId = @"ios02";
    /// rejectReason 拒绝申请理由
    NSString *rejectReason = @"拒绝用户入群";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 拒绝群申请成功
            NSLog(@"[Reject apply in team: %@ of user: %@ succeed]", teamId, userId);
            /// your code ...
        } else {
            /// 拒绝群申请失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 拒绝群申请
    [[[NIMSDK sharedSDK] teamManager] rejectApplyToTeam:teamId
                                                 userId:userId
                                           rejectReason:rejectReason
                                             completion:completion];

转让群组

只有群主才有转让群组的权限。

通过调用 transferManagerWithTeam:newOwnerId:isLeave:completion: 方法将群组转让给其他成员。

  • 转让群后, 群主身份转移,所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为 NIMTeamOperationTypeTransferOwner
  • 如果转让群的同时离开群, 那么相当于同时调用quitTeam主动退群。所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为 NIMTeamOperationTypeLeave`。
  • 用户退群成功后,相关会话信息仍然会保留,但不再能接收关于此群的消息。

参数说明:

参数 说明
teamId 群ID
newOwnerIdt 转让后的新群主账号
isLeave 转让群的同时是否退出该群
true:退出
false:不退出,身份变为普通群成员
completion 完成后的回调

示例代码:

NSString *teamId = @"6271272396";
    /// newOwnerId 新群主ID
    NSString *newOwnerId = @"ios02";
    /// 是否离开本群
    BOOL isLeave = YES;
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 转移群主成功
            NSLog(@"[Transfer manager to new owner: %@ succeed.]", newOwnerId);
            /// your code ...
        } else {
            /// 转移群主失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 转移群主
    [[[NIMSDK sharedSDK] teamManager] transferManagerWithTeam:teamId
                                                   newOwnerId:newOwnerId
                                                      isLeave:isLeave
                                                   completion:completion];

退出群组

退出群组可以通过以下两种方式:

  • 群主或群组管理员将用户踢出群组。
  • 用户主动退群。

踢人出群

  • 只有群主和管理员才能将成员踢出群组。
  • 管理员不能踢群主和其他管理员。

通过调用 kickUsers:fromTeam:completion: 方法将成员踢出群组。

  • 移除成员后,所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为 NIMTeamOperationTypeKick
  • 被踢出的用户相关会话信息仍然会保留,但不再能接收关于此群的消息。

参数说明:

参数 说明
teamId 群ID
users 被踢出的群成员账号列表
completion 完成后的回调

示例代码:

/// users 待踢出用户Accid列表
    NSArray<NSString *> *users = [NSArray arrayWithObjects:@"ios02", nil];
    /// teamId 踢出群组的群组 ID
    NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 踢人出群成功
            NSLog(@"[Kick users from team: %@ succeed]", teamId);
            /// your code ...
        } else {
            /// 踢人出群失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 踢出群组
    [[[NIMSDK sharedSDK] teamManager] kickUsers:users
                                       fromTeam:teamId
                                     completion:completion];

主动退群

通过调用 quitTeam:completion: 方法主动退出群组。

  • 除群主(需先转让群主)外,其他用户均可以直接主动退群。主动退群后, 所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为 NIMTeamOperationTypeLeave
  • 用户退群成功后,相关会话信息仍然会保留,但不再能接收关于此群的消息。

示例代码:

/// teamId 为想要退出的群组 ID
    NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 退出群组成功
            NSLog(@"[Quit team succeeded, teamId: %@]", teamId);
            /// your code ...
        } else {
            /// 退出群组失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 退出群组,注:群主需转让群主身份后才可退出
    [[[NIMSDK sharedSDK] teamManager] quitTeam:teamId
                                    completion:completion];

解散群组

只有群主才能解散群组。

通过调用 dismissTeam:completion: 方法解散群组。

解散群后, 所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为 NIMTeamOperationTypeDismiss

群解散后,所有群用户关于此群会话会被保留,但是不能在此群会话中收发消息。

示例代码:

/// teamId 为想要解散的群组 ID
    NSString *teamId = @"6271321659";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 群组解散成功
            NSLog(@"[Dismiss team succeeded, teamId: %@]", teamId);
            /// your code ...
        } else {
            /// 群组解散失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 解散群组
    [[[NIMSDK sharedSDK] teamManager] dismissTeam:teamId
                                       completion:completion];

修改群组信息

修改群信息需要权限。若该群组的群信息修改权限(updateInfoMode)为 NIMTeamUpdateInfoModeManager,那么只有群主和管理员才能修改群组信息;若为 NIMTeamUpdateInfoModeAll,则群组内的所有人都可以修改群组信息。

可修改的群组属性:群组名称、群组头像、群组简介、群组公告、入群验证方式、邀请模式、被邀请模式、群全体禁言模式、群信息修改权限、群自定义信息修改权限、群自定义信息等。

当用户更新群组信息后,所有群成员会收到群组通知消息(消息类型为 NIMMessageTypeNotification),触发事件为 NIMTeamOperationTypeUpdate

修改群组的单个属性信息

群组属性的对应方法如下:

修改的群组属性 对应的方法 说明
群组名称 updateTeamName:teamId:completion: -
群组头像 updateTeamAvatar:teamId:completion: 群组头像若要上传到云信服务器上,则需要使用头像资源处理
群组简介 updateTeamIntro:teamId:completion: -
群组公告 updateTeamAnnouncement:teamId:completion: -
入群验证方式 updateTeamJoinMode:teamId:completion: NIMTeamJoinModeNoAuth:不需要验证,即允许所有人入群
NIMTeamJoinModeNeedAuth:加此群需要相关人员的验证
NIMTeamJoinModeRejectAll:不允许任何人加入
被邀请模式 updateTeamBeInviteMode:teamId:completion: NIMTeamBeInviteModeNoAuth:不需要验证
NIMTeamBeInviteModeNeedAuth:此群邀请某人,需要此人验证通过才能加入
邀请模式 updateTeamInviteMode:teamId:completion: NIMTeamInviteModeManager:管理员,仅限管理员可以邀请人进群
NIMTeamInviteModeAll:所有人,所有人都可以邀请人进群
群信息修改权限 updateTeamUpdateInfoMode:teamId:completion: NIMTeamUpdateInfoModeManager:管理员,仅限管理员可以修改群信息
NIMTeamUpdateInfoModeAll:所有人,所有人都可以修改
群自定义信息修改权限 updateTeamUpdateClientCustomMode:teamId:completion: NIMTeamUpdateClientCustomModeManager:管理员
NIMTeamUpdateClientCustomModeAll :所有人
群自定义信息 updateTeamCustomInfo:teamId:completion: SDK 提供了群信息的拓展接口,开发者可以自行定义内容

这里以修改群组名称为例,请参考以下示例代码:

 /// teamName 待更新的群组名
    NSString *teamName = @"更新后的群组名";
    /// teamId 待更新群组名的群组ID
    NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 更新群组名成功
            NSLog(@"[Update team name to: %@ succeed]", teamName);
            /// your code ...
        } else {
            /// 更新群组名失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 更新群组名
    [[[NIMSDK sharedSDK] teamManager] updateTeamName:teamName
                                              teamId:teamId
                                          completion:completion];

修改群组的多个属性信息

通过调用 updateTeamInfos:teamId:completion: 方法批量修改群组的多个属性信息。

参数说明:

参数 说明
teamId 群ID
values 需要更新的群信息键值对
completion 完成后的回调

传入的数据键值对为 {@(NIMTeamUpdateTag) : NSString},无效数据将被过滤,具体请参见NIMTeamUpdateTag

示例代码:

NSDictionary<NSNumber *,NSString *> *values = @{
        @(NIMTeamUpdateTagName):@"一次性改群名",
        @(NIMTeamUpdateTagIntro):@"一次性改群简介",
        @(NIMTeamUpdateTagAnouncement):@"一次性改群公告"
    };
    /// teamId 待更新的群组ID
    NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamHandler completion = ^(NSError * __nullable error)
    {
        if (error == nil) {
            /// 更新群信息成功
            NSLog(@"[Update team infos to: %@ succeed]", values[@(NIMTeamUpdateTagName)]);
            /// your code ...
        } else {
            /// 更新群信息失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 更新群信息
    [[[NIMSDK sharedSDK] teamManager] updateTeamInfos:values
                                                teamId:teamId
                                            completion:completion];
接口:

修改本地群组信息

通过调用 updateTInfosLocal: 方法修改本地群组信息,不会同步到服务端。

示例代码:

/// updateTInfosLocal 通常搭配批量拉取群信息的服务使用,如 earchTeamWithOption:, fetchTeamsWithTimestamp:completion: 
    /// option 查询选项: 可设置搜索选项 为 id(01) 或 name(10) 或 id|name(11); 并设置搜索内容
    NIMTeamSearchOption *option = [NIMTeamSearchOption new];
    /// 设置搜索选项为 匹配TeamID
    [option setSearchContentOption:NIMTeamSearchContentOptiontId];
    /// 设置搜索内容为 @"6271272396"
    [option setSearchContent:@"6271272396"];
    /// completion 完成后的回调
    NIMTeamSearchHandler completion = ^(NSError * __nullable error, NSArray<NIMTeam *> * __nullable teams)
    {
        if (error == nil) {
            /// 查询群信息 成功,得到查询结果列表 teams
            NSLog(@"[Search team with option %@ total %ld team(s) succeed.]", [option searchContent], [teams count]);
            ///=================================================
            /// teams 待更新的群组列表
            NSArray<NIMTeam *> *updateTeams = teams;
            /// 更新群本地信息
            BOOL didUpdate = [[[NIMSDK sharedSDK] teamManager] updateTInfosLocal:updateTeams];
            ///=================================================
            NSLog(@"[Update team info result: %@.]", didUpdate ? @"YES" : @"NO");
        } else {
            /// 查询群信息 失败
            NSLog(@"[NSError message: %@]", error);
        }
        /// 查询群信息
        [[[NIMSDK sharedSDK] teamManager] searchTeamWithOption:option
                                                    completion:completion];
    };

查询群组信息

NIM SDK 在程序启动时会对本地群信息进行同步,所以只需要调用本地缓存接口获取群即可。

SDK 支持批量查询自己加入的所有群组、以及根据单个群 id 查询指定群组。同样 SDK 也提供了远程获取群信息的接口。

查询所有群信息

通过调用fetchTeamsWithTimestamp:completion:方法从服务端全量拉取群信息,并做本地持久化。

参数说明:

参数 说明
timestamp 0 表示全量获取群信息
block 完成后的回调

示例代码:

 /// timeInterval 时间戳,0 表示全量获取群信息
    NSTimeInterval timeInterval = 0;
    /// completion 完成后的回调
    NIMTeamFetchTeamsHandler completion = ^(NSError * __nullable error, NSArray<NIMTeam *> * __nullable teams)
    {
        if (error == nil) {
            /// 获取所有群信息 成功
            NSLog(@"[Fetch %lu teams with timestamp.]", [teams count]);
        } else {
            /// 获取所有群信息 失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 获取所有群信息
    [[[NIMSDK sharedSDK] teamManager] fetchTeamsWithTimestamp:timeInterval
                                                   completion:completion];

本地查询自己加入的所有群组

通过调用allMyTeams方法从本地查询自己加入的所有群组。

示例代码如下:

/// teams 为加入的所有群组
    NSArray<NIMTeam*> *teams = [[[NIMSDK sharedSDK] teamManager] allMyTeams];

本地根据 ID 查询指定群组

通过调用teamById 方法从本地查询指定群组信息。

建议在主线程调用该方法,否则可能导致程序崩溃和数据读写丢失。

示例代码如下:

/// teamId 为想要查询的群组 ID
    NSString *teamId = @"6121310012";
    /// team 为群组 ID 获取具体的群组信息,如果自己不在群里,则该接口返回 nil
    NIMTeam *team = [[[NIMSDK sharedSDK] teamManager] teamById:teamId];

群组信息 SDK 本地存储说明:

解散群、退出群或者被移出群时,本地数据库会继续保留该群组信息。如果用户手动清空全部本地数据,下次登录同步时,服务器将不同步无效的群组,用户将无法取得已退出群的群组信息。

从云端查询指定群组

/// teamId 群组ID
    NSString *teamId = @"6271272396";
    /// completion 完成后的回调
    NIMTeamFetchInfoHandler completion = ^(NSError * __nullable error, NIMTeam * __nullable team)
    {
        if (error == nil) {
            /// 获取群信息 成功
            NSLog(@"[Fetch teamId:%@’s infomation: %@ succeed.]", teamId, [team teamName]);
            /// your code ...
        } else {
            /// 获取群信息  失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 获取群信息
    [[[NIMSDK sharedSDK] teamManager] fetchTeamInfo:teamId
                                         completion:completion];

如果查询的群是属于自己的群,则会更新本地缓存的群数据。

/// 待获取的指定群 ID
    NSArray<NSString *> *teamsId = [NSArray arrayWithObjects:@"6271272396", nil];
    /// completion 完成后的回调
    NIMTeamFetchTeamInfoListHandler completion = ^(NSError * __nullable error,
                                                   NSArray<NIMTeam *> * __nullable teams,
                                                   NSArray<NSString *> * __nullable failedTeamIds)
    {
        if (error == nil) {
            /// 获取指定群ID信息 成功
            NSLog(@"[Fetch %lu teams succeeded, %lu failed in total.]", [teams count], [failedTeamIds count]);
        } else {
            /// 获取指定群ID信息 失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 获取指定群ID信息
    [[[NIMSDK sharedSDK] teamManager] fetchTeamInfoList:teamsId
                                             completion:completion];
  • 批量查询时,若数组元素超过10个会取前10个。
  • 批量查询是从服务端全量拉取群信息,不做本地持久化。

群组检索

通过调用searchTeamWithOption:completion:方法搜索与关键字匹配的所有群。

NIMTeamSearchOption参数说明:

参数 说明
searchContentOption 搜索文本的匹配区域,类型为 NIMTeamSearchContentOption
ignoreingCase 是否忽略大小写,默认 YES
searchContent 搜索关键字文本

NIMTeamSearchContentOption 枚举说明:

typedef NS_OPTIONS(NSInteger, NIMTeamSearchContentOption ) {
   // 群名检索
   NIMTeamSearchContentOptiontName = 1 < < 0,
   // 群id检索
   NIMTeamSearchContentOptiontId = 1 < < 1,
   // 群名与群id均检索
   NIMTeamSearchContentOptionTeamAll = NIMTeamSearchContentOptiontName | NIMTeamSearchContentOptiontId,
};

示例代码如下:

/// option 查询选项: 可设置搜索选项 为 id(01) 或 name(10) 或 id|name(11); 并设置搜索内容
    NIMTeamSearchOption *option = [NIMTeamSearchOption new];
    /// 设置搜索选项为 匹配TeamID
    [option setSearchContentOption:NIMTeamSearchContentOptiontId];
    /// 设置搜索内容为 @"6271272396"
    [option setSearchContent:@"6271272396"];
    /// completion 完成后的回调
    NIMTeamSearchHandler completion = ^(NSError * __nullable error, NSArray<NIMTeam *> * __nullable teams)
    {
        if (error == nil) {
            /// 查询群信息 成功,得到查询结果列表 teams
            NSLog(@"[Search team with option %@ total %ld team(s) succeed.]", [option searchContent], [teams count]);
            /// your code ...
        } else {
            /// 查询群信息 失败
            NSLog(@"[NSError message: %@]", error);
        }
    };
    /// 查询群信息
    [[[NIMSDK sharedSDK] teamManager] searchTeamWithOption:option
                                                completion:completion];
此文档是否对你有帮助?
有帮助
去反馈
  • 群组相关事件监听
  • 实现流程
  • 创建群组
  • 加入群组
  • 邀请入群
  • 申请入群
  • 转让群组
  • 退出群组
  • 踢人出群
  • 主动退群
  • 解散群组
  • 修改群组信息
  • 修改群组的单个属性信息
  • 修改群组的多个属性信息
  • 修改本地群组信息
  • 查询群组信息
  • 查询所有群信息
  • 本地查询自己加入的所有群组
  • 本地根据 ID 查询指定群组
  • 从云端查询指定群组
  • 群组检索