iOS SDK 體系架構
本文檔將詳細介紹融雲的 SDK 產品架構和消息體系,以便於您更深入的了解融雲並更快速的開發自己的產品。

IMKit
IMKit 的功能主要是封裝各種界面對象,服務於開發者快速實現自己的產品,主要特點是是支持快速集成,支持豐富的界面定制功能。
IMLib
IMLib 的功能是提供基本通信能力庫,封裝了通信能力和 Conversation,Message 等各種對象,服務於需要根據自己的產品去自己實現界面的開發者。主要特點是封裝清晰,輕量,便於使用。
Protocol
Protocol 是融雲的核心協議棧,使用融雲自定義的私有二進制協議。主要特點是是輕量化,有序可靠,不丟消息。Protocol 部分使用 Native 語言開發,在 Android 和 iOS 平台上保證業務一致性,便於開發者商用化自己的產品。
IMLib 體系架構
首先介紹 IMLib 的體系,對於真正使用融雲 SDK 的用戶,不管您選擇 IMLib 還是 IMKit,您都需要了解一下體系概念。

核心類
RCIMClinet 是 IMLib 的核心類,您可以直接使用它的方法,如 init,connect,setdevicetoken,sendMessage, sendImageMessage 等。您需要詳細的了解所有接口的用法,請參考 API 文檔。
會話實體類
RCConversation 是會話實體類,首先您需要充分的了解 Conversation(會話) 和 Message(消息) 兩個實體類的關系。
會話實體類和消息實體類是用來存儲本地會話和消息的容器類,除了包含會話內容和消息內容外,還包括了保存在本地的各種狀態,您在客戶端讀取消息時,獲取的對象都和這兩個類相關。會話有多種類型,可以是私聊會話,也可以是群組會話等,每一個 Conversation(會話)包含多條 Message(消息),關系如下圖所示:
通過 conversationType 和 targetId,可以唯一確定一個會話。ConversationType 枚舉值意義和對應的 targetId 意義為:
會話類型枚舉 ConversationType | 說明 | 對應的 targetId |
---|---|---|
PRIVATE | 單聊 | 用戶的 Id(userId)。 |
GROUP | 群組 | 群組的 Id(groupId)。 |
DISCUSSION | 討論組 | 討論組的 Id(discussionId)。 |
CHATROOM | 聊天室 | 聊天室的 Id(chatroomId)。 |
CUSTOMER_SERVICE | 客服 | 客服的 Id(customerServiceId)。 |
SYSTEM | 系統會話 | 系統賬戶 Id。可以理解為 QQ 的 10000 號的角色。 |
APP_PUBLIC_SERVICE | 應用公眾服務 | 應用公眾服務的 Id(publicServiceId)。 |
PUBLIC_SERVICE | 公眾服務 | 公眾服務的 Id(publicServiceId)。 |
另:系統會話類型並不一定代表是“系統消息”,本質上與單聊會話類型沒有區別,只是邏輯上做了不同的區分,便於展開不同的產品業務邏輯。
通過一個 conversationType 和 targetId 組合,您可以確定一個唯一的會話。如當您需要發起單聊會話時,您需要傳入 ConversationType_PRIVATE 和 userId,當您需要發起群組聊天時,您需要傳入 ConversationType_GROUP 和 groupId,當您需要發起討論組會話時,您需要傳入 ConversationType_DISCUSSION 和 discussionId。
消息實體類
RCMessage 是消息實體類,消息實體類是消息類的外層容器,消息實體對象是消息對象在本地存儲的外層對象,消息實體對象封裝了消息的基本信息如類型、 ID、消息的方向、接收狀態、接收時間、發送者等。您可能需要先了解其中兩個成員參數的概念。
objectName
代表消息內容的類型,是一個標示符(Identifier),融雲內置消息類型以 RC: 開頭,如 RC:TxtMsg,RC:ImgMsg,RC:VcMsg 等。
content
消息類,一個 RCMessageContent 類型的對象,代表着實際的消息。
消息類
MessageContent 是消息類,他也是所有消息的基類,文本、圖片等消息都繼承於它,如您要自定義消息,也要繼承它實現。
消息類不同於消息實體類(RCMessage),消息類代表一條具體的消息內容,消息實體類是消息類的外層容器,消息實體對象是消息對象在本地存儲的外層對象,消息實體對象除了包含消息對象外,還包括消息的方向、接收狀態、接收時間、發送者等。
每一條消息內容都一個標示符(Identifier),用來標識自己的類型,該標示符必須唯一。消息內容類的重要函數是 encode ,每一個消息都需要實現自己的 encode 方法來封裝消息內容。
當前版本的消息分兩種,普通的內容類消息,和通知類消息,接下來將分別仔細介紹。
消息分類 | 消息行為狀態標識 |
---|---|
內容類消息 | 表示一個用戶間發送的包含具體內容的消息,需要展現在聊天界面上,如文字消息、語音消息等。 |
通知類消息 | 表示一個通知信息,可能展現在聊天界面上,如提示條通知。 |
內置內容類消息
文字消息類
RCTextMessage。用來發送文字類消息,其中可以包括超鏈接,會自動識別。繼承自RCMessageContent,是一個普通內容類消息。
消息類名:RCTextMessage
消息 ObjectName:RC:TxtMsg
消息狀態行為標識:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED
消息的結構:{"content":"Hello world!","extra":""}
其中 content
為文字消息的文字內容,extra
可以放置任意的數據內容,也可以去掉此屬性。
語音消息類
RCVoiceMessage。用來發送語音片段消息,其中可以包括超鏈接,會自動識別。
消息類名:RCVoiceMessage
消息 ObjectName:RC:VcMsg
消息狀態行為標識:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED
消息的結構:{"content":"bhZPzJXimRwrtvc=","duration":7,"extra":""}
其中 content
為語音消息錄制轉碼成 AMR 格式后,進行 Base64 編碼的結果值,duration
為語音消息的時長(單位:秒),extra
可以放置任意的數據內容,也可以去掉此屬性。
圖片消息類
RCImageMessage。用來發送圖片類消息。
消息類名:RCImageMessage
消息 ObjectName:RC:ImgMsg
消息狀態行為標識:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED
消息的結構:{"content":"bhZPzJXimRwrtvc=","imageUri":"http://p1.cdn.com/fds78ruhi.jpg","extra":""}
圖片消息包括兩個主要部分:縮略圖和大圖,縮略圖直接 Base64 編碼后放入 content
中,大圖首先上傳到文件服務器(融雲 SDK 中默認上傳到七牛雲存儲),然后將雲存儲上的大圖地址放入消息體中。流程示意如下:
其中 content
為圖片內容進行 Base64 編碼的結果值,imageUri
為圖片上傳到圖片存儲服務器后的地址,extra
可以放置任意的數據內容,也可以去掉此屬性。
縮略圖尺寸為:240 x 240 像素,以寬度和高度中較長的邊不超過 240 像素等比壓縮。
大圖尺寸為:960 x 960 像素,以寬度和高度中較長的邊不超過 960 像素等比壓縮。
圖文消息類
RCRichContentMessage。用來發送圖文消息,包含一個標題,一段文字內容和一張圖片。
消息類名:RCRichContentMessage
消息 ObjectName:RC:ImgTextMsg
消息狀態行為標識:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED
消息的結構: {"title":"Big News","content":"I'm Ironman.","imageUri":"http://p1.cdn.com/fds78ruhi.jpg","url":"http://www.rongcloud.cn","extra":""}
其中 title
為消息的標題,content
為消息的文字內容,imageUri
為圖片的地址,url
為跳轉的地址,extra
可以放置任意的數據內容,也可以去掉此屬性。
圖片尺寸為:120 x 120 像素。
地理位置消息類
RCLocationMessage。用來發送地理位置消息。
消息類名:RCLocationMessage
消息 ObjectName:RC:LBSMsg
消息狀態行為標識:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED
消息的結構:{"content":"bhZPzJXimRwrtvc=","latitude":39.9139,"longitude":116.3917,"poi":"北京市朝陽區北苑路北辰泰岳大廈","extra":""}
其中 content
為地圖縮略圖內容進行 Base64 編碼的結果值,latitude
為位置的緯度值,longitude
為位置的經度值,poi
為位置興趣點名稱,extra
可以放置任意的數據內容,也可以去掉此屬性。
文件消息
消息類名:RCFileMessage
消息 ObjectName:RC:FileMsg
消息狀態行為標識:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED
消息的結構:{"name”:”a.txt","size":190184,"type":"txt","fileUrl":"http://rongcloud-image.ronghub.com/text_plain_242002?e=2147483647"}
其中 name
為文件名,size
為文件大小,type
為文件類型,fileUrl
為文件地址,extra
可以放置任意的數據內容,也可以去掉此屬性。
內置通知類消息
提示條(小灰條)通知消息
RCInformationNotificationMessage。用來發送在聊天會話頁面顯示的提示條(小灰條)通知。
消息類名:RCInformationNotificationMessage
消息 ObjectName:RC:InfoNtf
消息狀態行為標識:MessageTag.ISPERSISTED
消息的結構:{"message":"請在聊天中注意人身財產安全",extra:""}
其中 message
為提示條消息內容,extra
可以放置任意的數據內容,也可以去掉此屬性。
聯系人(好友)通知消息
RCContactNotificationMessage。用來發送聯系人操作(加好友等)的通知消息。
消息類名:RCContactNotificationMessage
消息 ObjectName:RC:ContactNtf
消息狀態行為標識:MessageTag.ISPERSISTED
消息的結構:{"operation":"Request","sourceUserId":"123","targetUserId":"456","message":"我是小艾,能加一下好友嗎?","extra":""}
其中 operation
為聯系人操作的指令,sourceUserId
為發出通知的用戶 Id,targetUserId
為接收通知的用戶 Id,message
為通知附帶的消息內容,extra
可以放置任意的數據內容,也可以去掉此屬性。
官方針對 operation
屬性定義了 "Request", "AcceptResponse", "RejectResponse" 幾個常量,也可以由開發者自行擴展。
資料通知消息
RCProfileNotificationMessage。用來發送用戶資料變更通知消息。
消息類名:RCProfileNotificationMessage
消息 ObjectName:RC:ProfileNtf
消息狀態行為標識:MessageTag.ISPERSISTED
消息的結構:{"operation":"Update","data":"{\"nickname\":\"韓梅梅\", \"hometown\":\"beijing\"}","extra":""}
其中 operation
為資料通知操作,可以自行定義,data
為操作的數據,extra
可以放置任意的數據內容,也可以去掉此屬性。
通用命令通知消息
RCCommandNotificationMessage。用來發送通用的指令通知消息,消息內可以定義任意 JSON 內容。
消息類名:RCCommandNotificationMessage
消息 ObjectName:RC:CmdNtf
消息狀態行為標識:MessageTag.ISPERSISTED
消息的結構:{"name":"AtPerson","data":"{\"sourceId\":\"9527\"}"}
其中 name
為命令名稱,可以自行定義,data
為命令的內容。
群組通知消息
用來發送群組操作的通知消息。
消息類名:RCGroupNotificationMessage
消息 ObjectName:RC:GrpNtf
消息狀態行為標識:MessageTag.ISPERSISTED
消息的結構:{"operatorUserId":"4324","operation":"Rename","data":"本地生活","message":"修改本群名為本地生活","extra":""}
其中 operatorUserId
為操作人用戶 Id,operation
為操作名,data
為操作數據如:目標用戶 Id 或修改后群名稱,詳細可參見內置消息類型說明,message
為消息內容,extra
可以放置任意的數據內容,也可以去掉此屬性。
討論組通知消息
用來發送討論組操作的通知消息。
消息類名:RCDiscussionNotificationMessage
消息 ObjectName:RC:DizNtf
消息狀態行為標識:MessageTag.ISPERSISTED
消息的結構:{"type":1,"extension":"3213,4332","operator":"5435"}
其中 type
為討論組操作類型 1:加入討論組 2:退出討論組 3:討論組改名 4:討論組管理員踢人,extension
為被加入討論組用戶 Id,多個用戶 Id 以逗號分割,operator
為當前操作用戶 Id。
命令消息
RCCommandMessage。用來發送通用的指令通知消息,消息內可以定義任意 JSON 內容,與通用命令通知消息的區別是不存儲、不計數。
消息類名:RCCommandMessage
消息 ObjectName:RC:CmdMsg
消息的結構:{"name":"AtPerson","data":"{\"sourceId\":\"9527\"}"}
其中 name
為命令名稱,可以自行定義,data
為命令的內容。
內置狀態類消息
對方正在輸入狀態消息
用來發送對方正在輸入時的狀態消息,不存儲、不計數。
消息 ObjectName:RC:TypSts
消息的結構:{"typingContentType":"RC:TxtMsg"}
typingContentType
為正在輸入消息類型。
IMKit 體系架構
IMKit界面組件是融雲產品的核心特色,開發者使用 IMKit,不需要從頭開發自己的界面,只需要通過簡短的代碼即可集成到您的 App 產品中。會話列表、聊天窗口、消息內容選擇、表情庫、好友選擇、會話設置這些最復雜的功能,融雲 IMKit 已經替您完成。您在啟動聊天會話列表之后,所有的界面融雲已經替您完成。
對於進一步有豐富自定義需求的用戶,融雲IMkit支持會話列表、聊天窗口、輸入框、消息內容的自定義,你可以通過繼承和重寫界面的方法完成自己獨特的界面。

IMKit主要有兩個界面,會話列表( Conversation List )和會話( Conversation ),在融雲IMKit的實現中,前者是一個 UITableView,后者是一個 UICollectionView。
在會話界面中,其中的每一條消息是一個 UICollectionViewCell,支持自動布局。目前融雲替開發者實現了五種普通內容的消息的界面展現:文本,圖像,語音,圖文,位置,相關接口也全部開放,您可以使用也可以繼承 RCMessageCell 自定義自己的消息展現。
RCConversationModel 是會話模型,包含了每一條具體會話的數據;RCMessageModel 是消息模型,包含了每一條具體消息的數據,開放給 App 根據自己的需求訪問和使用。
RCConversationListViewController 和 RCConversationViewController 都繼承於 RCBaseViewController,您可以繼承他們並實現自己的自定義會話列表。