群组管理
群组分为四种类型。
/*! @enum @brief 群组类型 @constant EMGroupStylePrivateOnlyOwnerInvite 私有群组,创建完成后,只允许 Owner 邀请用户加入 @constant EMGroupStylePrivateMemberCanInvite 私有群组,创建完成后,只允许 Owner 和群成员邀请用户加入 @constant EMGroupStylePublicJoinNeedApproval 公开群组,创建完成后,只允许 Owner 邀请用户加入; 非群成员用户需发送入群申请,Owner 同意后才能入组 @constant EMGroupStylePublicOpenJoin 公开群组,创建完成后,允许非群组成员加入,不需要管理员同意 @discussion eGroupStyle+Private:私有群组,只允许群组成员邀请人进入 eGroupStyle+Public: 公有群组,允许非群组成员加入 */ typedef NS_ENUM(NSInteger, EMGroupStyle){ EMGroupStylePrivateOnlyOwnerInvite = 0, EMGroupStylePrivateMemberCanInvite, EMGroupStylePublicJoinNeedApproval, EMGroupStylePublicOpenJoin, };
群组操作
创建群组
目前创建群组支持的配置属性有:
- 群名称
- 群描述
- 群人数(不支持修改,目前上限为2000人)
- 群类型(即上面提到的四种群组类型)
同步方法:
EMError *error = nil; EMGroupOptions *setting = [[EMGroupOptions alloc] init]; setting.maxUsersCount = 500; setting.style = EMGroupStylePublicOpenJoin;// 创建不同类型的群组,这里需要才传入不同的类型 EMGroup *group = [[EMClient sharedClient].groupManager createGroupWithSubject:@"群组名称" description:@"群组描述" invitees:@[@"6001",@"6002"] message:@"邀请您加入群组" setting:setting error:&error]; if(!error){ NSLog(@"创建成功 -- %@",group); }
获取群详情
/*! @method @brief 获取群组信息 @param aGroupId 群组ID @param aIncludeMembersList 是否获取成员列表 @param pError 错误信息 @return 群组 @discussion 同步方法,会阻塞当前线程 */ - (EMGroup *)fetchGroupInfo:(NSString *)aGroupId includeMembersList:(BOOL)aIncludeMembersList error:(EMError **)pError; //调用: //EMError *error = nil; //EMGroup *group = [[EMClient sharedClient].groupManager fetchGroupInfo:@"groupId" includeMembersList:YES error:&error];
加入群组
群组分4种类型,目前 SDK 不支持自主选择是否进群。我们将针对每种类型讲解加入群组要进行的操作。
- EMGroupStylePrivateOnlyOwnerInvite: 该类型的群组只允许群主(Owner)添加人进群,其他人无法主动加入。
- EMGroupStylePrivateMemberCanInvite: (推荐使用)该类型的群组允许所有群成员添加人进群,其他人无法主动加入。
- EMGroupStylePublicJoinNeedApproval: (推荐使用)该类型的群组只允许群主(Owner)添加人进群;其他人想进入群组的话,需要先发送申请,群主同意申请之后才能进群;其他人无法主动加入。
- EMGroupStylePublicOpenJoin: (不推荐使用)该类型的群组允许任何人主动加入群组。
添加人进群
注册群组回调:
//EMChatManagerDelegate //注册群组回调 [[EMClient sharedClient].groupManager addDelegate:self delegateQueue:nil]; //移除群组回调 [[EMClient sharedClient].groupManager removeDelegate:self];
被添加的人会收到回调:
/*! @method @brief 用户B设置了自动同意,用户A邀请用户B入群,SDK 内部进行同意操作之后,用户B接收到该回调 */ - (void)didJoinedGroup:(EMGroup *)aGroup inviter:(NSString *)aInviter message:(NSString *)aMessage;
加人接口如下:
EMError *error = nil; [[EMClient sharedClient].groupManager addOccupants:@[@"user1"] toGroup:@"groupId" welcomeMessage:@"message" error:&error];
发送进群申请
// 申请加入需要审核的公开群组 EMError *error = nil; [[EMClient sharedClient].groupManager applyJoinPublicGroup:@"groupId" message:@"" error:nil];
处理进群申请
只有 Owner 有权限处理进群申请。
1. 收到进群申请。
/*! @method @brief 用户A向群组G发送入群申请,群组G的群主O会接收到该回调 */ - (void)didReceiveJoinGroupApplication:(EMGroup *)aGroup applicant:(NSString *)aApplicant reason:(NSString *)aReason;
2. 同意进群申请。
/*! @method @brief 同意加入群组的申请 @param aGroupId 所申请的群组 ID @param aGroupname 申请的群组名称 @param aUsername 申请人的 username @discussion 需要 Owner 权限 同步方法,会阻塞当前线程 */ - (EMError *)acceptJoinApplication:(NSString *)aGroupId groupname:(NSString *)aGroupname applicant:(NSString *)aUsername; //调用: //EMError *error = [[EMClient sharedClient].groupManager acceptJoinApplication:@"groupId" groupname:@"subject" applicant:@"user1"];
3. 拒绝加群申请。
EMError *error = [[EMClient sharedClient].groupManager declineJoinApplication:@"groupId" groupname:@"subject" applicant:@"user1" reason:@"拒绝的原因"];
加入 eGroupStyle_PublicOpenJoin 类型的群组
EMError *error = nil; [[EMClient sharedClient].groupManager joinPublicGroup:@"1410329312753" error:&error];
退出群组
群主(Owner)不支持退群操作,只能解散群。
退出群组分为主动退群和被动退群。被动退群即为被 Owner 踢出群组。
主动退群
EMError *error = nil; [[EMClient sharedClient].groupManager leaveGroup:@"1410329312753" error:&error];
被动退群
会通过以下回调通知被踢者。
/*! @method @brief 接收到离开群组,群组被销毁或者被从群中移除 */ - (void)didReceiveLeavedGroup:(EMGroup *)aGroup reason:(EMGroupLeaveReason)aReason;
解散群组
解散群组需要 Owner 权限。
EMError *error = nil; [[EMClient sharedClient].groupManager destroyGroup:@"groupId" error:&error]; if (!error) { NSLog(@"解散成功"); }
修改群名称
只有 Owner 有权限修改。
EMError *error = nil; // 修改群名称 [[EMClient sharedClient].groupManager changeGroupSubject:@"要修改的名称" forGroup:@"1410329312753" error:&error]; if (!error) { NSLog(@"修改成功"); }
修改群描述
不推荐使用 ,只有 Owner 有权限操作。
EMError *error = nil; // 修改群描述 EMGroup* group = [[EMClient sharedClient].groupManager changeDescription:@"修改的群描述" forGroup:@"1410329312753" error:&error]; if (!error) { NSLog(@"修改成功"); }
群成员管理
移除群成员
只有 Owner 权限才能调用。
/*! @method @brief 将群成员移出群组 @param aOccupants 要请出群组的人的用户名列表 @param aGroupId 群组ID @param pError 错误信息 @result 返回群组对象 @discussion 此操作需要 Owner 权限 同步方法,会阻塞当前线程 */ - (EMGroup *)removeOccupants:(NSArray *)aOccupants fromGroup:(NSString *)aGroupId error:(EMError **)pError; //调用: //EMError *error = nil; //[[EMClient sharedClient].groupManager removeOccupants:@[@"user1"] fromGroup:@"1410329312753" error:&error];
加入群黑名单
只有 Owner 权限才能调用该接口,并且只有 Owner 权限的才能查看群黑名单。
可以将群成员和非群成员的人加入群黑名单。
/*! @method @brief 将某些人加入群组黑名单 @param aOccupants 要加入黑名单的用户名列表 @param aGroupId 群组ID @param pError 错误信息 @result 返回群组对象 @discussion 此操作需要 Owner 权限。被加入黑名单的人,不会再被允许进入群组。 同步方法,会阻塞当前线程 */ - (EMGroup *)blockOccupants:(NSArray *)aOccupants fromGroup:(NSString *)aGroupId error:(EMError **)pError; //调用: //EMError *error = nil; //EMGroup *group = [[EMClient sharedClient].groupManager blockOccupants:@[@"user1"] fromGroup:@"1410329312753" error:&error];
移出群黑名单
只有 Owner 权限才能调用该接口,并且只有 Owner 权限的才能查看群黑名单。
从群黑名单移除出去,该用户已经不在群组里了,需要重新加入群组。
/*! @method @brief 将某些人从群组黑名单中解除 @param aOccupants 要从黑名单中移除的用户名列表 @param aGroupId 群组ID @param pError 错误信息 @result 返回群组对象 @discussion 此操作需要 Owner 权限。从黑名单中移除后不再是群组成员,需要重新加入。 同步方法,会阻塞当前线程 */ - (EMGroup *)unblockOccupants:(NSArray *)aOccupants forGroup:(NSString *)aGroupId error:(EMError **)pError; //调用: //EMError *error = nil; //EMGroup *group = [[EMClient sharedClient].groupManager unblockOccupants:@[@"user1"] forGroup:@"1410329312753" error:&error];
群消息
屏蔽/取消屏蔽群组推送
不允许 Owner 权限的调用。
/*! @method @brief 屏蔽/取消屏蔽群组推送 @param aGroupId 群组ID @param aIgnore 是否屏蔽 @result 错误信息 @discussion 同步方法,会阻塞当前线程 */ - (EMError *)ignoreGroupPush:(NSString *)aGroupId ignore:(BOOL)aIgnore; //调用: //EMError *error = [[EMClient sharedClient].groupManager ignoreGroupPush:@"1410329312753" ignore:YES];
管理群组的 APNS 离线推送
获取与登录者相关的群组
查看所有当前登录账号所在群组,包括创建的和加入的群组,提供了三种方法。
1.从服务器获取与我相关的群组列表
EMError *error = nil; NSArray *myGroups = [[EMClient sharedClient].groupManager getMyGroupsFromServerWithError:&error]; if (!error) { NSLog(@"获取成功 -- %@",myGroups); }
2. 获取数据库中所有的群组
NSArray *groupList = [[EMClient sharedClient].groupManager loadAllMyGroupsFromDB];
3. 取内存中的值
从内存中获取所有群组。
NSArray *groupList = [[EMClient sharedClient].groupManager getAllGroups];
获取公开群组
获取指定范围内的公开群。
EMError *error = nil; EMCursorResult *result = [[EMClient sharedClient].groupManager getPublicGroupsFromServerWithCursor:nil pageSize:50 error:&error]; if (!error) { NSLog(@"获取成功 -- %@",result); }