群组管理


群组分为四种类型。

/*!
 @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 权限的调用。

/*!
 *  屏蔽群消息,服务器不再发送此群的消息给用户,owner不能屏蔽群消息
 *
 *  @param aGroupId         要屏蔽的群ID
 *  @param aCompletionBlock 完成的回调
 */
- (void)blockGroup:(NSString *)aGroupId
        completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock;

/*!
 *  取消屏蔽群消息
 *
 *  @param aGroupId         要取消屏蔽的群ID
 *  @param aCompletionBlock 完成的回调
 */
- (void)unblockGroup:(NSString *)aGroupId
          completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock;

管理群组的 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);
}

上一页:好友管理

下一页:聊天室管理