OpenIM提供了群聊的能力,您可以通过以下功能介绍,来管理群聊。
注意:默认群聊的权限控制类似微信的多人聊天,你可以通过API控制任何人加入或者邀请其他人加入群聊。如果你需要使用类似QQ群那样,需要同意才能加入等权限控制的群,请阅读:“权限控制群”。
以Demo为例,SPKitExample
有一个属性
@property (strong, nonatomic, readwrite) YWIMKit *ywIMKit;
在使用到群相关功能的地方,添加如下代码:
- (YWIMCore *)ywIMCore { return [SPKitExample sharedInstance].ywIMKit.IMCore; } - (id<IYWTribeService>)ywTribeService { return [[self ywIMCore] getTribeService]; }
如果您需要展示群聊的列表,您首先通过如下接口,获取本地已保存的群聊列表:
self.aryTribes = [self.ywTribeService fetchAllTribes];
然后,您可以通过以下接口从服务器更新列表:
__weak typeof(self) weakSelf = self; [self.ywTribeService requestAllTribesFromServer:^(NSArray *tribes, NSError *error) { if( error == nil ) { weakSelf.aryTribes = [tribes mutableCopy]; [weakSelf.tableView reloadData]; } else { // 失败 } }];
群聊的详情包括名称、公告等,您可以通过如下接口先获取本地已经保存的群聊详情,用于展示:
- (YWTribe *)tribe { return [self.ywTribeService fetchTribe:_tribeID]; }
然后,您可以通过如下接口从服务器更新群聊详情:
[self.ywTribeService requestTribeFromServer:self.tribe.tribeId completion:^(YWTribe *tribe, NSError *error) { if( error == nil ) { weakSelf.tribe = tribe; [weakSelf refreshShowInfo]; } else { // 失败 } }];
您可以通过以下接口创建群聊:
YWTribeDescriptionParam *param = [[YWTribeDescriptionParam alloc] init]; param.tribeName = self.textFieldName.text; param.tribeNotice = self.textFieldBulletin.text; param.tribeType = YWTribeTypeMultipleChat; __weak typeof(self) weakSelf = self; [self.ywTribeService createTribeWithDescription:param completion:^(YWTribe *tribe, NSError *error) { /// 提示创建结果 }];
注意:请务必设置param.tribeType
,否则默认创建出的群聊类型不确定。
您可以通过以下接口修改群聊详情:
__weak typeof(self) weakSelf = self; [self.ywTribeService modifyName:name notice:bulletin forTribe:self.tribe.tribeId completion:^(NSString *tribeId, NSError *error) { if( error == nil ) { // 成功 } else { // 失败 } }];
您可以通过如下接口主动加入某个群聊:
__weak typeof (self) weakSelf = self; [self.ywTribeService joinTribe:self.tribe.tribeId completion:^(NSString *tribeId, NSError *error) { if( error == nil ) { // 成功 } else { // 失败 } }];
您可以通过如下接口主动退出某个群聊:
__weak typeof(self) weakSelf = self; [self.ywTribeService exitFromTribe:tribe.tribeId completion:^(NSString *tribeId, NSError *error) { if( error == nil ) { [weakSelf.tableView reloadData]; } else { // 失败 } }];
如果您需要展示群成员的列表,您首先通过如下接口,获取本地已保存的群成员列表:
self.aryTribeMembers = [self.ywTribeService fetchTribeMembers:self.tribe.tribeId];
您可以通过如下接口更新群聊的成员列表,并展示:
__weak typeof(self) weakSelf = self; [self.ywTribeService requestTribeMembersFromServer:self.tribe.tribeId completion:^(NSArray *members, NSString *tribeId, NSError *error) { if( error == nil ) { weakSelf.aryMember = [members mutableCopy]; [weakSelf.tableViewMembers reloadData]; } else { // 失败 } }];
您可以通过如下接口,将某个成员加入群聊:
__weak typeof(self) weakSelf = self; YWTribeMember *member = [[YWTribeMember alloc] initWithPersonId:self.textFieldMemberId.text]; [self.ywTribeService inviteMembers:@[member] toTribe:self.tribe.tribeId completion:^(NSArray *members, NSString *tribeId, NSError *error) { if( error == nil ) { [weakSelf.aryMember addObjectsFromArray:members]; [weakSelf.tableViewMembers reloadData]; } else { // 失败 } }];
您可以通过如下接口,将某个成员移出群聊:
__weak typeof(self) weakSelf = self; [self.ywTribeService expelMember:member fromTribe:self.tribe.tribeId completion:^(YWPerson *member, NSString *tribeId, NSError *error) { if( error == nil ) { NSUInteger index= [weakSelf.aryMember indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { if ([obj isKindOfClass:[YWTribeMember class]]) { YWTribeMember *person = (YWTribeMember *)obj; if ([person.personId isEqualToString:member.personId]) { *stop = YES; return YES; } } return NO; }]; if (index != NSNotFound) { [weakSelf.aryMember removeObjectAtIndex:index]; NSIndexPath *indexPathToRemove = [NSIndexPath indexPathForRow:index inSection:0]; [tableView deleteRowsAtIndexPaths:@[indexPathToRemove] withRowAnimation:UITableViewRowAnimationAutomatic]; } } else { // 失败 } }];
您可以通过如下接口监听群聊信息变更的通知:
[self.ywTribeService addTribeInfoDidUpdateBlock:^(NSDictionary *userInfo) { /// do something such as refresh conversation list... } forKey:self.description ofPriority:YWBlockPriorityDeveloper];
您可以通过如下接口监听被移出群聊的通知:
[self.ywTribeService addDidExpelFromTribeBlock:^(NSDictionary *userInfo) { NSString *tribeId = userInfo[YWTribeServiceKeyTribeId]; if ([self.conversation isKindOfClass:[YWTribeConversation class]]) { YWTribeConversation *tribeConversation = (YWTribeConversation *)self.conversation; if ([tribeId isEqualToString:tribeConversation.tribe.tribeId]) { /// 如果是当前打开的会话,那么理解退出该会话 [self.navigationController popViewControllerAnimated:YES]; } } } forKey:self.description ofPriority:YWBlockPriorityDeveloper];
类似的还可以监听成员加入和退出群的通知:
[[self ywTribeService] addMemberDidJoinBlock:^(NSDictionary *userInfo) { NSString *tribeID = userInfo[YWTribeServiceKeyTribeId]; if ([tribeID isEqualToString:weakSelf.tribe.tribeId]) { YWPerson *person = userInfo[YWTribeServiceKeyPerson]; // person 加入了该群 } } forKey:self.description ofPriority:YWBlockPriorityDeveloper]; [[self ywTribeService] addMemberDidExitBlock:^(NSDictionary *userInfo) { NSString *tribeId = userInfo[YWTribeServiceKeyTribeId]; if ([tribeId isEqualToString:weakSelf.tribeId]) { YWPerson *person = userInfo[YWTribeServiceKeyPerson]; // person 退出了该群 } } forKey:self.description ofPriority:YWBlockPriorityDeveloper];
您可以通过如下接口监听群主变更的通知:
[self.ywTribeService addTribeOwnerDidChangeBlock:^(NSDictionary *userInfo) { NSString *tribeName = userInfo[YWTribeServiceKeyTribeName]; YWPerson *person = userInfo[YWTribeServiceKeyPerson]; YWPerson *master = userInfo[YWTribeServiceKeyPerson2]; NSString *message = nil; if (self.tribe.tribeType == YWTribeTypeMultipleChat) { message = [NSString stringWithFormat:@"群:%@ 中群主已由 %@ 变为 %@", tribeName, master.personId, person.personId]; } else { // 新增管理员,详情参考权限控制群中的内容 } /// show message } forKey:self.description ofPriority:YWBlockPriorityDeveloper];
在YWTribe
类中有一个属性可以获取群主
/** * 群主,这里使用本地数据,如果为空需要使用IYWTribeService中的requestTribeFromServer:completion:方法获取 */ @property (readonly, strong, nonatomic) YWPerson *tribeMaster;
需要注意的是,批量获取群信息的接口requestAllTribesFromServer:
是不返回群主信息的。因此尽管每一个群理论上都有对应的群主,如果开发者没有请求过,仍然无法拿到群主信息。开发者可以通过IYWTribeService
protocol中的
/** * 从服务器获取指定群 ID 的群, 返回的群包括如群公告等详细信息 */ - (void)requestTribeFromServer:(NSString *)tribeId completion:(void (^)(YWTribe *tribe, NSError *error))completion;
方法来获取群主,一旦请求过之后,就可以在YWTribe
中的tribeMaster
属性拿到群主信息。