====== 群组管理 ====== 更新时间:2022-01-15 新版文档见:[[ccim:android:group1|群组]] **注意**:''1、群主+管理员 一起一共不超过 100 个,也就是不超过 99 个管理员。2、群组成员最大数(包括群主)取决于所选择的版本,不同版本最大数不同。'' ---- SDK3.3.0 release 新增许多群组操作的 API,请查看链接[[im:300iosclientintegration:3.3.0apichange|3.3.0api 修改]] 群组管理主要涉及到的环信 SDK 头文件如下: // 群组部分,有群组id等属性 EMGroup.h // 群组属性选项部分,用于创建群组时的属性设置 EMGroupOptions.h // 群组共享文件部分 EMGroupSharedFile.h // 群组方法调用部分,比如添加代理,移除代理,创建群组,获取群组列表等 IEMGroupManager.h // 群组的协议回调方法部分,比如监听有用户加群的回调方法等 EMGroupManagerDelegate.h 注册群组模块回调: 协议: EMGroupManagerDelegate 代理: //注册群组回调 [[EMClient sharedClient].groupManager addDelegate:self delegateQueue:nil]; //移除群组回调 [[EMClient sharedClient].groupManager removeDelegate:self]; ---- 群组分为四种类型。 /*! @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, }; ===== 群组操作 ===== ==== 创建群组 ==== 目前创建群组支持的配置属性有: * 群名称 * 群描述 * 群人数(不支持修改,目前上限为3000人) * 群类型(即上面提到的四种群组类型) 异步方法: EMGroupOptions *setting = [[EMGroupOptions alloc] init]; // 群组属性选项 setting.maxUsersCount = 500; // 群组的最大成员数(含群主、管理员,默认是200,最大3000) setting.IsInviteNeedConfirm = NO; //邀请群成员时,是否需要发送邀请通知.若NO,被邀请的人自动加入群组 setting.style = EMGroupStylePublicOpenJoin;// 创建不同类型的群组,这里需要才传入不同的类型 setting.ext = @"群组扩展信息"; // 扩展信息 /*! * 创建群组 * * 异步方法 * * @param aSubject 群组名称 * @param aDescription 群组描述 * @param aInvitees 群组成员(不包括创建者自己,不能超过100个) * @param aMessage 邀请消息 * @param aSetting 群组属性 * @param pError 出错信息 * * @return 创建的群组 */ - (void)createGroupWithSubject:(NSString *)aSubject description:(NSString *)aDescription invitees:(NSArray *)aInvitees message:(NSString *)aMessage setting:(EMGroupOptions *)aSetting completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager createGroupWithSubject:@"群组名称" description:@"群组描述" invitees:@[@"6001",@"6002"] message:@"邀请您加入群组" setting:setting completion:^(EMGroup *aGroup, EMError *aError) { if(!aError){ NSLog(@"创建群组成功 -- %@",aGroup); } else { NSLog(@"创建群组失败的原因 --- %@", aError.errorDescription); } }]; ==== 获取群详情 ==== ''注意:从3.7.4版本开始支持 “是否获取群组成员”参数'' /*! * 获取群组详情,包含群组ID,群组名称,群组描述,群组基本属性,群组Owner, 群组管理员 * * @param aGroupId 群组ID * @param fetchMembers 是否获取群组成员,默认最多取200人数 * @param aCompletionBlock 完成的回调 * */ - (void)getGroupSpecificationFromServerWithId:(NSString *)aGroupId fetchMembers:(BOOL)fetchMembers completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; //调用: [[EMClient sharedClient].groupManager getGroupSpecificationFromServerWithId:self.group.groupId fetchMembers:YES completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { // EMGroup中包含了很多群组属性,比如群组id,群组成员,是否屏蔽群组消息(isBlocked属性)等,具体到SDK中EMGroup.h头文件查看 NSLog(@"获取群组详情成功"); } else { NSLog(@"获取群组详情失败的原因 --- %@", aError.errorDescription); } }]; ==== 加入群组 ==== 群组分4种类型,目前 SDK 不支持自主选择是否进群。我们将针对每种类型讲解加入群组要进行的操作。 * EMGroupStylePrivateOnlyOwnerInvite: 该类型的群组只允许群主(Owner)添加人进群,其他人无法主动加入。 * EMGroupStylePrivateMemberCanInvite: (推荐使用)该类型的群组允许所有群成员添加人进群,其他人无法主动加入。 * EMGroupStylePublicJoinNeedApproval: (推荐使用)该类型的群组只允许群主(Owner)添加人进群;其他人想进入群组的话,需要先发送申请,群主同意申请之后才能进群;其他人无法主动加入。 * EMGroupStylePublicOpenJoin: (不推荐使用)该类型的群组允许任何人主动加入群组。 === 添加人进群 === 被添加的人会收到回调: /*! * SDK自动同意了用户A的加B入群邀请后,用户B接收到该回调,需要设置EMGroupOptions的isAutoAcceptGroupInvitation为YES * * @param aGroup 群组实例 * @param aInviter 邀请者 * @param aMessage 邀请消息 */ - (void)didJoinGroup:(EMGroup *)aGroup inviter:(NSString *)aInviter message:(NSString *)aMessage; 加人接口如下: /*! * 邀请用户加入群组 * * @param aUsers 被邀请的用户名列表 * @param aGroupId 群组ID * @param aMessage 欢迎信息 * @param aCompletionBlock 完成的回调 */ - (void)addMembers:(NSArray *)aUsers toGroup:(NSString *)aGroupId message:(NSString *)aMessage completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager addMembers:@[@"user1"] toGroup:@"groupId" message:@"邀请您加入群组" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"邀请加群成功 --- %@", aGroup); } else { NSLog(@"邀请加群失败的原因 --- %@", aError.errorDescription); } }]; === 发送进群申请 === /*! * 申请加入一个需批准的公开群组,群类型应该是EMGroupStylePublicJoinNeedApproval * * @param aGroupId 公开群组的ID * @param aMessage 请求加入的信息 * @param aCompletionBlock 完成的回调 */ - (void)requestToJoinPublicGroup:(NSString *)aGroupId message:(NSString *)aMessage completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager requestToJoinPublicGroup:@"groupId" message:@"申请加入群组" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"申请加公开群成功 --- %@", aGroup); } else { NSLog(@"申请加公开群失败的原因 --- %@", aError.errorDescription); } }]; === 处理进群申请 === 只有 Owner 有权限处理进群申请。 1. 收到进群申请。 /*! * 群组的群主收到用户的入群申请,群的类型是EMGroupStylePublicJoinNeedApproval * * @param aGroup 群组实例 * @param aApplicant 申请者 * @param aReason 申请者的附属信息 */ - (void)joinGroupRequestDidReceive:(EMGroup *)aGroup user:(NSString *)aUsername reason:(NSString *)aReason; 2. 同意进群申请。 /*! * 批准入群申请, 需要Owner权限 * * @param aGroupId 所申请的群组ID * @param aUsername 申请人 * @param aCompletionBlock 完成的回调 */ - (void)approveJoinGroupRequest:(NSString *)aGroupId sender:(NSString *)aUsername completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; //调用: [[EMClient sharedClient].groupManager approveJoinGroupRequest:@"groupId" sender:@"userId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"批准入群申请成功 --- %@", aGroup); } else { NSLog(@"批准入群申请失败的原因 --- %@", aError.errorDescription); } }]; 3. 拒绝加群申请。 /*! * 拒绝入群申请, 需要Owner权限 * * @param aGroupId 被拒绝的群组ID * @param aUsername 申请人 * @param aReason 拒绝理由 * @param aCompletionBlock 完成的回调 */ - (void)declineJoinGroupRequest:(NSString *)aGroupId sender:(NSString *)aUsername reason:(NSString *)aReason completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager declineJoinGroupRequest:@"groupId" sender:@"userId" reason:@"拒绝的原因" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"拒绝入群申请成功 --- %@", aGroup); } else { NSLog(@"拒绝入群申请失败的原因 --- %@", aError.errorDescription); } }]; === 加入 EMGroupStylePublicOpenJoin 类型的群组 === /*! * 加入一个公开群组,群类型应该是EMGroupStylePublicOpenJoin * * @param aGroupId 公开群组的ID * @param aCompletionBlock 完成的回调 */ - (void)joinPublicGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager joinPublicGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"加入公开群成功 --- %@", aGroup); } else { NSLog(@"加入公开群失败的原因 --- %@", aError.errorDescription); } }]; ==== 退出群组 ==== 群主(Owner)不支持退群操作,只能解散群。 退出群组分为主动退群和被动退群。被动退群即为被 Owner 踢出群组。 === 主动退群 === /*! * 退出群组,owner不能退出群,只能销毁群 * * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)leaveGroup:(NSString *)aGroupId completion:(void (^)(EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager leaveGroup:@"groupId" completion:^(EMError *aError) { if (!aError) { NSLog(@"退出群组成功"); } else { NSLog(@"退出群组失败的原因 --- %@", aError.errorDescription); } }]; === 被动退群 === 会通过以下回调通知被踢者。 /*! * 离开群组回调 * * @param aGroup 群组实例 * @param aReason 离开原因 */ - (void)didLeaveGroup:(EMGroup *)aGroup reason:(EMGroupLeaveReason)aReason; ==== 解散群组 ==== 解散群组需要 Owner 权限。 /*! * 解散群组, 需要owner权限 * * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)destroyGroup:(NSString *)aGroupId finishCompletion:(void (^)(EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager destroyGroup:@"groupId" finishCompletion:^(EMError *aError) { if (!aError) { NSLog(@"解散群组成功"); } else { NSLog(@"解散群组失败的原因 --- %@", aError.errorDescription); } }]; ==== 修改群主题(名称) ==== 只有 Owner 有权限修改。 /*! * \~chinese * 更改群组主题, 需要owner权限 * * @param aSubject 新主题 * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 * * * \~english * Change the group subject, owner‘s authority is required * * @param aSubject New group‘s subject * @param aGroupId Group id * @param aCompletionBlock The callback block of completion * */ - (void)updateGroupSubject:(NSString *)aSubject forGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager updateGroupSubject:@"更改群组主题" forGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"更改群组主题成功 --- %@", aGroup.subject); } else { NSLog(@"更改群组主题失败的原因 --- %@", aError.errorDescription); } }]; ==== 修改群描述 ==== ** 不推荐使用 **,只有 Owner 有权限操作。 /*! * 更改群组说明信息, 需要owner权限 * * @param aDescription 说明信息 * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)updateDescription:(NSString *)aDescription forGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager updateDescription:@"更改群组说明信息" forGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"群组说明信息更改成功 --- %@", aGroup.description); } else { NSLog(@"群组说明信息更改失败的原因 --- %@", aError.errorDescription); } }]; ==== 获取群组成员列表 ==== 按照群成员进群时间先后排序,后进群排在前面。 /*! * 获取群组成员列表 * * @param aGroupId 群组ID * @param aCursor 游标 * @param aPageSize 获取多少条 * @param aCompletionBlock 完成的回调 */ - (void)getGroupMemberListFromServerWithId:(NSString *)aGroupId cursor:(NSString *)aCursor pageSize:(NSInteger)aPageSize completion:(void (^)(EMCursorResult *aResult, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager getGroupMemberListFromServerWithId:@"groupId" cursor:@"cursor" pageSize:10 completion:^(EMCursorResult *aResult, EMError *aError) { if (!aError) { // aResult.list: 返回的成员列表,内部的值是成员的环信id。 // aResult.cursor: 返回的cursor,如果要取下一页的列表,需要将这个cursor当参数传入到获取群组成员列表中。 NSLog(@"获取群组成员列表成功 --- %@", aResult); } else { NSLog(@"获取群组成员列表失败的原因 --- %@", aError.errorDescription); } }]; ==== 获取群组群主及群组管理员 ==== 建议先获取到群组详情,然后从返回的aGroup对象中获取群主以及管理员。 // 获取群组详情的方法 [[EMClient sharedClient].groupManager getGroupSpecificationFromServerWithId:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { // 获取群主 NSString *owner = aGroup.owner; // 获取群管理 NSArray *adminList = aGroup.adminList; } else { NSLog(@"获取失败的原因 --- %@", aError.errorDescription); } }]; ==== 获取群组黑名单列表 ==== 需要owner或admin权限 /*! * 获取群组黑名单列表, 需要owner/admin权限 * * @param aGroupId 群组ID * @param aPageNum 获取第几页 * @param aPageSize 获取多少条 * @param aCompletionBlock 完成的回调 */ - (void)getGroupBlacklistFromServerWithId:(NSString *)aGroupId pageNumber:(NSInteger)aPageNum pageSize:(NSInteger)aPageSize completion:(void (^)(NSArray *aList, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager getGroupBlacklistFromServerWithId:@"groupId" pageNumber:1 pageSize:50 completion:^(NSArray *aList, EMError *aError) { if (!aError) { NSLog(@"获取群组黑名单列表成功 --- %@", aList); } else { NSLog(@"获取群组黑名单列表失败的原因 --- %@", aError.errorDescription); } }]; ==== 白名单管理 ==== 可以将用户添加到白名单中,用户白名单在管理员开启了全员禁言时生效,可以运行白名单用户发出消息。 另外可以将用户移出白名单,检查自己是否在白名单中以及获取白名单列表。 /*! * \~chinese * 添加白名单,需要Owner / Admin权限 * * @param aMembers 被添加的列表 * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)addWhiteListMembers:(NSArray *)aMembers fromGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; /*! * \~chinese * 移除白名单,需要Owner / Admin权限 * * @param aMembers 被移除的列表 * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)removeWhiteListMembers:(NSArray *)aMembers fromGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; /*! * \~chinese * 查看自己是否在群组白名单中 * * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)isMemberInWhiteListFromServerWithGroupId:(NSString *)aGroupId completion:(void (^)(BOOL inWhiteList, EMError *aError))aCompletionBlock; /*! * \~chinese * 获取群组白名单列表 * * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)getGroupWhiteListFromServerWithId:(NSString *)aGroupId completion:(void (^)(NSArray *aList, EMError *aError))aCompletionBlock; ==== 开启和关闭全员禁言 ==== owner和管理员可以开启和关闭全员禁言。 /*! * \~chinese * 设置全员禁言,需要Owner / Admin权限 * * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)muteAllMembersFromGroup:(NSString *)aGroupId completion:(void(^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; /*! * \~chinese * 解除全员禁言,需要Owner / Admin权限 * * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)unmuteAllMembersFromGroup:(NSString *)aGroupId completion:(void(^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; ==== 获取被禁言列表 ==== 需要owner或admin权限 /*! * 获取群组被禁言列表 * * @param aGroupId 群组ID * @param aPageNum 获取第几页 * @param aPageSize 获取多少条 * @param aCompletionBlock 完成的回调 */ - (void)getGroupMuteListFromServerWithId:(NSString *)aGroupId pageNumber:(NSInteger)aPageNum pageSize:(NSInteger)aPageSize completion:(void (^)(NSArray *aList, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager getGroupMuteListFromServerWithId:@"groupId" pageNumber:1 pageSize:50 completion:^(NSArray *aList, EMError *aError) { if (!aError) { NSLog(@"获取群组被禁言列表成功 --- %@", aList); } else { NSLog(@"获取群组被禁言列表失败的原因 --- %@", aError.errorDescription); } }]; ==== 获取群公告 ==== /*! * 获取群公告 * * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)getGroupAnnouncementWithId:(NSString *)aGroupId completion:(void (^)(NSString *aAnnouncement, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager getGroupAnnouncementWithId:@"groupId" completion:^(NSString *aAnnouncement, EMError *aError) { if(!aError){ NSLog(@"获取群公告成功 --- %@", aAnnouncement); } else { NSLog(@"获取群公告失败的原因 --- %@", aError.errorDescription); } }]; ==== 修改群公告 ==== /*! * 修改群公告,需要Owner / Admin权限 * * @param aGroupId 群ID * @param aAnnouncement 群公告 * @param aCompletionBlock 完成的回调 */ - (void)updateGroupAnnouncementWithId:(NSString *)aGroupId announcement:(NSString *)aAnnouncement completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager updateGroupAnnouncementWithId:@"groupId" announcement:@"announcement" completion:^(EMGroup *aGroup, EMError *aError) { if(!aError){ NSLog(@"修改群公告成功"); } else { NSLog(@"修改群公告失败的原因 --- %@", aError.errorDescription); } }]; 当群主或者管理员修改群公告时,其它群成员会收到群公告更新的回调 /*! * 群公告有更新 * * @param aGroup 群组 * @param aAnnouncement 群公告 */ - (void)groupAnnouncementDidUpdate:(EMGroup *)aGroup announcement:(NSString *)aAnnouncement; ==== 获取群共享文件列表 ==== /*! * 获取群共享文件列表 * * @param aGroupId 群组ID * @param aPageNum 获取第几页 * @param aPageSize 获取多少条 * @param aCompletionBlock 完成的回调 */ - (void)getGroupFileListWithId:(NSString *)aGroupId pageNumber:(NSInteger)aPageNum pageSize:(NSInteger)aPageSize completion:(void (^)(NSArray *aList, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager getGroupFileListWithId:@"groupId" pageNumber:1 pageSize:10 completion:^(NSArray *aList, EMError *aError) { if(!aError){ // aList数组里面是 EMGroupSharedFile 对象 NSLog(@"获取群共享文件列表成功 --- %@", aList); } else { NSLog(@"获取群共享文件列表失败的原因 --- %@", aError.errorDescription); } }]; ==== 上传下载群共享文件 ==== /*! * 上传群共享文件 * * @param aGroupId 群ID * @param aFilePath 文件路径 * @param pError 错误信息 * * @result 群实例 */ - (void)uploadGroupSharedFileWithId:(NSString *)aGroupId filePath:(NSString*)aFilePath progress:(void (^)(int progress))aProgressBlock completion:(void (^)(EMGroupSharedFile *aSharedFile, EMError *aError))aCompletionBlock; /*! * 下载群共享文件 * * @param aGroupId 群ID * @param aFilePath 文件路径 * @param aSharedFileId 共享文件ID * @param aProgressBlock 文件下载进度回调block * @param aCompletionBlock 完成回调block */ - (void)downloadGroupSharedFileWithId:(NSString *)aGroupId filePath:(NSString *)aFilePath sharedFileId:(NSString *)aSharedFileId progress:(void (^)(int progress))aProgressBlock completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager uploadGroupSharedFileWithId:@"groupId" filePath:@"filePath" progress:^(int progress) { NSLog(@"上传文件进度 --- %d", progress); } completion:^(EMGroupSharedFile *aSharedFile, EMError *aError) { if(!aError){ // EMGroupSharedFile中包含文件名称,文件发布者,文件创建时间,文件大小 NSLog(@"上传群共享文件成功"); } else { NSLog(@"上传群共享文件失败的原因 --- %@", aError.errorDescription); } }]; // 调用: [[EMClient sharedClient].groupManager downloadGroupSharedFileWithId:@"groupId" filePath:@"filePath" sharedFileId:@"sharedFileId" progress:^(int progress) { NSLog(@"下载文件进度 --- %d", progress); } completion:^(EMGroup *aGroup, EMError *aError) { if(!aError){ NSLog(@"下载群共享文件成功"); } else { NSLog(@"下载群共享文件失败的原因 --- %@", aError.errorDescription); } }]; 当群中有人上传群共享文件时,其它群成员会受到新有群文件上传的回调 /*! * 有用户上传群共享文件 * * @param aGroup 群组 * @param aSharedFile 共享文件 */ - (void)groupFileListDidUpdate:(EMGroup *)aGroup addedSharedFile:(EMGroupSharedFile *)aSharedFile; ==== 删除群共享文件 ==== /*! * 删除群共享文件 * * @param aGroupId 群ID * @param aSharedFileId 共享文件ID * @param aCompletionBlock 完成的回调 */ - (void)removeGroupSharedFileWithId:(NSString *)aGroupId sharedFileId:(NSString *)aSharedFileId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager removeGroupSharedFileWithId:@"groupId" sharedFileId:@"sharedFileId" completion:^(EMGroup *aGroup, EMError *aError) { if(!aError){ NSLog(@"删除群共享文件成功"); } else { NSLog(@"删除群共享文件失败的原因 --- %@", aError.errorDescription); } }]; 当群中有人删除群共享文件时,其它群成员会受到有人删除群文件的回调 /*! * 有用户删除群共享文件 * * @param aGroup 群组 * @param aFileId 共享文件ID */ - (void)groupFileListDidUpdate:(EMGroup *)aGroup removedSharedFile:(NSString *)aFileId; ==== 修改群扩展 ==== /*! * 修改群扩展信息,需要Owner权限 * * @param aGroupId 群ID * @param aExt 扩展信息 * @param aCompletionBlock 完成的回调 */ - (void)updateGroupExtWithId:(NSString *)aGroupId ext:(NSString *)aExt completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager updateGroupExtWithId:@"groupId" ext:@"ext" completion:^(EMGroup *aGroup, EMError *aError) { if(!aError){ NSLog(@"修改群扩展信息成功"); } else { NSLog(@"修改群扩展信息失败的原因 --- %@", aError.errorDescription); } }]; ===== 群成员管理 ===== ==== 改变群主 ==== 只有 Owner 权限才能调用该接口。 //**Api:**// /*! * 改变群主,需要Owner权限 * * 同步方法,会阻塞当前线程 * * @param aGroupId 群ID * @param aNewOwner 新群主 * @param pError 错误信息 * * @result 返回群组实例 */ - (EMGroup *)updateGroupOwner:(NSString *)aGroupId newOwner:(NSString *)aNewOwner error:(EMError **)pError; /*! * 改变群主,需要Owner权限 * * @param aGroupId 群ID * @param aNewOwner 新群主 * @param aCompletionBlock 完成的回调 */ - (void)updateGroupOwner:(NSString *)aGroupId newOwner:(NSString *)aNewOwner completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; //**Delegate:**// /*! * 群组创建者有更新 * * @param aGroup 群组 * @param aNewOwner 新群主 * @param aOldOwner 旧群主 */ - (void)groupOwnerDidUpdate:(EMGroup *)aGroup newOwner:(NSString *)aNewOwner oldOwner:(NSString *)aOldOwner; // 调用: [[EMClient sharedClient].groupManager updateGroupOwner:@"groupId" newOwner:@"newOwner" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"群组创建者更新成功"); } else { NSLog(@"群组创建者更新失败的原因 --- %@", aError.errorDescription); } }]; ==== 添加群组管理员 ==== 只有 Owner 权限才能调用。 //**Api:**// /*! * 添加群组管理员,需要Owner权限 * * 同步方法,会阻塞当前线程 * * @param aAdmin 要添加的群组管理员 * @param aGroupId 群ID * @param pError 错误信息 * * @result 返回群组实例 */ - (EMGroup *)addAdmin:(NSString *)aAdmin toGroup:(NSString *)aGroupId error:(EMError **)pError; /*! * 添加群组管理员,需要Owner权限 * * @param aAdmin 要添加的群组管理员 * @param aGroupId 群ID * @param aCompletionBlock 完成的回调 */ - (void)addAdmin:(NSString *)aAdmin toGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用示例: [[EMClient sharedClient].groupManager addAdmin:@"adminName" toGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"添加群组管理员成功"); } else { NSLog(@"添加群组管理员失败的原因 --- %@", aError.errorDescription); } }]; //**Delegate:**// /*! * 有成员被加入管理员列表 * * @param aGroup 群组 * @param aAdmin 加入管理员列表的成员 */ - (void)groupAdminListDidUpdate:(EMGroup *)aGroup addedAdmin:(NSString *)aAdmin; ==== 移除群组管理员 ==== 只有 Owner 权限才能调用。 //**Api:**// /*! * 移除群组管理员,需要Owner权限 * * @param aAdmin 要添加的群组管理员 * @param aGroupId 群ID * @param aCompletionBlock 完成的回调 */ - (void)removeAdmin:(NSString *)aAdmin fromGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager removeAdmin:@"adminName" fromGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"移除群组管理员成功"); } else { NSLog(@"移除群组管理员失败的原因 --- %@", aError.errorDescription); } }]; //**Delegate:**// /*! * 有成员被移出禁言列表 * * @param aGroup 群组 * @param aMutedMembers 移出禁言列表的成员 */ - (void)groupMuteListDidUpdate:(EMGroup *)aGroup removedMutedMembers:(NSArray *)aMutedMembers; ==== 移除群组成员 ==== 只有 Owner或者Admin 权限才能调用。 /*! * 将群成员移出群组 * * @param aUsers 要移出群组的用户列表 * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)removeMembers:(NSArray *)aUsers fromGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager removeMembers:@[@"user1"] fromGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"将群成员移出群组成功"); } else { NSLog(@"将群成员移出群组失败的原因 --- %@", aError.errorDescription); } }]; ==== 禁言群成员 ==== 权限高者可禁言权限低者,反之不允许 //**Api:**// /*! * 将一组成员禁言,需要Owner / Admin权限 * * @param aMuteMembers 要禁言的成员列表 * @param aMuteMilliseconds 禁言时长(单位毫秒,如果是“-1”代表永久禁言) * @param aGroupId 群ID * @param aCompletionBlock 完成的回调 */ - (void)muteMembers:(NSArray *)aMuteMembers muteMilliseconds:(NSInteger)aMuteMilliseconds fromGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager muteMembers:@[@"user1"] muteMilliseconds:10000 fromGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"将一组成员禁言成功"); } else { NSLog(@"将一组成员禁言失败的原因 --- %@", aError.errorDescription); } }]; //**Delegate:**// /*! * 有成员被加入禁言列表 * * @param aGroup 群组 * @param aMutedMembers 被禁言的成员 * @param aMuteExpire 禁言失效时间,当前不可用 */ - (void)groupMuteListDidUpdate:(EMGroup *)aGroup addedMutedMembers:(NSArray *)aMutedMembers muteExpire:(NSInteger)aMuteExpire; ==== 解除禁言 ==== 权限高者可禁言权限低者,反之不允许 //**Api:**// /*! * 解除禁言,需要Owner / Admin权限 * * @param aMuteMembers 被解除的列表 * @param aGroupId 群ID * @param aCompletionBlock 完成的回调 */ - (void)unmuteMembers:(NSArray *)aMembers fromGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager unmuteMembers:@[@"user1"] fromGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"解除禁言成功"); } else { NSLog(@"解除禁言失败的原因 --- %@", aError.errorDescription); } }]; //**Delegate:**// /*! * 有成员被移出禁言列表 * * @param aGroup 群组 * @param aMutedMembers 移出禁言列表的成员 */ - (void)groupMuteListDidUpdate:(EMGroup *)aGroup removedMutedMembers:(NSArray *)aMutedMembers; ==== 设置全员禁言 ==== 群主和群组管理员默认不会被禁言 //**Api:**// /*! * \~chinese * 设置全员禁言,需要Owner / Admin权限 * * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 * * \~english * mute all members, need Owner / Admin permissions * * @param aGroupId Group id * @param aCompletionBlock The callback block of completion * */ - (void)muteAllMembersFromGroup:(NSString *)aGroupId completion:(void(^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager muteAllMembersFromGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"全员禁言成功"); } else { NSLog(@"全员禁言失败的原因 --- %@", aError.errorDescription); } }]; //**Delegate:**// /*! * \~chinese * 群组全部禁言状态变化 * * @param aGroup 群组 * @param aMuted 是否被全部禁言 * * \~english * Group members are all muted * * @param aGroup Group * @param aMuted All member muted */ - (void)groupAllMemberMuteChanged:(EMGroup *)aGroup isAllMemberMuted:(BOOL)aMuted; ==== 解除全员禁言 ==== //**Api:**// /*! * \~chinese * 解除全员禁言,需要Owner / Admin权限 * * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 * * \~english * unmute all members, need Owner / Admin permissions * * @param aGroupId Group id * @param aCompletionBlock The callback block of completion * */ - (void)unmuteAllMembersFromGroup:(NSString *)aGroupId completion:(void(^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager unmuteAllMembersFromGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"解除全员禁言成功") } else { NSLog(@"解除全员禁言失败的原因 --- %@", aError.errorDescription); } }]; //**Delegate:**// /*! * \~chinese * 群组全部禁言状态变化 * * @param aGroup 群组 * @param aMuted 是否被全部禁言 * * \~english * Group members are all muted * * @param aGroup Group * @param aMuted All member muted */ - (void)groupAllMemberMuteChanged:(EMGroup *)aGroup isAllMemberMuted:(BOOL)aMuted; ==== 加入群黑名单 ==== 只有 Owner 权限才能调用该接口,并且只有 Owner 权限的才能查看群黑名单。 可以将群成员和非群成员的人加入群黑名单。 /*! * 加人到群组黑名单, 需要owner权限 * * @param aMembers 要加入黑名单的用户 * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)blockMembers:(NSArray *)aMembers fromGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager blockMembers:@[@"users1"] fromGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"加人到群组黑名单成功"); } else { NSLog(@"加人到群组黑名单失败的原因 --- %@", aError.errorDescription); } }]; ==== 移出群黑名单 ==== 只有 Owner 权限才能调用该接口,并且只有 Owner 权限的才能查看群黑名单。 从群黑名单移除出去,该用户已经不在群组里了,需要重新加入群组。 /*! * 从群组黑名单中减人, 需要owner权限 * * @param aMembers 要从黑名单中移除的用户名列表 * @param aGroupId 群组ID * @param aCompletionBlock 完成的回调 */ - (void)unblockMembers:(NSArray *)aMembers fromGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager unblockMembers:@[@"users1"] fromGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"从群组黑名单中减人成功"); } else { NSLog(@"从群组黑名单中减人失败的原因 --- %@", aError.errorDescription); } }]; ===== 群消息 ===== ==== 屏蔽/取消屏蔽群组消息 ==== 不允许 Owner 权限的调用。 /*! * 屏蔽群消息,服务器不再发送此群的消息给用户,owner不能屏蔽群消息 * * @param aGroupId 要屏蔽的群ID * @param aCompletionBlock 完成的回调 */ - (void)blockGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager blockGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"屏蔽群消息成功"); } else { NSLog(@"屏蔽群消息失败的原因 --- %@", aError.errorDescription); } }]; /*! * 取消屏蔽群消息 * * @param aGroupId 要取消屏蔽的群ID * @param aCompletionBlock 完成的回调 */ - (void)unblockGroup:(NSString *)aGroupId completion:(void (^)(EMGroup *aGroup, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager unblockGroup:@"groupId" completion:^(EMGroup *aGroup, EMError *aError) { if (!aError) { NSLog(@"取消屏蔽群消息成功"); } else { NSLog(@"取消屏蔽群消息失败的原因 --- %@", aError.errorDescription); } }]; ===== 管理群组的 APNS 离线推送 ===== 见 [[im:ios:apns:offline#设置指定群组是否接收_apns|APNS离线推送-设置指定群组是否接收APNS]]。 ===== 获取与登录者相关的群组 ===== 查看所有当前登录账号所在群组,包括创建的和加入的群组,提供了2种方法。 1.从服务器获取与我相关的群组列表 [[EMClient sharedClient].groupManager getJoinedGroupsFromServerWithPage:1 pageSize:50 completion:^(NSArray *aList, EMError *aError) { if (!aError) { NSLog(@"获取群组列表成功 --- %@", aList); } else { NSLog(@"获取群组列表失败的原因 --- %@", aError.errorDescription); } }]; 2. 取内存中的值 从服务器获与登录者相关的群组列表之后,才能从本地获取到群组列表 // 从内存中获取所有群组,第一次从数据库加载 NSArray *groupList = [[EMClient sharedClient].groupManager getJoinedGroups]; ===== 获取公开群组 ===== 获取指定范围内的公开群。 /*! * 从服务器获取指定范围内的公开群 * * @param aCursor 获取公开群的cursor,首次调用传空 * @param aPageSize 期望返回结果的数量, 如果 < 0 则一次返回所有结果 * @param aCompletionBlock 完成的回调 */ - (void)getPublicGroupsFromServerWithCursor:(NSString *)aCursor pageSize:(NSInteger)aPageSize completion:(void (^)(EMCursorResult *aResult, EMError *aError))aCompletionBlock; // 调用: [[EMClient sharedClient].groupManager getPublicGroupsFromServerWithCursor:nil pageSize:50 completion:^(EMCursorResult *aResult, EMError *aError) { if (!aError) { NSLog(@"获取公开群组成功 --- %@", aResult); } else { NSLog(@"获取公开群组失败的原因 --- %@", aError.errorDescription); } }]; ---- 上一页:[[im:ios:basics:buddy|好友管理]] 下一页:[[im:ios:basics:chatroom|聊天室管理]]