TeamTalk项目iOS端代码总结
admin
2023-02-09 11:40:11
0

前段时间加入一个团队,对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工程目录如下图:
TeamTalk项目iOS端代码总结

Category:存放对各种元数据的扩展文件。比如NSData的扩展。
Config:存放基础配置文件。
Control:存放公用界面文件。比如弹出警告。
Entity:存放pb数据实例化文件,pb数据经解析后,保存为一个个名为Entity的数据集合,相当于mvc中的model。
Exist:各种第三方库,比如消息加密库。
GlobalData:全局信息,比如当前用户信息。
Module:存放各个模块数据处理管理文件。比如登录管理,用户管理,消息管理,群组管理等,里面的TCPAPI,则是协议管理文件。如果想扩展协议,就的在这里进行添加。相当于mvc中的control。
Resource:资源文件。
Util:工具类文件,主要是数据库工具。
ViewController:界面文件。其中Chatting目录下是主聊天界面,最难。通过对cell扩展实现不同的聊天气泡。相当于mvc中的view。

再说一下项目中网络传输处理方式。在DDTcpClientManager类中建立了一个基于TCP的消息服务器。每条数据包含cid,sid和seqNo。cid表示大类功能,比如用户,消息等,sid表示大类功能下的具体功能,比如删除用户,seqNo是消息序号,通过序号做到消息有序发送和接收。比如我发了一个序号是70的消息,服务器返回的响应消息中序号也是70,说明正好是我这个消息的响应。还有一种监听消息,监听服务器发来的数据信息,然后通知app进行逻辑处理。大致就这两种消息了,一种是一来一回的,跟http通讯一样,一种是监听服务器的。

下图是基于这种消息通讯,扩展出一个文件发送的时序图:
TeamTalk项目iOS端代码总结

之前iOS端并没有支持文件发送,我们在新功能里进行了扩展。总体思路是新建一个文件服务器,也是TCP的,然后一来一回传文件,具体技术细节我不赘述了。

扩展后代码下载路径:
https://download.csdn.net/download/yige2002/10653517

如果谁愿意交流咨询可以在帖子下留言。

PS:设置登录服务器功能已经添加,如图
TeamTalk项目iOS端代码总结

相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...