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属性拿到群主信息。

FAQ

关于此文档暂时还没有FAQ
返回
顶部