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資料打包和解析。