“最淡的墨水勝過最強的記憶”
因為公司一直在趕項目,也有段時間沒有更新過文章了。閑下來想了還是寫點東西來做個總結(jié)(順便當備忘錄 = =)。
雖然現(xiàn)在用戶的移動社交基本還處于 QQ、微信 的壟斷時代,但 IM 功能現(xiàn)在已經(jīng)逐漸成為應用的標配。下面會大致說下我自己覺得比較重要的地方以及后續(xù)文章的大綱。
IM 協(xié)議的選擇
這一塊兒我覺得是開發(fā)者在進行開發(fā)前要慎重考慮的問題。不過相關的內(nèi)容其實網(wǎng)上已經(jīng)有不少優(yōu)質(zhì)的文章,在這里我就提供幾個鏈接不多做贅述。
《移動 IM 學習筆記》- Ruby客戶端
《簡述移動端IM開發(fā)的那些坑:架構(gòu)設計、通信協(xié)議和客戶端》- Segmentfault
首先說明下我們公司選擇的協(xié)議是 XMPP (不然也不會有這篇及之后的文章 = =)。
理由很簡單:
- 開源、免費,可以用于商用,公司可以省去一部分開支(排除了使用第三方 SDK )
- 公司團隊不大并且項目進度抓的時間緊(排除自己實現(xiàn)協(xié)議)
- XMPP 協(xié)議存在時間已經(jīng)很長,網(wǎng)上的資料比較齊全
雖然我所在的公司最終決定使用 XMPP 協(xié)議(后面都簡稱 XMPP ),但依然不得不說在實際使用上有不少的坑要填。所以我提兩點建議:
- 如果讀者所在公司準備開發(fā)的 App 不是聊天密集型,并且公司有條件或者讀者口才比較好能說服領導的話,建議還是選擇第三方 SDK
- 公司團隊技術相對成熟,準備開發(fā)的 App 也是聊天密集型的,建議使用私有協(xié)議
如果你決定聽從我的建議,那么恭喜你不用入坑并且可以關掉窗口去查詢對應的資料了,因為后面的內(nèi)容都是基于使用 XMPP 展開的。
XMPP 的使用場景
大部分的協(xié)議在設計之初都會有一個預想的使用場景,然后開發(fā)人員根據(jù)這個預想的場景去制定一系列的規(guī)則。對于協(xié)議的使用者來說如果你的需求正好符合這個協(xié)議的預想場景,那么使用起來將會得心應手,反之就會處處掣肘。
那么對于 XMPP 協(xié)議來說,簡單分為倆部分:單人聊天 和 多人聊天。
(具體代碼在之后的文章中貼出,這篇文章只做討論)
單人聊天
單人聊天的場景比較簡單,在社交軟件泛濫的今天可能連沒有學習過 IT 的大叔大媽們都能列出個一二三。
下面我就列舉部分XMPP 能夠快速實現(xiàn)單人聊天的功能:
- 用戶登錄、注冊
- 好友添加、刪除及分組
- 個人名片(昵稱、頭像、住址等等)
- 好友狀態(tài)檢測及通知(在線、離線)
- 文件傳輸(照片、音頻)
多人聊天
多人聊天相比起單人聊天就要復雜的多了,不過總的來說還是能歸為倆種模式:會議模式 和 群組模式。
會議模式 和 群組模式 最大的區(qū)別在于人員的流動性
- 會議模式 下的 群 稱之為 房間 更為恰當,用戶作為使用者的角色并不會一直存在房間中,這與我們平常意義上的群組是不同的。典型的使用案例:YY 、直播聊天室。
- 群組模式 就不多做解釋了,典型使用案例:QQ 群 、微信群聊
XMPP 就是根據(jù) 會議模式 的使用場景去設計的,所以如果讀者的 App 是準備使用 XMPP 開發(fā)群組功能的話就要做好準備填坑了,當我們的總結(jié)寫到開發(fā)群聊功能的時候也會舉出一些我遇到的坑以及填坑的辦法。
下面列舉部分 XMPP 能夠快速實現(xiàn)多人聊天的功能:
- 單人聊天的所有功能
- 單人聊天轉(zhuǎn)多人聊天(需服務器支持)
- 聊天室創(chuàng)建、銷毀
- 聊天室信息編輯
- 房客多級權限
- 房客管理(禁言、邀請、刪除等)
- 房客狀態(tài)變動通知(入群、離群、權限變更)
XMPP 服務器與客戶端通信實質(zhì)
XMPP 服務器與客戶端通信的實質(zhì)就是一串串 XML 代碼塊不斷傳遞解析的過程。一串 XML 相當于日常開發(fā)中的 接口 + 請求參數(shù)(如下圖)。

那么對于客戶端的開發(fā)者來說你要做的事情就明顯了:
- 去官網(wǎng)查詢對應功能模塊的標準
XML格式 - 按照標準格式組裝
XML串發(fā)送給服務器 - 接受服務器返回結(jié)果并按格式解析
這一段的內(nèi)容我覺得比較重要的原因是 iOS 端的 XMPPFrameWork 并沒實現(xiàn)所有協(xié)議中的功能,在實際使用過程中我們需要自己去實現(xiàn)對應協(xié)議的內(nèi)容(當然沒有實現(xiàn)的功能并不算多)。但幸運的是 XMPPFrameWork 框架把 XML 組裝和解析的方法封裝的非常靈活,我們可以很輕松的去實現(xiàn)。