本文檔將詳細介紹融雲的 SDK 產品架構和消息體系,以便於您更深刻的瞭解融雲並更快速的開發本身的產品。html
IMKitios
IMKit 的功能主要是封裝各類界面對象,服務於開發者快速實現本身的產品,主要特色是是支持快速集成,支持豐富的界面定製功能。git
IMLibapi
IMLib 的功能是提供基本通訊能力庫,封裝了通訊能力和 Conversation,Message 等各類對象,服務於須要根據本身的產品去本身實現界面的開發者。主要特色是封裝清晰,輕量,便於使用。七牛雲存儲
Protocol安全
Protocol 是融雲的核心協議棧,使用融雲自定義的私有二進制協議。主要特色是是輕量化,有序可靠,不丟消息。Protocol 部分使用 Native 語言開發,在 Android 和 iOS 平臺上保證業務一致性,便於開發者商用化本身的產品。服務器
首先介紹 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,不須要從頭開發本身的界面,只須要經過簡短的代碼便可集成到您的 App 產品中。會話列表、聊天窗口、消息內容選擇、表情庫、好友選擇、會話設置這些最複雜的功能,融雲 IMKit 已經替您完成。您在啓動聊天會話列表以後,全部的界面融雲已經替您完成。
對於進一步有豐富自定義需求的用戶,融雲IMkit支持會話列表、聊天窗口、輸入框、消息內容的自定義,你能夠經過繼承和重寫界面的方法完成本身獨特的界面。
IMKit主要有兩個界面,會話列表( Conversation List )和會話( Conversation ),在融雲IMKit的實現中,前者是一個 UITableView,後者是一個 UICollectionView。
在會話界面中,其中的每一條消息是一個 UICollectionViewCell,支持自動佈局。目前融雲替開發者實現了五種普通內容的消息的界面展示:文本,圖像,語音,圖文,位置,相關接口也所有開放,您可使用也能夠繼承 RCMessageCell 自定義本身的消息展示。
RCConversationModel 是會話模型,包含了每一條具體會話的數據;RCMessageModel 是消息模型,包含了每一條具體消息的數據,開放給 App 根據本身的需求訪問和使用。
RCConversationListViewController 和 RCConversationViewController 都繼承於 RCBaseViewController,您能夠繼承他們並實現本身的自定義會話列表。