创建和管理聊天室以及监听器介绍

大约 6 分钟

创建和管理聊天室以及监听器介绍

聊天室是支持多人沟通的即时通讯系统。聊天室中的成员没有固定关系,一旦离线后,不会收到聊天室中的任何消息,(除了聊天室白名单中的成员)超过 2 分钟会自动退出聊天室。聊天室可以应用于直播、消息广播等。若需调整该时间,需联系环信商务经理。

本文介绍如何使用环信即时通讯 IM SDK 在实时互动 app 中创建和管理聊天室,并实现聊天室的相关功能。

消息相关内容见 消息管理

技术原理

环信即时通讯 IM iOS SDK 提供 IEMChatroomManager 类、EMChatroomManagerDelegate 类和 EMChatroom 类用于聊天室管理,支持你通过调用 API 在项目中实现如下功能:

  • 创建聊天室
  • 从服务器获取聊天室列表
  • 加入聊天室
  • 获取聊天室详情
  • 解散聊天室
  • 监听聊天室事件
  • 实时更新聊天室成员人数

前提条件

开始前,请确保满足以下条件:

实现方法

本节介绍如何使用环信即时通讯 IM SDK 提供的 API 实现上述功能。

创建聊天室

超级管理员 可以调用 createChatroomWithSubject 方法创建聊天室,并设置聊天室的名称、描述、最大成员数等信息。成功创建聊天室后,该超级管理员为该聊天室的所有者。

建议直接调用 REST API 从服务端创建聊天室

示例代码如下:

EMError *error;
    EMChatroom *chatroom = [[EMClient sharedClient].roomManager createChatroomWithSubject:@"Subject" description:@"description" invitees:@[@"user1",@"user2"] message:@"message" maxMembersCount:100 error:&error];

加入聊天室

用户申请加入聊天室的步骤如下:

  1. 调用 getChatroomsFromServerWithPage 方法从服务器获取聊天室列表,查询到想要加入的聊天室 ID。
  2. 调用 joinChatroom 方法传入聊天室 ID,申请加入对应聊天室。新成员加入聊天室时,其他成员收到 userDidJoinChatroom 回调。

示例代码如下:

// 获取公开聊天室列表,每次最多可获取 1,000 个。
// 异步方法
[[EMClient sharedClient].roomManager getChatroomsFromServerWithPage:1 pageSize:50 completion:nil];

// 加入聊天室
// 异步方法
[[EMClient sharedClient].roomManager joinChatroom:@"aChatroomId" completion:nil];

同时,你可以调用 EMChatroomManager#joinChatroom:ext:leaveOtherRooms:completion: 方法,设置加入聊天室时携带的扩展信息,并指定是否退出所有其他聊天室。调用该方法后,聊天室内其他成员会收到 EMChatroomManagerDelegate#userDidJoinChatroom:user:ext: 回调,当用户加入聊天室携带了扩展信息时,聊天室内其他人可以在用户加入聊天室的回调中,获取到扩展信息。

// 加入聊天室时,传入 ext (以昵称为例),同时退出其他聊天室
EMClient.shared().roomManager?.joinChatroom("roomId", ext: "nickname=myNickname", leaveOtherRooms: true, completion: { room, err in
    
})


