群组功能

功能概述

容联云通讯SDK 提供了群组讨论组两种形式的群聊功能。群组拥有更多的权限操作,两种群聊形式在共有操作上保持了接口一致。
讨论组类似当前IM聊天应用内的快速多人会话,没有群组的权限操作,适用于快速创建多人会话的场景。每个讨论组只有一个管理员。管理员可以对讨论组进行增减员操作,普通成员也能对群进行增员操作。在添加新成员的时候,并不需要经过对方同意。
群组的功能更加完整和丰富,在权限上也拥有更多的限制(权限分为群主管理员、以及群成员)。可以设定被邀请模式(是否需要对方同意)群组可以拥有讨论组的全部功能,推荐使用群组进行开发。
 注意事项:
 1、创建的群组的时候注意传入的scope参数,基础版默认可传TEMP,专业版可传NORMAL,若需更大人数群组,请联系专有云商务或在控制台im管理页面进行拓展。 
 2、群组中有三种成员角色,分别是群主、管理员(默认10个,群人数超过10人),普通成员。
 3、群主可以修改,群组信息,群名片,邀请人加入,踢人,解散群组,设置管理员,转让群主,设置群内禁言等。
 4、管理员可以修改群组公告,群名片,邀请人加入,设置群内禁言。
群组和讨论组的详细功能差异对比如下:
功能讨论组群组
群容量IM 专业版 300人/群,最大可扩展至 500 人/群(增值功能)IM 专业版 300人/群,最大可扩展至 2000 人/群(增值功能)                                                                             
创建创建时指定群组类型创建时指定群组类型
群资料属性                                                  讨论组名,讨论组类型,讨论组公告,讨论组扩展字段,讨论组资料修改,讨论组扩展字段修改群名,群公告,群扩展字段,
申请加入群组的验证模式,群邀请模式, 群资料修改,群资料扩展字段修改模式
邀请入群创建时邀请群主和管理员可以邀请
被邀请人同意模式                                                              不需要被邀请人同意支持配置: 需要被邀请人同意 不需要被邀请人同意
申请入群不支持支持
群成员类型群主、普通成员群主、管理员、普通成员
管理员设置不支持设置管理员群主可以增减管理员
群组资料修改权限群主可以修改群主,管理员可以设置
修改群成员昵称管理可以修改任何人的群昵称,普通群成员只能修改自己的昵称群主、管理员可以修改所有人的群昵称。
普通成员只能修改普通群成员的群昵称。
修改自己的群昵称支持支持
消息类型支持文本,图片,附件,语音等文本,图片,附件,语音等
踢人不支持群主和管理员可以踢人,且管理员不能踢群主和其他管理员
主动退群普通群所有人都可以退群;
若群主退群,该群第一个加入的人是群主
除群主外,其他用户均可以主动退群。
群主需先将群转让给其他群成员才可以进行退群操作
禁言不支持管理员对普通成员禁言、解除禁言
转让群不支持群主可以将群的拥有者权限转给群内的其他成员,转移后,
被转让者变为新的群主,原群主变为普通成员。
群主还可以选择在转让的同时,直接退出该群。
解散群不支持群主可以解散群

群组消息

参考单聊文档。

群组功能

创建群组

创建群包含创建群组和创建讨论组两种形式。二者的接口相同,传入不同的类型参数即可(isDiscuss)。
参考类: ECGroup查看API
群组管理类:ECGroupManager查看API
 
我们假设Tony要创建一个名为"出彩中国人",具体代码如下:                            
  • ECGroup * newgroup = [[ECGroup alloc] init];
  • newgroup.name = @"出彩中国人";
  • newgroup.declared = @"欢迎来到容联云通讯";
  • newgroup.isDiscuss = NO;//讨论组该值为YES
  • [[ECDevice sharedInstance].messageManager createGroup:newgroup completion:^(ECError *error, ECGroup *group) {
  •     
  •     if (error.errorCode == ECErrorType_NoError) {
  •         
  •         NSLog(@"创建群组成功 群组ID:%@", group.groupId);
  •     }
  •     else{
  •         NSLog(@"创建群组失败 errorCode:%d\r\nerrorDescription:%@",
  •         (int)error.errorCode,error.errorDescription);
  •     }}];                     

主动加入

