1、前期準(zhǔn)備:需要在融云注冊app,獲取appkey在AppDelegate中進(jìn)行注冊。環(huán)境分為開發(fā)環(huán)境和生產(chǎn)環(huán)境,調(diào)試可以用開發(fā)環(huán)境,app上線需要注冊生產(chǎn)環(huán)境。
2、獲取用戶token(用來用戶身份認(rèn)證的,通過用戶的token,獲取用戶的信息)的過程:

如果沒有服務(wù)器,融云提供了調(diào)試的接口,點(diǎn)擊提交即可獲取token來進(jìn)行測試:

3、獲取到token之后就可以調(diào)用-connectWithToken:success:error:tokenIncorrect:? 方法與融云服務(wù)器建立連接,這個(gè)方法在程序運(yùn)行過程中只需要調(diào)用一次,在網(wǎng)絡(luò)斷開或者前后臺切換的情況下,會自動重連,除非是手動斷開連接,是需要再次調(diào)用該方法進(jìn)行重連。
需要注意兩點(diǎn):
? ? ? 一、該方法有一個(gè)成功的回調(diào)和一個(gè)錯(cuò)誤的回調(diào),在錯(cuò)誤回調(diào)中,有一種錯(cuò)誤狀態(tài)是本來已經(jīng)連接成功的,需要進(jìn)行判斷:

? ? 二、登陸成功之后,可以將token存到沙盒偏好設(shè)置中進(jìn)行存儲。需要注意,該方法的回調(diào)是在子線程中進(jìn)行的,如果需要進(jìn)行ui操作,需要切換到主線程。
4、登陸成功,跳轉(zhuǎn)到會話列表控制器,融云已經(jīng)提供了一個(gè)會話列表控制器 (RCConversationListViewController),我們可以創(chuàng)建一個(gè)控制器繼承自RCConversationListViewController。屬性displayConversationTypeArray可以設(shè)置顯示的聊天類型(單聊、討論組、群聊、聊天室、客服等)。
會發(fā)現(xiàn)會話列表中的用戶頭像和用戶名字不顯示,為了解決這個(gè)問題,需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的類,遵守協(xié)議RCIMUserInfoDateSource,這個(gè)類用來管理用戶信息的,用戶信息可以從服務(wù)器或者緩存中讀取,可以獲取用戶信息、緩存用戶信息、刪除用戶信息。然后將這個(gè)類初始化,傳給[RCIM sharedRCIM],RCIM就可以從該類中讀取用戶信息。
5、會話界面,融云也提供了一個(gè)控制器類(RCConversationViewController),同樣創(chuàng)建一個(gè)控制器繼承自它,初始化方法中需要傳遞displayConversationTypeArray和targetId(和誰進(jìn)行會話)。
自定義消息cell(文字、表情、紅包、位置、語音)等:
分兩步:
第一步:自定義消息并注冊消息類型:需要繼承自RCMessageContent類,實(shí)現(xiàn)三個(gè)協(xié)議:

消息發(fā)送的流程:

消息接收流程,下圖主要介紹的是離線接收消息:

第二步:自定義cell并注冊cell(繼承自融云提供的RCMessageBaseCell或RCMessageCell(布局更復(fù)雜))
這兩種cell的區(qū)別:第二種有頭像和名字,第一種沒有。
自定義cell需要有三步,第一步注冊cell(register方法,和collectionView注冊方法相似),第二步返回cell item實(shí)例的方法

這個(gè)方法當(dāng)只有自定義cell的時(shí)候才會調(diào)用,例如文本消息、圖片消息、語音消息不是自定義的就不會走這個(gè)方法。
第三步,實(shí)現(xiàn)返回cell大小的方法。
6、發(fā)送紅包功能
在會話控制器的父類RCConversationViewController中有一個(gè)屬性 RCPluhinBoardView * pluginBoardView,擴(kuò)展功能板view,可以擴(kuò)展發(fā)送地理位置、圖片、紅包等功能。
使用該view下面的方法,可以添加擴(kuò)展項(xiàng)。

實(shí)現(xiàn)該view的代理方法,在代理方法中監(jiān)聽到點(diǎn)擊某個(gè)擴(kuò)展項(xiàng)的回調(diào),可以根據(jù)上面方法中的tag值進(jìn)行相應(yīng)的處理。
發(fā)送消息時(shí)會調(diào)用下面的方法

方法中的參數(shù)說明和注意事項(xiàng)如下:


自定義紅包消息類,繼承自第五條提到的RCMessageContent,紅包需要有兩個(gè)屬性,amount(紅包金額),desc(描述)。然后實(shí)現(xiàn)RCMessageContent中的三個(gè)協(xié)議的方法,第一個(gè)協(xié)議RCMessageCoding,進(jìn)行json之間的編碼和解碼;第二個(gè)協(xié)議RCMessagePersistentCompatible,是否需要存入本地和計(jì)入未讀數(shù),紅包消息是需要進(jìn)行本地存儲和進(jìn)行未讀數(shù)的,只要返回枚舉的第三個(gè)選項(xiàng)即可;第三個(gè)協(xié)議RCMessageContentView,在會話列表中顯示的紅包消息摘要內(nèi)容。
自定義紅包c(diǎn)ell類,繼承自RCMessageCell類,這個(gè)cell類中有一個(gè)messageContentView,是用來放消息內(nèi)容的視圖,這個(gè)視圖有一個(gè)setEventBlock:,cell大小發(fā)生改變的時(shí)候調(diào)用該方法,可以給消息中子視圖重新布局。
7、撤回消息:
撤回消息的實(shí)現(xiàn)流程,長按消息,消息上方出現(xiàn)復(fù)制/刪除/撤回的視圖,點(diǎn)擊撤回,刪除該條消息本地存儲,發(fā)送給融云服務(wù)器,服務(wù)器告訴對方客戶端這是一條撤回消息,進(jìn)行撤回。
當(dāng)點(diǎn)擊消息cell時(shí),會觸發(fā)下面的方法,在UIMenuControlle為消息上方出現(xiàn)的消息處理視圖

在recall: 方法中需要做的處理是發(fā)送一條撤回消息,撤回消息cell和紅包消息cell一樣需要自定義,也需要一個(gè)繼承自RCMessageContent的messageContent類,但是撤回消息需要進(jìn)行本地存儲,但不需要計(jì)入未讀數(shù)。
然后將該撤回消息發(fā)送給對方客戶端,把當(dāng)前的長按消息刪除掉。本地消息刪除掉了,遠(yuǎn)程的怎么刪除:

實(shí)現(xiàn)上面的代碼,在下面的代碼中接收撤回消息

先判斷是否是撤回消息,然后從當(dāng)前消息列表中找是否有該消息,然后進(jìn)行刪除
自定義撤回消息cell,只需要繼承自RCMessageBaseCell,自定義里面的內(nèi)容。