Flutter

群组管理

更新时间: 2024/03/07 11:27:46

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

技术原理

网易云信 NIM SDK 的 TeamService 提供群组操作相关接口以及群组相关观察者通知接口,帮助您快速实现和使用群组的管理功能。

群组相关事件监听

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

可以根据用户需求,调用以下方法进行监听。

  • onTeamListRemove:监听群组移除,即移除群的观察者通知。自己退群,群被解散,自己被踢出群时,会收到该通知。
  • onTeamListUpdate:监听群组更新,即群信息变动观察者通知。新建群和群更新的通知都通过该接口传递。

示例代码如下:

dart  /// 群信息变动观察者通知。新建群和群更新的通知都通过该接口传递
  /// observer 观察者, 参数为有更新的群资料列表
  final result = await NimCore.instance.teamService.onTeamListUpdate.listen((event) {
          print('=======onTeamListUpdate event : $event');
        });
dart /// 移除群的观察者通知。自己退群,群被解散,自己被踢出群时,会收到该通知
 /// observer 观察者, 参数为被移除的群信息
 /// 移除成功后,Team#isMyTeam 返回 false
   final result = await NimCore.instance.teamService.onTeamListRemove.listen((event) {
          print('=======onTeamListRemove event : $event');
        });

由于获取群组信息和群成员信息需要跨进程异步调用,开发者最好能在第三方 APP 中做好群组和群成员信息缓存,查询群组和群成员信息时都从本地缓存中访问。在群组或者群成员信息有变化时,SDK 会告诉注册的观察者,此时,第三方 APP 可更新缓存,并刷新界面。

实现流程

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

uml diagram

创建群组

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

参数说明:

参数 说明
CreateTeamOptions 预设的群组信息,具体请参见NIMCreateTeamOptions群组类型请选择 advanced 创建高级群,高级群拥有完善的成员权限体系及管理功能。为避免产生问题,不建议使用其他取值。
members 邀请加入的成员帐号列表
  • 预设的群组属性的字段说明请参见群组对象
  • 群组创建成功后,返回 team 对象以及被邀请成员中群组数量已达上限的成员列表(failedInviteAccounts)。

示例代码:

// 群组类型
    NIMTeamTypeEnum type = NIMTeamTypeEnum.advanced;
// 创建时可以预设群组的一些相关属性。
// fields 中,key 为数据字段,value 对对应的值,该值类型必须和 field 中定义的 fieldType 一致
    NIMCreateTeamOptions  options= NIMCreateTeamOptions();
    final result = await NimCore.instance.teamService.createTeam(
        createTeamOptions: options,
        members: ['members']);

加入群组

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

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

邀请入群

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

通过调用 addMembersEx 方法邀请其他用户进入群组。

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

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

参数说明:

参数 说明
teamId 群ID
accounts 邀请入群的用户账号列表
customInfo 自定义扩展字段,不需要的话设置为空 ,最大长度 512 字符
msg 邀请附言,不需要的话设置为空
  • 发起邀请后,被邀请用户会收到 SystemMessage 系统通知,其通知类型为teamInvite
  • 被邀请用户可以调用 acceptInvite 方法接受入群邀请,接受即入群。所有群成员会收到群组通知消息(消息类型为 NIMMessageType.notification),触发事件为acceptInvite
  • 也可以调用 declineInvite 方法拒绝入群邀请。拒绝后,邀请者会收到 SystemMessage 系统通知,其通知类型为 declineTeamInvite

示例代码:

   final result = await NimCore.instance.teamService.addMembersEx(
      teamId: teamId,
      accounts: [accid1,accid2],
      msg: 'message',
      customInfo: 'message',
    );

//接受邀请
    final result = await NimCore.instance.teamService.acceptInvite(
      teamId,
      inviter,
    );

//拒绝邀请
    final result = await NimCore.instance.teamService.declineInvite(
      teamId,
      inviter,
        reason
    );

申请入群

通过调用 applyJoinTeam 方法申请加入群组。

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

直接加入群或者进入等待验证状态时,返回群组信息。

参数说明:

参数 说明
teamId 群ID
postscript 申请附言
  • 当用户发起入群申请后,该群群主和管理员会收到 SystemMessage 系统通知,其通知类型为applyJoinTeam
  • 群主和群管理员可以调用 passApply 方法接受入群申请,接受即入群。所有群成员会收到群组通知消息(消息类型为 NIMMessageType.notification),触发事件为passTeamApply
  • 群主和群管理员也可以调用 rejectApply 方法拒绝入群申请。拒绝后,申请者会收到 SystemMessage系统通知,其通知类型为 rejectTeamApply

示例代码:

  final result = await NimCore.instance.teamService.applyJoinTeam(
      'teamId',
      'postscript',
    );

//同意入群申请
    final result = await NimCore.instance.teamService.passApply(
      'teamId',
      'account'
    );

//拒绝入群申请
    final result = await NimCore.instance.teamService.rejectApply(
      'teamId',
      'account',
      'reason'
    );

转让群组

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

通过调用 transferTeam 方法将群组转让给其他成员。

  • 转让群后, 群主身份转移,所有群成员会收到群组通知消息(消息类型为 NIMMessageType.notification),触发事件为transferOwner
  • 如果转让群的同时离开群, 那么相当于同时调用quitTeam主动退群。所有群成员会收到群组通知消息(消息类型为 NIMMessageType.notification),触发事件为leaveTeam

参数说明:

参数 说明
teamId 群ID
account 转让后的群主账号
quit 转让群的同时是否退出该群
true:退出
false:不退出,身份变为普通群成员