只要知道群组id,就可以主动加入群组。              
我们假设"出彩中国人"群组已经有Tony和John两位成员,现在Smith要加入"出彩中国人"群组,则代码如下:                              
  • [[ECDevice sharedInstance].messageManager joinGroup:@"出彩中国人群组ID" reason:@"我要参加出彩中国人"
  •  completion:^(ECError *error, NSString *groupId) {
  •     __strong __typeof(weakSelf)strongSelf = weakSelf;
  •     if (error.errorCode==ECErrorType_Have_Joined) {
  •         NSLog(@"您已经在群组%@", groupId);
  •     }else if(error.errorCode==ECErrorType_NoError){
  •         if (strongSelf.applyGroup.mode == ECGroupPermMode_DefaultJoin) {
  •             NSLog(@"加入群组%@成功!", groupId);
  •         }else{
  •             NSLog(@"申请加入已发出,请等待群主同意请求");
  •         }
  •     }else{
  •         NSLog(@"加入群组失败 errorCode:%d\r\nerrorDescription:%@",
  •         (int)error.errorCode,error.errorDescription);
  •     }}];                                
                
注意:
如果群组"出彩中国人"是公开群组,则Smith直接被允许加入。 如果群组"出彩中国人"是验证群组,则Smith加入需要群主Tony的的同意。
关于几种群组的解释:
公开群组:用户可以直接被允许加入群组,不需要群主或管理员进行验证;
验证群组:用户加入群组的时候需要群主或管理员同意才可以加入;
私有群组:只能群主或管理员邀请加入;

申请加入群组请求通知

Tony首先收到Smith加入的请求,代码如下:                
  • /**
  •  @该通知回调接口是代理类里面统一的关于群组的"群组通知回调接口"—onReceiveGroupNoticeMessage
  •  @brief 接收群组相关消息
  •  @discussion 参数要根据消息的类型,转成相关的消息类;解散群组、收到邀请、申请加入、退出群组、有人加入、移除成员等消息
  •  @param groupMsg 群组消息
  •  */
  •  -(void)onReceiveGroupNoticeMessage:(ECGroupNoticeMessage *)groupMsg{  
  •     if (groupMsg.messageType == ECGroupMessageType_Propose)
  •     {
  •         ECProposerMsg * message = (ECProposerMsg *)groupMsg;
  •         NSString *declared = @"";
  •         if (message.declared.length>0) {
  •             declared = [NSString stringWithFormat:@",理由:%@",message.declared];
  •         }
  •         NSLog(@"\"%@\" 昵称:\"%@\" 申请加入讨论组\"%@\"%@",message.proposer,message.nickName,
  •         message.groupId, declared);
  •     }}
         
Tony同意Smith加入的请求,代码如下:                                 
  • /**
  •  @brief 管理员验证用户申请加入群组
  •  @param groupId 申请加入的群组id
  •  @param memberId 申请加入的成员id
  •  @param type 是否同意
  •  @param completion 执行结果回调block
  •  */[[ECDevice sharedInstance].messageManager ackJoinGroupRequest:@"出彩中国人群组ID" member:@" Smith的账号Id" 
  • ackType:EAckType_Agree completion:^(ECError *error, NSString *gorupId, NSString *memberId) {
  •     if (error.errorCode == ECErrorType_NoError || error.errorCode == ECErrorType_Have_Joined) {
  •         NSLog(@"加入群组");
  •     }else{
  •         NSLog(@"errorCode:%d\rerrorDescription:%@",(int)error.errorCode,error.errorDescription);
  •     }}];
  •                     
         

成员加入通知

Smith加入成功后,群组中成员Tony和John收到的通知回调方法代码如下:                                  
  • /**
  •  @该通知回调接口是代理类里面统一的关于群组的"群组通知回调接口"—onReceiveGroupNoticeMessage
  •  @brief 接收群组相关消息
  •  @discussion 参数要根据消息的类型,转成相关的消息类;解散群组、收到邀请、申请加入、退出群组、有人加入、移除成员等消息
  •  @param groupMsg 群组消息
  •  */
  •  -(void)onReceiveGroupNoticeMessage:(ECGroupNoticeMessage *)groupMsg{  
  •     if (groupMsg.messageType == ECGroupMessageType_ReplyJoin)
  •     {
  •         ECReplyJoinGroupMsg *message = (ECReplyJoinGroupMsg *)groupMsg;
  •         NSLog(@"讨论组\"%@\"%@\"%@\"的加入申请",message.groupId,message.confirm==2?@"同意":@"拒绝",
  •         message.member);
  •     }}
                             

邀请加入 

 只能群主或管理员邀请别人加入                
