前段时间加入一个团队,对TeamTalk进行二次开发。我负责iOS端的功能扩展。这个项目目前已少有人维护,iOS端在我接手后进行了一些底层改动,现介绍给大家。
成都创新互联是一家专业提供吉县企业网站建设,专注与网站建设、网站制作、H5场景定制、小程序制作等业务。10年已为吉县众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。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];
DDDataOutputStreamdataout = [[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];
DDDataOutputStreamdataout = [[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,则是协议管理文件。如果想扩展协议,就的在这里进行添加。相当于mvc中的control。
Resource:资源文件。
Util:工具类文件,主要是数据库工具。
ViewController:界面文件。其中Chatting目录下是主聊天界面,最难。通过对cell扩展实现不同的聊天气泡。相当于mvc中的view。
再说一下项目中网络传输处理方式。在DDTcpClientManager类中建立了一个基于TCP的消息服务器。每条数据包含cid,sid和seqNo。cid表示大类功能,比如用户,消息等,sid表示大类功能下的具体功能,比如删除用户,seqNo是消息序号,通过序号做到消息有序发送和接收。比如我发了一个序号是70的消息,服务器返回的响应消息中序号也是70,说明正好是我这个消息的响应。还有一种监听消息,监听服务器发来的数据信息,然后通知app进行逻辑处理。大致就这两种消息了,一种是一来一回的,跟http通讯一样,一种是监听服务器的。
下图是基于这种消息通讯,扩展出一个文件发送的时序图:
之前iOS端并没有支持文件发送,我们在新功能里进行了扩展。总体思路是新建一个文件服务器,也是TCP的,然后一来一回传文件,具体技术细节我不赘述了。
扩展后代码下载路径:
https://download.csdn.net/download/yige2002/10653517
如果谁愿意交流咨询可以在帖子下留言。
PS:设置登录服务器功能已经添加,如图
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。