示例代码:

// false表示群主转让后不退群
 final result = await NimCore.instance.teamService.transferTeam(
      'teamId',
      'account',
      false,
    );

退出群组

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

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

踢人出群

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

通过调用 removeMembers 方法将成员踢出群组。 移除成员后,所有群成员会收到群组通知消息(消息类型为 NIMMessageType.notification),触发事件为kickMember

参数说明:

参数 说明
teamId 群ID
members 被踢出的群成员账号列表

示例代码:

// teamId表示群ID,account表示被踢出的成员帐号
    final result = await NimCore.instance.teamService.removeMembers(
      'teamId',
      ['accids'],
    );

主动退群

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

除群主(需先转让群主)外,其他用户均可以直接主动退群。主动退群后, 所有群成员会收到群组通知消息(消息类型为 NIMMessageType.notification),触发事件为leaveTeam

示例代码:

  final result = await NimCore.instance.teamService.quitTeam(
      'teamId',
    );

解散群组

只有群主才能解散群组。

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

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

示例代码:

  final result = await NimCore.instance.teamService.dismissTeam(
        'teamId'
    );

修改群组信息

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

可更新的群组属性请参见NIMTeamUpdateFieldRequest

接口 数据类型 说明
setAnnouncement String? 设置群公告
setBeInviteMode NIMTeamBeInviteModeEnum 设置被邀请方入群模式:是否需要被邀请人同意
setExtension String? 设置群扩展字段(客户端自定义信息)
setIcon String? 设置群头像,头像若要上传到云信服务器上,则需要使用头像资源处理
setIntroduce String? 设置群简介
setInviteMode NIMTeamInviteModeEnum 设置邀请模式:谁可以邀请他人入群
setName String? 设置群名称
setTeamExtensionUpdateMode NIMTeamExtensionUpdateModeEnum 设置群资料扩展字段修改模式:谁可以修改群自定义属性(扩展字段)
setTeamUpdateMode NIMTeamUpdateModeEnum 设置群资料修改模式:谁可以修改群资料
setVerifyType NIMVerifyTypeEnum 设置申请加入群的验证模式
setMaxMemberCount int 设置最大群成员数量
toMap Map<String, dynamic>? 群属性集合

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

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

参数说明:

参数 说明
teamId 群ID
request 待更新的所有字段的新的信息,具体请参考NIMTeamUpdateFieldRequest

示例代码:

// 以名字,介绍,公告为例
 NIMTeamUpdateFieldRequest request = NIMTeamUpdateFieldRequest();
 request.setName('更新群名');
 request.setIntroduce('更新群简介');
 request.setAnnouncement('更新群公告');
 final result = await NimCore.instance.teamService.updateTeamFields(
          teamId,
          request,
        );

查询群组信息

查询自己加入的所有群组

通过异步调用queryTeamList方法从本地查询自己加入的所有群组(不包括退出的群和被移除群)。示例代码如下:

final result = await NimCore.instance.teamService.queryTeamList();
        handleCaseResult = ResultBean(
            code: result.code, message: methodName, data: result.data);

查询指定群组

通过异步调用queryTeam方法在本地查询指定群组信息。

  • 如果本地没有该群组信息,则去服务器查询。
  • 如果自己不在该群组中,接口返回的可能是过期信息,如需最新的,请调用 searchTeam 方法去服务器查询。

示例代码如下:

     final result = await NimCore.instance.teamService
        .queryTeam('teamId');

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

  • 解散群、退出群或者被移出群时,本地数据库会继续保留该群组信息,只是设置了无效标记,此时依然可以通过 queryTeam 接口查询该群组信息,只是 isMyTeam 返回 false 。 如果用户手动清空全部本地数据,下次登录同步时,服务器将不同步无效的群组,用户将无法取得已退出群的群组信息。

  • 群解散后,通过 searchTeam 接口从服务器查询结果将返回 null

从云端查询指定群组

  • 通过调用searchTeam方法从云端获取指定的单个群组。示例代码如下:
  final result = await NimCore.instance.teamService
        .searchTeam('teamId');

群组检索

  • 通过调用searchTeamIdByName方法根据群名称搜索群组 ID。示例代码如下:
 final result = await NimCore.instance.teamService.searchTeamIdByName(
          'name',
        );

示例代码如下:

final result = await NimCore.instance.teamService.searchTeamsByKeyword(
          'keyword',
        );

API 参考

API
说明
createTeam 创建群组
addMembersEx 邀请入群
acceptInvite 接受入群邀请
declineInvite 拒绝入群邀请
applyJoinTeam 申请入群
passApply 接受入群申请
rejectApply 拒绝入群申请
removeMembers 踢人出群
quitTeam 主动退群
transferTeam 转让群组
dismissTeam 解散群组
updateTeamFields 批量修改群组的多个属性信息
queryTeamList 从查询自己加入的所有群组
queryTeam 查询指定群组信息
searchTeam 从云端批量获取指定群组
searchTeamIdByName 根据群名称查询群组 ID
searchTeamsByKeyword 搜索与关键字匹配的所有群
此文档是否对你有帮助?
有帮助
去反馈
  • 技术原理
  • 群组相关事件监听
  • 实现流程
  • 创建群组
  • 加入群组
  • 邀请入群
  • 申请入群
  • 转让群组
  • 退出群组
  • 踢人出群
  • 主动退群
  • 解散群组
  • 修改群组信息
  • 查询群组信息
  • 查询自己加入的所有群组
  • 查询指定群组
  • 从云端查询指定群组
  • 群组检索
  • API 参考