// 收到其他人加入聊天室的回调
extension ViewController: EMChatroomManagerDelegate {
    func userDidJoin(_ aChatroom: EMChatroom, user aUsername: String, ext: String?) {
        
}

获取聊天室详情

聊天室所有成员均可调用 getChatroomSpecificationFromServerWithId 获取聊天室的详情,包括聊天室 ID、聊天室名称,聊天室描述、最大成员数、聊天室所有者、是否全员禁言以及聊天室角色类型。聊天室公告、成员列表、管理员列表、黑名单列表、禁言列表需单独调用接口获取。

示例代码如下:

// 异步方法
EMChatroom *chatroom = [[EMClient sharedClient].roomManager getChatroomSpecificationFromServerWithId:@“chatroomId” completion:nil];

解散聊天室

仅聊天室所有者可以调用 destroyChatroom 方法解散聊天室。聊天室解散时,其他成员收到 didDismissFromChatroom 回调并被踢出聊天室。

示例代码如下:

// 异步方法
[[EMClient sharedClient].roomManager destroyChatroom:self.chatroom.chatroomId completion:nil];

监听聊天室事件

SDK 中提供了聊天室事件的监听接口。你可以通过注册聊天室监听器,获取聊天室事件,并作出相应处理。如不再使用该监听器,需要移除,防止出现内存泄露。

示例代码如下:

// 注册聊天室回调。
[[EMClient sharedClient].roomManager addDelegate:self delegateQueue:nil];
// 移除聊天室回调。
[[EMClient sharedClient].roomManager removeDelegate:self];

具体事件如下:

// 有用户加入聊天室。聊天室的所有成员(除新成员外)会收到该事件。
- (void)userDidJoinChatroom:(EMChatroom *)aChatroom
      user:(NSString *)aUsername {
}

// 有成员主动退出聊天室。聊天室的所有成员(除退出成员外)会收到该事件。
- (void)userDidLeaveChatroom:(EMChatroom *)aChatroom
         user:(NSString *)aUsername {
}

// 有成员被踢出聊天室。被踢出聊天室的成员会收到该事件。
- (void)didDismissFromChatroom:(EMChatroom *)aChatroom
      reason:(EMChatroomBeKickedReason)aReason {
  }

// 聊天室详情有变更。聊天室的所有成员会收到该事件。
- (void)chatroomSpecificationDidUpdate:(EMChatroom *)aChatroom {
  
  }

// 有成员被添加至聊天室白名单。被添加的成员收到该事件。
- (void)chatroomWhiteListDidUpdate:(EMChatroom *)aChatroom
              addedWhiteListMembers:(NSArray<NSString *> *)aMembers {
  
  }

// 有成员被移出白名单。被移出的成员收到该事件。
- (void)chatroomWhiteListDidUpdate:(EMChatroom *)aChatroom
            removedWhiteListMembers:(NSArray<NSString *> *)aMembers {
  
  }

// 聊天室一键禁言状态变化。聊天室所有成员(除操作者外)会收到该事件。
- (void)chatroomAllMemberMuteChanged:(EMChatroom *)aChatroom
                     isAllMemberMuted:(BOOL)aMuted {
  
  }

// 更新聊天室公告。聊天室的所有成员会收到该事件。
- (void)chatroomAnnouncementDidUpdate:(EMChatroom *)aChatroom
                          announcement:(NSString *_Nullable)aAnnouncement {
  
  }

// 有成员被加入禁言列表。被禁言的成员会收到该事件。

- (void)chatroomMuteListDidUpdate:(EMChatroom *)aChatroom
                addedMutedMembers:(NSDictionary<NSString *,NSNumber*> *)aMutes {
}

// 有成员被移除禁言列表。被解除禁言的成员会收到该事件。
- (void)chatroomMuteListDidUpdate:(EMChatroom *)aChatroom
      removedMutedMembers:(NSArray *)aMutes {
  }

// 有成员被设为管理员。被添加的管理员会收到该事件。
- (void)chatroomAdminListDidUpdate:(EMChatroom *)aChatroom
      addedAdmin:(NSString *)aAdmin {
  }

// 有成员被移除管理员权限。被移除权限的管理员会收到该事件。
- (void)chatroomAdminListDidUpdate:(EMChatroom *)aChatroom
      removedAdmin:(NSString *)aAdmin {
  }

// 聊天室所有者变更。聊天室全体成员会收到该事件。
- (void)chatroomOwnerDidUpdate:(EMChatroom *)aChatroom
                      newOwner:(NSString *)aNewOwner
                      oldOwner:(NSString *)aOldOwner {

   }
// 有成员修改/设置聊天室自定义属性,聊天室的所有成员会收到该事件。
- (void)chatroomAttributesDidUpdated:(NSString *_Nonnull)roomId attributeMap:(NSDictionary<NSString *, NSString *> *_Nullable)attributeMap from:(NSString *_Nonnull)fromId {
  
  }

// 有成员删除聊天室自定义属性。聊天室所有成员会收到该事件。
- (void)chatroomAttributesDidRemoved:(NSString *_Nonnull)roomId attributes:(NSArray<__kindof NSString *> *_Nullable)attributes from:(NSString *_Nonnull)fromId {
  
  }

实时更新聊天室成员人数

如果聊天室短时间内有成员频繁加入或退出时,实时更新聊天室成员人数的逻辑如下:

  1. 聊天室内有成员加入时,其他成员会收到 userDidJoinChatroom:user: 事件。有成员主动或被动退出时,其他成员会收到 userDidLeaveChatroom:user: 事件。

  2. 收到通知事件后,通过 EMChatroom#occupantsCount 获取聊天室当前人数。

extension ViewController: EMChatroomManagerDelegate {
    func userDidJoin(_ aChatroom: EMChatroom, user aUsername: String) {
        let memberCount = aChatroom.occupantsCount
    }
    func userDidLeave(_ aChatroom: EMChatroom, user aUsername: String) {
        let memberCount = aChatroom.occupantsCount
    }
}

EMClient.shared().roomManager?.add(self, delegateQueue: nil)