iOS swift項目IM實現,從長連接到底層數據解析分析之Socket
一:項目簡介: 去年開始接手了一個國企移動項目,項目的需求是實現IM即時通訊功能。
* 一期版本功能包括了:
1.公司業務的審批,報價和授標審批流程;
2.單人的聊天和群組聊天(領導日常工作交流);
3.聊天消息包括支持文字類消息,語言,圖片,並且語言支持跨平台;
4.對消息的網絡數據傳遞實現加密壓縮處理,保證數據安全傳輸;
* 項目特點:
因為項目業務的:審批,報價和授標審批流程的特殊性, IM的實現不能應用第三方,比如:極光推送等,所以需要實現處理Socket底層數據解刨。
二:iOS IM功能使用Socket的tcp請求協議來實現,推薦使用第三方sdk: CocoaAsyncSocket
CocoaAsyncSocket:OC的版本,是應用GCD寫的異步處理,有興趣的可以去看下原碼
三:CocoaAsyncSocket
pod 'CocoaAsyncSocket' //可以通過pod集成
四:CocoaAsyncSocket init和delegate
----init分析------
----delegate分析------
* 實現CocoaAsyncSocket的4個代理來處理Socket通訊數據,下面分別分析各個代理的作用:
1. - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port;
- 成功連接上服務器后,需要發送保持長連接的心跳機制,在成功回調方法中實現:
- 發送心跳機制的同時,發起賬號登錄驗證
2.- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(nullable NSError *)err;
* 有成功,那么必定會有失敗:
- 失敗需要即時更新連接狀態,確保用戶在連接失敗的情況下,操作的安全性(不閃退),加以UI提示
更新的狀態包括:1: 網絡狀態,2: 用戶數據同步狀態,3: 心跳間隔時間,4: 是否是強制重新連接
注:(一個健壯的性能又好的IM系統,需要考慮的因素很重要)
- 重新連接,在本項目總負責王總的建議下,一旦斷開連接給予6次重連機會
注: 本項目總負責王總,是后台出生,整個項目的后台(報告EQ系統,ERP系統)系統都有王總搭建,后台的整個IM框架也是王總集成,維護和改進,
國企職位高並且技術全面的確實佩服。
3.- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag;
- GCDAsyncSocket數據包發送,涉及了3種狀態,分析如下: 第一種:數據包只有發送,沒有回調數據包接受
-
第二種:數據包有發送, 確定有數據包接受
-
第三種:數據包有發送,不確定有數據包接受
- 分析:GCDAsyncSocket數據包的接收需要提前訂閱(提供線程任務處理),如果提供的訂閱任務用完了,那么GCDAsyncSocket 不會處理和回調新接收到的消息數據,didWriteData這個方法的實現就是處理兼容涉及的3種狀態,保證新消息能被及時處理。
4.- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
- 新消息成功訂閱,這里就開始對數據的解析,數據類型分為:
指令消息(syc指令),心跳消息,Init消息和Invoke(獲取)消息;
- didReadData:方法中回調了tag字段,但是我們不能按照tag來區分,tag只是回調線程的標記,必須安照數據類型來區分
五:Socke總結
* CocoaAsyncSocket 的Socket 連接層到這里差不多了,上面列出來的條例都是需要非常注意的地方。
* IM連接層還有個非常重要的地方:需要對項目的網絡狀態時時監控,網絡狀態的改變需要做處理,
4G網絡下需要對用戶提醒,虛擬網絡下需要優化處理IM任務, 在斷開連接重連的情況下要優先判斷網絡狀態,
這些都是對IM系統的性能優化,為項目的迭代打下堅韌的基礎。
注:下一篇: iOS swift項目IM實現,從長連接到數據流解析分析之Payload數據打包和解析。