我们假设"出彩中国人"群组的创建者Tony邀请Smith加入群组,则代码如下:   
  • /**
  •  @brief 管理员邀请加入群组
  •  @param groupId 邀请加入的群组id
  •  @param reason 邀请理由
  •  @param members 邀请加入的人
  •  @param confirm 是否需要对方验证 1:直接加入(不需要验证) 2:需要对方验证
  •  @param completion 执行结果回调block
  •  */
  •  [[ECDevice sharedInstance].messageManager inviteJoinGroup:@"出彩中国人群组ID" reason:@"欢迎来到云通讯" 
  • members:@[@"Smith的账号Id"] confirm:2 completion:^(ECError *error, NSString *groupId, NSArray *members) {
  •     [MBProgressHUD hideHUDForView:self.view animated:YES];
  •     if(error.errorCode ==ECErrorType_NoError)
  •     {
  •         NSLog(@"邀请请求已发出");
  •     }
  •     else
  •     {
  •         NSLog(@"errorCode:%d\rerrorDescription:%@",(int)error.errorCode,error.errorDescription);
  •     }}];
             

用户验证管理员邀请加入群组

注意:如果Tony邀请Smith加入的时候,接口参数不指定加入需要Smith确认,则Smith直接被邀请加入。
如果指定需要Smith同意才能加入,则Smith收到如下通知回调,并在回调里回复"同意"或"拒绝"加入。代码如下:                                  
  • /**
  •  @该通知回调接口是代理类里面统一的关于群组的"群组通知回调接口"—onReceiveGroupNoticeMessage
  •  @brief 接收群组相关消息
  •  @discussion 参数要根据消息的类型,转成相关的消息类; 解散群组、收到邀请、申请加入、退出群组、有人加入、移除成员等消息
  •  @param groupMsg 群组消息
  •  */
  •  -(void)onReceiveGroupNoticeMessage:(ECGroupNoticeMessage *)groupMsg{   
  •     if (groupMsg.messageType == ECGroupMessageType_Invite)
  •     {
  •         ECInviterMsg * message = (ECInviterMsg *)groupMsg;
  •         NSString *declared = @"";
  •         if (message.declared.length>0) {
  •             declared = [NSString stringWithFormat:@",理由:%@",message.declared];
  •         }
  •         NSLog(@"\"%@\"邀请您加入\"%@\"讨论组\"%@",message.admin,message.groupId,declared);

  •         if (message.confirm==1) {
  •             [[ECDevice sharedInstance].messageManager ackInviteJoinGroupRequest:message.groupId 
  •             invitor:message.admin ackType:EAckType_Agree completion:^(ECError *error, NSString *gorupId){
  •                 if (error.errorCode == ECErrorType_NoError) {
  •                     NSLog(@"回复已发出");
  •                 }else{
  •                     NSLog(@"errorCode:%d\rerrorDescription:%@",
  •                     (int)error.errorCode,error.errorDescription);
  •                 }
  •             }];
  •         }
  •     }}                    
         
Smith加入成功后,群组中成员Tony和John收到的通知回调方法代码如下:                                
  • /**
  •  @该通知回调接口是代理类里面统一的关于群组的"群组通知回调接口"—onReceiveGroupNoticeMessage
  •  @brief 接收群组相关消息
  •  @discussion 参数要根据消息的类型,转成相关的消息类; 解散群组、收到邀请、申请加入、退出群组、有人加入、移除成员等消息
  •  @param groupMsg 群组消息
  •  */
  • -(void)onReceiveGroupNoticeMessage:(ECGroupNoticeMessage *)groupMsg{ 
  •     if (groupMsg.messageType == ECGroupMessageType_ReplyInvite)
  •     {
  •         ECReplyInviteGroupMsg *message = (ECReplyInviteGroupMsg *)groupMsg;
  •         NSLog(@"\"%@\"%@讨论组\"%@\"的邀请加入", message.member, 
  •         message.confirm==2?@"同意":@"拒绝", message.groupId);
  •     }}                        

退出群组              

我们假设Smith要退出群组,则代码如下:           
  • /**
  •  @brief 退出群组
  •  @param groupId 退出的群组id
  •  @param completion 执行结果回调block
  •  */[[ECDevice sharedInstance].messageManager quitGroup:@"出彩中国人群组ID" 
  •  completion:^(ECError *error, NSString *groupId) {
  •     [MBProgressHUD hideHUDForView:self.view animated:YES];
  •     if (error.errorCode == ECErrorType_NoError) {
  •         NSLog(@"退出群组");
  •     }
  •     else
  •     {
  •         NSLog(@"errorCode:%d\rerrorDescription:%@",(int)error.errorCode,error.errorDescription);
  •     }
  • }];                  
      

