1. 程式人生 > >TeamTalk項目iOS端代碼總結

TeamTalk項目iOS端代碼總結

是我 log builder all 分享圖片 sid pap 工作量 全局

前段時間加入一個團隊,對TeamTalk進行二次開發。我負責iOS端的功能擴展。這個項目目前已經少有人維護了,iOS端在我接手後進行了一些底層改動,現在介紹給大家。

TeamTalk是一個很有名氣的即時通訊解決方案,
github地址:https://github.com/meili/TeamTalk
但是由於維護一個即時通訊項目工作量太大,內部人員分崩離析,導致項目無人維護了。iOS端最大的過時體現就是google的Protobuf庫沒有更新,無法使用目前最新的3.6.1版本生成的proto文件。下文我會給出解決方案。

先總體介紹一下TeamTalk的iOS端項目。它采用google的Protobuf協議對數據進行封裝,使用一個基於TCP協議的消息服務器來處理網絡消息,實現即時通訊。一條數據的傳輸,比如發送一個文字消息,首先對消息進行加密,當然只有通訊消息會有這個加密過程,一般的數據傳輸是不需要特別加密的。然後將要傳輸的各種數據轉化成protobuf格式的數據,發送給服務器。客戶端接收到服務器傳回的響應數據後,先通過Protobuf轉化為iOS中的數據,比如NSString,int等,再進行邏輯處理。

來說說protobuf的升級方案。當前項目使用的pb文件是google pb庫2.6.1版本生成出來的,不兼容當前3.6.1版本生成出來的pb文件,我的解決方案是去掉項目中負責pb數據解析的ProtocolBuffers庫,改用Protobuf庫進行pb數據解析。Protobuf庫支持最新的pb文件格式。在代碼中,需要將原來使用ProtocolBuffers庫的代碼改為使用Protobuf庫後的代碼。舉個例子:

ProtocolBuffers庫:
IMLogoutReqBuilder logoutbuilder = [IMLogoutReq builder];
DDDataOutputStream

dataout = [[DDDataOutputStream alloc] init];
[dataout writeInt:0];
[dataout writeTcpProtocolHeader:SID_LOGIN cId:IM_LOGOUT_REQ seqNo:seqNo];
[dataout directWriteBytes:[logoutbuilder build].data];
[dataout writeDataCount];
return [dataout toByteArray];

Protobuf庫:
IMLogoutReq logoutbuilder = [[IMLogoutReq alloc] init];

DDDataOutputStream dataout = [[DDDataOutputStream alloc] init];
[dataout writeInt:0];
[dataout writeTcpProtocolHeader:SID_LOGIN cId:IM_LOGOUT_REQ seqNo:seqNo];
[dataout directWriteBytes:[logoutbuilder data]];
[dataout writeDataCount];
return [dataout toByteArray];

從例子中可以發現兩個庫是略有不同的,但大差不差,原理是一樣的。更換了PB解析庫後,就可以使用最新版本的pb庫生成各種proto文件並使用了。附上兩篇貼子,分別介紹原來的解決方案和現在的解決方案:
老TeamTalkPB解析方案:
Protobuf: 2.6.1
ios Pods庫:ProtocolBuffers
https://blog.devzeng.com/blog/ios-protobuf.html
我采用的新方案:
Protobuf:3.6.0
ios Pods庫:Protobuf
https://www.jianshu.com/p/c17260b36928

介紹完升級PB庫,說一下工程目錄,以便大家可以快速的對整個項目有個印象。iOS工程目錄如下圖:
技術分享圖片

Category:存放對各種元數據的擴展文件。比如NSData的擴展。
Config:存放基礎配置文件。
Control:存放公用界面文件。比如彈出警告。
Entity:存放pb數據實例化文件,pb數據經解析後,保存為一個個名為Entity的數據集合,相當於mvc中的model。
Exist:各種第三方庫,比如消息加密庫。
GlobalData:全局信息,比如當前用戶信息。
Module:存放各個模塊數據處理管理文件。比如登錄管理,用戶管理,消息管理,群組管理等,裏面的TCPAPI,則是協議管理文件。如果想擴展協議,就的在這裏進行添加。
Resource:資源文件。
Util:工具類文件,主要是數據庫工具。
ViewController:界面文件。其中Chatting目錄下是主聊天界面,最難。通過對cell擴展實現不同的聊天氣泡。

再說一下項目中網絡傳輸處理方式。DDTcpClientManager類建立了一個基於TCP的消息服務器,每條數據包含cid,sid和seqNo,cid表示大類功能,比如用戶,消息等,sid表示大類功能下的具體功能,比如刪除用戶,seqNo是消息序號,通過序號做到消息有序發送和接收。比如我發了一個序號是70的消息,服務器返回的響應消息中序號也是70,說明正好是我這個消息的響應。還有一種監聽消息,監聽服務器發來的數據信息,然後通知app進行邏輯處理。大致就這兩種消息了,一種是一來一回的,跟http通訊一樣,一種是監聽服務器的。

下圖是基於這種消息通訊,擴展出一個文件發送的時序圖:
技術分享圖片

之前iOS端並沒有支持文件發送,我們在新功能裏進行了擴展。總體思路是新建一個文件服務器,也是TCP的,然後一來一回傳文件,具體技術細節我不贅述了。

擴展後代碼下載路徑:
https://download.csdn.net/download/yige2002/10653517

如果誰願意交流咨詢可以在帖子下留言。

TeamTalk項目iOS端代碼總結