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端代码总结

相关内容

热门资讯

共促数智交融 共启丝路新篇—... 本报记者 亓玉昆7月22日,2026年世界互联网大会数字丝路发展论坛在陕西西安举行。论坛以“智汇丝路...
赛里木湖景区通报“工作人员殴打... 2026年7月23日17时许,赛里木湖景区入口处发生多名景区工作人员殴打旅游车司机事件,我们深感痛心...
继英伟达黄仁勋后,AMD苏姿丰... IT之家 7 月 24 日消息,随着中国开源 AI 模型的不断变强,近期美国业界出现了关于 AI 是...
辰奕智能获得实用新型专利授权:... 证券之星消息,根据天眼查APP数据显示辰奕智能(301578)新获得一项实用新型专利授权,专利名为“...
湖南湘江新区文化创意产业出海观... 中新网长沙7月23日电(胡语桐)在日本大型量贩门店的货架上,中国研发的视频创意软件实体产品陈列其中;...
中国数学家首次获得的菲尔兹奖“... 当地时间7月23日上午,2026年国际数学家大会在美国费城开幕,现场揭晓2026年菲尔兹奖得主。中国...
猪周期反转,这次可能来真的 市场过去几年关于猪周期的很多认知,现在需要重新审视了。过去几年,越来越多人相信:随着规模化养殖企业不...
王虹、邓煜为啥能获菲尔兹奖? 当地时间7月23日早晨,2026年国际数学家大会在美国费城开幕。国际数学联盟在开幕式上正式公布第二十...
高温津贴,不能用绿豆汤冲抵 近日,深圳市人力资源和社会保障局发布关于高温津贴的典型劳动仲裁案例,并普法提醒:即便劳动合同约定日薪...
菲律宾,你到底想干什么 中国和菲律宾关系,又出幺蛾子了。反正,最近几天,麻烦不断,场面火爆。仁爱礁,菲两艘小艇冲撞我巡逻船只...