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:是不返回群主信息的。因此尽管每一个群理论上都有对应的群主,如果开发者没有请求过,仍然无法拿到群主信息。开发者可以通过IYWTribeServiceprotocol中的
/**
* 从服务器获取指定群 ID 的群, 返回的群包括如群公告等详细信息
*/
- (void)requestTribeFromServer:(NSString *)tribeId
completion:(void (^)(YWTribe *tribe, NSError *error))completion;
方法来获取群主,一旦请求过之后,就可以在YWTribe中的tribeMaster属性拿到群主信息。