7_4-核心common-聊天室
1 功能概述
該模組位於資料夾 PolyvLiveCommonModule/Modules/Chatroom 下,採用 MVP 模式設計,將 View 層對 SDK 層的聊天室 chatroomManager 的直接呼叫隔離開,並將多個場景中對 chatroomManager 的共用程式碼抽離封裝起來,使 View 層的邏輯更簡潔。
2 核心類別介紹
2.1 PLVChatroomPresenter
PLVChatroomPresenter 類別主要負責 socket 的登入、socket 訊息的接收與發送,同時還提供以下功能:
對直播間資料的線上人數、觀看熱度、點讚數進行即時更新;
提供發送各類訊息的 API,並把訊息封裝成資料模型回傳;
載入歷史聊天記錄,並把載入結果與資料封裝成資料模型透過回呼通知 Scene 層;
監聽 socket 關於聊天訊息的接收與刪除,並把新訊息封裝成資料模型,然後透過回呼通知 Scene 層。
2.1.1 初始化
在 Scene 層對 PLVChatroomPresenter 進行初始化,初始化方法定義如下:
/// 初始化方法
/// @param count 每次调用接口获取的聊天消息条数,不得小于1
/// @param allow 是否允许使用分房间功能
- (instancetype)initWithLoadingHistoryCount:(NSUInteger)count childRoomAllow:(BOOL)allow;
也可使用 -init 方法初始化,此時每次呼叫介面取得的聊天訊息筆數為預設值 20,預設不允許使用分房間功能。
2.1.2 設定監聽器
PLVChatroomPresenter 提供了屬性 delegate 用於設定回呼監聽,初始化 presenter 並設定監聽的範例程式碼如下(更多細節參考 Demo 的 PLVLCChatroomViewModel 類別):
// 初始化聊天室Presenter并设置delegate
self.presenter = [[PLVChatroomPresenter alloc] initWithLoadingHistoryCount:10 childRoomAllow:YES];
self.presenter.delegate = self;
屬性 delegate 遵循協定 PLVChatroomPresenterProtocol,用於通知 Scene 層聊天室模組的相關 socket 訊息和 Http 介面回傳的聊天室相關資料(詳見 2.1.3)。協定 PLVChatroomPresenterProtocol 的介面定義如下:
/* PLVChatroomPresenter的协议 */
@protocol PLVChatroomPresenterProtocol <NSObject>
@optional
/// 获取历史聊天消息成功时触发
/// @param modelArray 聊天消息队列
/// @param noMore 是否还有更多历史消息,YES表示已加载完
- (void)chatroomPresenter_loadHistorySuccess:(NSArray <PLVChatModel *> *)modelArray noMore:(BOOL)noMore;
/// 获取历史聊天消息失败时触发
- (void)chatroomPresenter_loadHistoryFailure;
/// 返回socket接收到的消息
/// @param modelArray 消息队列,不为空
- (void)chatroomPresenter_didReceiveChatModels:(NSArray <PLVChatModel *> *)modelArray;
/// 返回socket接收到的教师回答消息
/// @param model 教师回答消息
- (void)chatroomPresenter_didReceiveAnswerChatModel:(PLVChatModel *)model;
/// socket通知已删除某条消息
/// @param msgId 被删除消息ID
- (void)chatroomPresenter_didMessageDeleted:(NSString *)msgId;
/// socket通知所有聊天消息被清空
- (void)chatroomPresenter_didAllMessageDeleted;
@end
2.1.3 取得聊天記錄
PLVChatroomPresenter 提供了載入歷史聊天記錄,載入歷史聊天記錄方法定義如下:
/// 加载历史聊天记录
- (void)loadHistory;
每次載入的聊天訊息筆數為初始化時傳入的參數 count 的值,或者預設值 20(使用 -init 方法初始化時)。每次呼叫 Http 介面成功之後,會記錄當前成功載入的頁數,下次呼叫方法 -loadHistory 會自動載入下一頁資料。
載入聊天記錄成功或失敗都會透過 2.1.2 所提到的 delegate 方法通知 Scene 層。
注意,初始化 PLVChatroomPresenter 實例物件時,即自動取得了第一頁的聊天記錄,並觸發取得歷史聊天記錄相關回呼。
2.1.4 發送訊息
PLVChatroomPresenter 類別提供發送各類訊息的 API,並把訊息封裝成資料模型回傳,具體介面定義如下:
/// 发送私聊提问消息
/// @param content 消息文本
/// @return 消息数据模型
- (PLVChatModel * _Nullable)sendQuesstionMessage:(NSString *)content;
/// 发送文本消息
/// @param content 消息文本
/// @return 消息数据模型
- (PLVChatModel * _Nullable)sendSpeakMessage:(NSString *)content;
/// 发送图片消息
/// @param image 图片
/// @return 消息数据模型
- (PLVChatModel * _Nullable)sendImageMessage:(UIImage *)image;
/// 发送自定义消息
/// @param event 自定义消息event字段
/// @param data 自定义消息data字段
/// @param tip 自定义消息tip字段
/// @param emitMode 自定义消息emitMode字段
/// @return 是否成功发送的布尔值
- (BOOL)sendCustomMessageWithEvent:(NSString *)event
data:(NSDictionary *)data
tip:(NSString * _Nullable)tip
emitMode:(int)emitMode;
/// 发送点赞消息
- (void)sendLike;
發送訊息成功時介面回傳訊息資料模型,失敗時回傳 nil。
2.1.5 禁言和踢人
在講師端,還支援踢人與禁言的操作,在初始化 PLVChatroomPresenter 的實例物件時,可設定屬性 specialRole 為 YES,表示當前登入使用者是特殊身份(講師),此時登入使用者將不受聊天室是否關閉、禁言的影響,且可以發送對其他線上成員進行禁言、踢人操作。
self.presenter.specialRole = YES;
Scene 層可直接呼叫 SDK 的 PLVChatroomManager 的以下方法發送禁言/取消禁言、踢人訊息:
/// 发送禁言消息,讲师端专用接口
/// @param banned YES-禁言 NO-取消禁言
/// @param userId 被禁言/取消禁言的用户ID
- (BOOL)sendBandMessage:(BOOL)banned bannedUserId:(NSString *)userId;
/// 发送踢人消息,讲师端专用接口
/// @param userId 被踢出的用户ID
- (BOOL)sendKickMessageWithUserId:(NSString *)userId;
2.1.5 銷毀
Scene 層在退出當前場景時,對 presenter 實例進行銷毀操作。銷毀方法定義如下:
/// 销毁方法
/// 退出前调用,用于资源释放、状态位清零
- (void)destroy;
