今天的干貨分享是關于“閱讀回執(zhí)”功能蕉堰,這是一個很普遍的功能台谢,但是針對使用融云的 SDK 去實現张遭,還是有些坑在等著我們的莽龟,下面就開始分(bì)享(kēng)嘍~
-
分享之前先做一些準備工作蠕嫁,先找到我們需要調用的接口文檔
-
根據不同的會話類型以及消息的發(fā)送方和接收方,要分別處理
-
單聊
接收方 :在閱讀消息后毯盈,調用 RCIMClient 類的發(fā)送閱讀回執(zhí)接口剃毒,參數如下:
? conversationType 單聊會話類型
? targetId 消息的會話 ID
? time 會話最后一條消息的發(fā)送時間(sentTime)
/*! 發(fā)送某個會話中消息閱讀的回執(zhí) @param conversationType 會話類型 @param targetId 會話 ID @param timestamp 該會話中已閱讀的最后一條消息的發(fā)送時間戳 @param successBlock 發(fā)送成功的回調 @param errorBlock 發(fā)送失敗的回調[nErrorCode: 失敗的錯誤碼] @discussion 此接口只支持單聊, 如果使用 IMLib 可以注冊監(jiān)聽 RCLibDispatchReadReceiptNotification 通知,使用 IMKit 直接設置RCIM.h 中的 enabledReadReceiptConversationTypeList。 @warning 目前僅支持單聊奶镶。 @remarks 高級功能 */ - (void)sendReadReceiptMessage:(RCConversationType)conversationType targetId:(NSString *)targetId time:(long long)timestamp success:(void (^)(void))successBlock error:(void (^)(RCErrorCode nErrorCode))errorBlock;
發(fā)送方:監(jiān)聽下面這個通知迟赃,在接收后修改消息的展示
/*! @const 收到已讀回執(zhí)的 Notification @discussion 收到消息已讀回執(zhí)之后,IMLib 會分發(fā)此通知厂镇。 Notification 的 object 為 nil,userInfo 為 NSDictionary 對象左刽, 其中 key 值分別為 @"cType"捺信、@"tId"、@"messageTime", 對應的 value 為會話類型的 NSNumber 對象 、會話的 targetId 迄靠、已閱讀的最后一條消息的 sendTime秒咨。 如: NSNumber *ctype = [notification.userInfo objectForKey:@"cType"]; NSNumber *time = [notification.userInfo objectForKey:@"messageTime"]; NSString *targetId = [notification.userInfo objectForKey:@"tId"]; NSString *fromUserId = [notification.userInfo objectForKey:@"fId"]; 收到這個消息之后可以更新這個會話中 messageTime 以前的消息 UI 為已讀(底層數據庫消息狀態(tài)已經改為已讀)。 @remarks 事件監(jiān)聽 */ FOUNDATION_EXPORT NSString *const RCLibDispatchReadReceiptNotification;
-
群聊
發(fā)送方:
? 在發(fā)送消息 A 后掌挚,需要針對該消息發(fā)送回執(zhí)請求雨席,message 傳之前發(fā)的消息 A
/*! 請求消息閱讀回執(zhí) @param message 要求閱讀回執(zhí)的消息 @param successBlock 請求成功的回調 @param errorBlock 請求失敗的回調[nErrorCode: 失敗的錯誤碼] @discussion 通過此接口,可以要求閱讀了這條消息的用戶發(fā)送閱讀回執(zhí)吠式。 @remarks 高級功能 */ - (void)sendReadReceiptRequest:(RCMessage *)message success:(void (^)(void))successBlock error:(void (^)(RCErrorCode nErrorCode))errorBlock;
? 設置下面代理函數陡厘,在接收到發(fā)送方發(fā)來的閱讀回執(zhí)響應后,修改消息的展示
/*! IMlib消息接收的監(jiān)聽器 @discussion 設置IMLib的消息接收監(jiān)聽器請參考RCIMClient的setReceiveMessageDelegate:object:方法特占。 @warning 如果您使用IMlib糙置,可以設置并實現此Delegate監(jiān)聽消息接收; 如果您使用IMKit是目,請使用RCIM中的RCIMReceiveMessageDelegate監(jiān)聽消息接收谤饭,而不要使用此監(jiān)聽器,否則會導致IMKit中無法自動更新UI懊纳! */ @protocol RCIMClientReceiveMessageDelegate <NSObject> /*! 消息已讀回執(zhí)響應(收到閱讀回執(zhí)響應揉抵,可以按照 messageUId 更新消息的閱讀數) @param messageUId 請求已讀回執(zhí)的消息ID @param conversationType conversationType @param targetId targetId @param userIdList 已讀userId列表 */ - (void)onMessageReceiptResponse:(RCConversationType)conversationType targetId:(NSString *)targetId messageUId:(NSString *)messageUId readerList:(NSMutableDictionary *)userIdList;
接收方:
? 設置下面代理函數,在接收到消息 A 后嗤疯,還會接收到針對消息 A 的閱讀回執(zhí)請求
/*! IMlib消息接收的監(jiān)聽器 @discussion 設置IMLib的消息接收監(jiān)聽器請參考RCIMClient的setReceiveMessageDelegate:object:方法功舀。 @warning 如果您使用IMlib,可以設置并實現此Delegate監(jiān)聽消息接收身弊; 如果您使用IMKit辟汰,請使用RCIM中的RCIMReceiveMessageDelegate監(jiān)聽消息接收,而不要使用此監(jiān)聽器阱佛,否則會導致IMKit中無法自動更新UI帖汞! */ @protocol RCIMClientReceiveMessageDelegate <NSObject> /*! 請求消息已讀回執(zhí)(收到需要閱讀時發(fā)送回執(zhí)的請求,收到此請求后在會話頁面已經展示該 messageUId 對應的消息或者調用 getHistoryMessages 獲取消息的時候凑术,包含此 messageUId 的消息翩蘸,需要調用 sendMessageReadReceiptResponse 接口發(fā)送消息閱讀回執(zhí)) @param messageUId 請求已讀回執(zhí)的消息ID @param conversationType conversationType @param targetId targetId */ - (void)onMessageReceiptRequest:(RCConversationType)conversationType targetId:(NSString *)targetId messageUId:(NSString *)messageUId;
? 在代理方法中,調用下面接口發(fā)送閱讀回執(zhí)響應給發(fā)送方
/*! 發(fā)送閱讀回執(zhí) @param conversationType 會話類型 @param targetId 會話 ID @param messageList 已經閱讀了的消息列表 @param successBlock 發(fā)送成功的回調 @param errorBlock 發(fā)送失敗的回調[nErrorCode: 失敗的錯誤碼] @discussion 當用戶閱讀了需要閱讀回執(zhí)的消息淮逊,可以通過此接口發(fā)送閱讀回執(zhí)催首,消息的發(fā)送方即可直接知道那些人已經閱讀。 @remarks 高級功能 */ - (void)sendReadReceiptResponse:(RCConversationType)conversationType targetId:(NSString *)targetId messageList:(NSArray<RCMessage *> *)messageList success:(void (^)(void))successBlock error:(void (^)(RCErrorCode nErrorCode))errorBlock;
-
總結
閱讀回執(zhí)需要區(qū)分會話類型處理泄鹏,且單聊的閱讀回執(zhí)是針對會話的郎任,群聊的閱讀回執(zhí)是針對某一條消息的:
? 單聊:接收方閱讀某個會話的消息后,發(fā)送閱讀回執(zhí) ——發(fā)送方接到閱讀回執(zhí)备籽,更新 UI
? 群聊:發(fā)送方發(fā)送消息 A舶治, 針對該消息,發(fā)送閱讀回執(zhí)請求 —— 接收方實現監(jiān)聽代理,接收到消息 A 的閱讀回執(zhí)請求 —— 接收方發(fā)送閱讀回執(zhí)響應 —— 發(fā)送方收到閱讀回執(zhí)響應霉猛,更新 UI