TeamTalk项目iOS端代码总结

前段时间加入一个团队,对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

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

原文地址:http://blog.51cto.com/2807281/2171998

时间: 2024-10-03 19:09:27

TeamTalk项目iOS端代码总结的相关文章

Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)

Phonegap项目,做支付的时候,当把网站打包到ios或android端成app后,在app上通过wap调用银联在线存在一个问题: 就是当从银联支付成功后,再从服务器返回到app客户端就很难实现. wap银联支付流程是这样:客户端---> 服务器(构建支付请求)--> 银联支付 ---> 返回到服务端(处理支付结果).所以对于手机网站银联支付没有问题,但是对于ios端app和android端app, 再通过wap支付,发现支付成功后,很难在回到app客户端了. 所以这里就必须借助Pho

在项目中全局添加FastClick导致图片上传插件在ios端失效的解决方案

---恢复内容开始--- 项目是移动端的项目,为了解决300ms的click延迟,所以在全局中加入了FastClick,引入的方式很简单,网上一大堆教程,这里不做赘述 我们就谈,我遇到的问题: 某天产品要我新增一个上传图片的功能,这个也不是一个很困难的需求,直接使用插件,这里我使用的是element-ui的upload插件(对于要快速的上线的东西,不必重复造轮子) 很快速也很简单的完成了需求,然后测试的时候就jj了:经测试,在安卓端是没有任何问题的,可是在ios上,始终无法打开相册和拍照,第一反

做web项目时对代码改动后浏览器端不生效的应对方法(持续更新)

做web项目时,常常会遇到改动了代码,但浏览器端没有生效,原因是多种多样的,我会依据我遇到的情况逐步更新解决的方法 1.执行的时候採用debug模式,普通情况下使用项目部署button右边那个button下的tomcat7中的run即可,假设使用的是serves中的run serves,这样的情况貌似不会自己主动编译 2.点击project菜单下的clean选项,在打开的窗体中选择你使用的项目,ok,这样会删除tomcat容器中关于该项目的一些信息,然后又一次部署,执行 3.删除电脑中tomca

做web项目时对代码修改后浏览器端不生效的应对方法(持续更新)

做web项目时,经常会遇到修改了代码,但浏览器端没有生效,原因是多种多样的,我会根据我遇到的情况逐步更新解决办法 1.运行的时候采用debug模式,一般情况下使用项目部署按钮右边那个按钮下的tomcat7中的run就行,如果使用的是serves中的run serves,这种情况貌似不会自动编译 2.点击project菜单下的clean选项,在打开的窗口中选择你使用的项目,ok,这样会删除tomcat容器中关于该项目的一些信息,然后重新部署,运行 3.删除电脑中tomcat文件夹,重新解压,然后在

IOS IAP APP内支付 Java服务端代码

IOS IAP APP内支付 Java服务端代码 场景:作为后台需要为app提供服务,在ios中,app内进行支付购买时需要进行二次验证. 基础:可以参考上一篇转载的博文In-App Purchase(iap)快速指南了解原理. 直接先上服务端测试通过的代码: import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.U

[BI项目记]-搭建代码管理环境之服务端

 上一篇介绍如何搭建环境进行文档版本的管理,这篇主要介绍搭建环境进行代码版本的管理. 即使是BI项目也要进行代码版本管理.代码版本管理的工具有很多,VSS, SVN等都是当下大家经常提起的,这里主要介绍TFS Express. 在像我们这一代屌丝程序员中,TFS一直被认为是很复杂很臃肿的,还记得有人写过类似笔记,文档中一步一步都需要装什么,基本上,某一步失败了,那么就从安装操作系统开始重新安装就可以了.不过事情是在变的,不得不说后续的TFS安装体验提升了不少,而且也有了相对免费的版本(五用户

[PHP]利用XAMPP搭建本地服务器, 然后利用iOS客户端上传数据到本地服务器中(三. PHP端代码实现)

一.安装XAMPP   http://www.cnblogs.com/lidongxu/p/5256330.html 二. 配置MySql http://www.cnblogs.com/lidongxu/p/5256515.html 然后呢, 今天我们就来接触下PHP开发语言 1. 首先呢, 需要在我们本机服务器文件夹资源下新建个.php文件,   废话嘛(你要写php啦!) 2. 在register.php 输入以下代码 <?php // 1. 获取客户端利用post方式网络请求的body里的

[BI项目记]-搭建代码管理环境服务端

上一篇介绍如何搭建环境进行文档版本的管理,这篇主要介绍搭建环境进行代码版本的管理. 即使是BI项目也要进行代码版本管理.代码版本管理的工具有很多,VSS, SVN等都是当下大家经常提起的,这里主要介绍TFS Express. 在像我们这一代屌丝程序员中,TFS一直被认为是很复杂很臃肿的,还记得有人写过类似笔记,文档中一步一步都需要装什么,基本上,某一步失败了,那么就从安装操作系统开始重新安装就可以了.不过事情是在变的,不得不说后续的TFS安装体验提升了不少,而且也有了相对免费的版本(五用户内授权

h5 解决ios端输入框失去焦点后页面不回弹或者底部留白问题

项目中遇到了这个问题,说实话 iOS 端问题挺多的,原因找起来比较简单,就是吊起键盘的时候把window的高度挤小了,然后, 关掉键盘页面高度没恢复,安卓手机会自动恢复页面高度. 原因找到了就想解决办法,刚开始想的是 iOS 它不恢复那我也没办法,这属于 iOS 的bug啊或者微信的 bug 啊,但领导不这么想, 页面显示出问题了当然得解决,就在google里翻,也是找到解决方法了,如下链接 微信6.7.4 ios12软键盘顶起页面后隐藏不回弹解决方案 解决方法很简单,让window滚动下就可以