群组功能
功能概述
容联云通讯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) {}
- }];