退出群组通知

Smith退出成功后,群组中成员Tony和John收到的通知回调方法代码如下:                                    
  • /**
  •  @该通知回调接口是代理类里面统一的关于群组的"群组通知回调接口"—onReceiveGroupNoticeMessage
  •  @brief 接收群组相关消息
  •  @discussion 参数要根据消息的类型,转成相关的消息类;解散群组、收到邀请、申请加入、退出群组、有人加入、移除成员等消息
  •  @param groupMsg 群组消息
  •  */
  •  -(void)onReceiveGroupNoticeMessage:(ECGroupNoticeMessage *)groupMsg{   
  •     if (groupMsg.messageType == ECGroupMessageType_Quit)
  •     {
  •         ECQuitGroupMsg *message = (ECQuitGroupMsg *)groupMsg;
  •         NSLog(@"\"%@\"退出讨论组\"%@\"",message.member, message.groupId);
  •     }}                          

群主踢人

我们假设群主Tony要把Smith要踢出群组,则代码如下:                              
  • /**
  •  @brief 删除成员
  •  @param groupId 删除成员的群组id
  •  @param member 删除的成员
  •  @param completion 执行结果回调block
  •  */
  •  [[ECDevice sharedInstance].messageManager deleteGroupMember:@"出彩中国人群组ID" 
  •  member:@"Smith的账号Id" completion:^(ECError *error, NSString *groupId, NSString *member) {
  •     
  •     if (error.errorCode ==ECErrorType_NoError) {
  •         NSLog(@"踢人成功");
  •     }
  •     else
  •     {
  •         NSLog(@"errorCode:%d\rerrorDescription:%@",(int)error.errorCode,error.errorDescription);
  •     }
  • }];
  

移除成员通知           

群组中所有成员都会收到的Smith被踢的消息,包括Smith自己,Smith判断被踢用户的id等于自己,则从本地删除群组,
此通知回调方法代码如下:                                
  • /**
  •  @该通知回调接口是代理类里面统一的关于群组的"群组通知回调接口"—onReceiveGroupNoticeMessage
  •  @brief 接收群组相关消息
  •  @discussion 参数要根据消息的类型,转成相关的消息类;解散群组、收到邀请、申请加入、退出群组、有人加入、移除成员等消息
  •  @param groupMsg 群组消息
  •  */
  •  -(void)onReceiveGroupNoticeMessage:(ECGroupNoticeMessage *)groupMsg{   
  •     if (groupMsg.messageType == ECGroupMessageType_RemoveMember){      
  •         ECRemoveMemberMsg *message = (ECRemoveMemberMsg *)groupMsg;
  •         NSLog(@"\"%@\"被移除讨论组\"%@\"", message.member, message.groupId);
  •     }}                   
 

解散群组

只有群主才能解散群组。            
我们假设群主Tony要解散"出彩中国人",则代码如下:                 
  • /**
  •  @brief 删除群组
  •  @param groupId 删除的群组id
  •  @param completion 执行结果回调block
  •  */
  •  [[ECDevice sharedInstance].messageManager deleteGroup:@"出彩中国人群组ID"
  •  completion:^(ECError *error, NSString *groupId) {
  •     [MBProgressHUD hideHUDForView:self.view animated:YES];
  •     if (error.errorCode == ECErrorType_NoError) {
  •         NSLog(@"解散群组成功");
  •     }
  •     else
  •     {
  •         NSLog(@"errorCode:%d\rerrorDescription:%@",(int)error.errorCode,error.errorDescription);
  •     }}];                          

群组解散通知

群组中所有成员收到的通知回调方法代码如下:                      
  • /**
  •  @该通知回调接口是代理类里面统一的关于群组的"群组通知回调接口"—onReceiveGroupNoticeMessage
  •  @brief 接收群组相关消息
  •  @discussion 参数要根据消息的类型,转成相关的消息类;解散群组、收到邀请、申请加入、退出群组、有人加入、移除成员等消息
  •  @param groupMsg 群组消息
  •  */
  •  -(void)onReceiveGroupNoticeMessage:(ECGroupNoticeMessage *)groupMsg{
  •     if (groupMsg.messageType == ECGroupMessageType_Dissmiss){
  •         NSLog(@"讨论组\"%@\"被解散", groupMsg.groupId);
  •     }}        

获取群详情 

