十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
前段时间加入一个团队,对TeamTalk进行二次开发。我负责iOS端的功能扩展。这个项目目前已少有人维护,iOS端在我接手后进行了一些底层改动,现介绍给大家。
创新互联长期为成百上千家客户提供的网站建设服务,团队从业经验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];
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,则是协议管理文件。如果想扩展协议,就的在这里进行添加。相当于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:设置登录服务器功能已经添加,如图