代码如下:                               
  • /**
  •  @brief 获取群组属性
  •  @param groupId 获取信息的群组id
  •  @param completion 执行结果回调block
  •  */
  •  [[ECDevice sharedInstance].messageManager getGroupDetail:@"出彩中国人群组ID"
  •  completion:^(ECError *error, ECGroup *group) {
  •     
  •     if (error.errorCode == ECErrorType_NoError) {
  •         NSLog(@"群主:%@",group.owner);
  •         NSLog(@"群名字:%@",group.name);
  •         NSLog(@"群公告:%@",group.declared);
  •         NSLog(@"是否讨论组:%d",group. isDiscuss);
  •     }else{
  •         NSLog(@"errorCode:%d\rerrorDescription:%@",(int)error.errorCode,error.errorDescription);
  •     }
  • }];                       

获取群成员 

代码如下:                                     
  • /**
  •  @brief 查询群组成员
  •  @param groupId 查询的群组id
  •  @param completion 执行结果回调block
  •  */
  •  [[ECDevice sharedInstance].messageManager queryGroupMembers:@"出彩中国人群组ID"
  •  completion:^(ECError *error, NSString* groupId, NSArray *members) {
  •     
  •     if (error.errorCode == ECErrorType_NoError) {
  •         NSLog(@"获取群组成员成功");
  •         for (ECGroupMember *member in members) {
  •             if (member.role == ECMemberRole_Creator) {
  •                 NSLog(@"群组创建者:%@", member.memberId);
  •                 break;
  •             }
  •         }
  •     }else{
  •         NSLog(@"errorCode:%d\rerrorDescription:%@",(int)error.errorCode,error.errorDescription);
  •     }
  • }];                                   

群组搜索  

可以根据群组名字或者群组ID来搜索群组(群组名称为纯数字或纯字母时需要输入完整的群名称) ,代码如下:                                  
  • /**
  •  @brief 按条件搜索公共群组
  •  @param match 需要匹配的条件
  •  @param completion 执行结果回调block
  •  */
  • ECGroupMatch *match = [[ECGroupMatch alloc] init];
  • match.searchType = 2; //搜索类型 1: 群组ID  2:群组名称
  • match.keywords = @"出彩中国人";
  • [[ECDevice sharedInstance].messageManager searchPublicGroups:
  •  match completion:^(ECError *error, NSArray *groups) {
  •     if (error.errorCode == ECErrorType_NoError) {
  •         if(groups.count==0){
  •             NSLog(@"获取到的群组为空");
  •         }else{
  •             for (ECGroup* group in groups) {
  •                 NSLog(@"群组ID:%@",group.groupId);
  •                 NSLog(@"群主:%@",group.owner);
  •                 NSLog(@"群名字:%@",group.name);
  •                 NSLog(@"群公告:%@",group.declared);
  •             }
  •         }
  •     }else {
  •         NSLog(@"errorCode:%d\rerrorDescription:%@",(int)error.errorCode,error.errorDescription);
  •     }
  • }];                                     

获取个人所在的群组 

通常登录之后,需要立即获取自己所在的群组,返回的群组信息包括群组/讨论组id、群组名、群组创建者账号等信息。                                
  • [[ECDevice sharedInstance].messageManager 
  • queryOwnGroupsWith: ECGroupType_Group/ECGroupType_Discuss 
  • completion:^(ECError *error, NSArray *groups) {    
  •     if (error.errorCode == ECErrorType_NoError) {
  •         
  •         for (ECGroup *group in groups) {
  •             NSLog(@"群组ID:%@",group.groupId);
  •             NSLog(@"群主:%@",group.owner);
  •             NSLog(@"群名字:%@",group.name);
  •             NSLog(@"是否讨论组:%d",group. isDiscuss);
  •         }
  •     } else {        
  •     }
  • }];                   
                  

设置群组成员角色

包括设置管理员和成员以及转让群主权限群主权限最高、管理次之、成员最低,同等权限之间不可操作
代码如下:                                
  • /**
  •  @brief 管理员修改用户角色权限
  •  @param groupId 群组id
  •  @param memberId 成员id
  •  @param role 1群主 2管理员 3普通成员
  •  @param completion 执行结果回调block
  •  */
  • -(void)setGroupMemberRole:(NSString*)groupId 
  • member:(NSString*)memberId role:(ECMemberRole)role 
  • completion:(void(^)(ECError*error,NSString*groupId,NSString *memberId))completion;

  • [[ECDevice sharedInstance].messageManager 
  • setGroupMemberRole:”群组id” member:”成员id” role:”角色” 
  • completion:^(ECError *error, NSString *groupId, NSString *memberId) { 
  •    if (error.errorCode == ECErrorType_NoError) {}
  • }];