一次使用反编译、网络拦截等各种手段的超级难受的ios集成经历

1. APP中新集成一种记录仪,供应商提供了对应的SDK和Demo

供应商说提供SDK和Demo的时候,我是信心满满的,预计三个工作日完成全部开发工作,于是将整合调试的时间定在了一周内。
然而,事实证明我还是太年轻了。当Demo到手的时候,根本不能成功运行,眼前一群又一群的羊驼飞奔而过,这羊驼也敢把自己叫做Demo?联系供应商再三确认,这就是最新的SDK和Demo。好吧,小客户不能算客户,老紫认栽了!

2.调试Demo

一遍又一遍的运行Demo,根据提示的报错信息,删除其中见了鬼的.dylb,重新添加对应.tbd资源,一天过去了,终于把这玩意儿跑起来了。

然而,老紫又年轻了,这羊驼识别不了wifi名。糟心,把wifi名识别模块拿掉,所有网络都识别为记录仪局域网,这下通过了,但是,这羊驼怎么闪退了?再试,又闪退!什么鬼?

追踪闪退,这一团又一团农家肥样的代码块,所有重要信息都在使用Notification丢来丢去,一群羊驼丢出来一堆农家肥,另一群羊驼接到了,要我怎么追踪?

打上标记吧,每次丢之前打印一个编号,接收之前也打印一个编号,通过打印的数值建立对应关系。捋清楚数据关系,再分析报错位置,这玩意儿没能绑定到指定的端口,但是流媒体播放器却在循环拉流,并把拉到的空数据截取解析。这玩意儿不判断一下,就硬解析的吗?

3. 换新的Demo

又追踪调试了一天,还是不能与记录仪建立稳定的socket连接,好在我找到了供应商在APPStore上的APP。玩了一会儿,经过分析比较,我们确定供应商撒谎了!因为这个APP和Demo显示的界面上,版本号、核心版本号都是不一样的,这个Demo一定是一个老旧的东西。

于是联系供应商,请供应商联系芯片供应商,提供最新的SDK与Demo,或直接提供socket请求协议,由我们自己封装核心模块。

等了两天,供应商又丢过来一个新的SDK和Demo,又附送了一个协议文档和SDK使用文档。这个Demo看日期是比较新的,2018年,好吧,比起2017年是新了不少,但还是运行不起来呀。

4. 不废那破工夫,按协议文档自己封装一套。

按照协议文档,开始建立链接,直接connect失败。各种姿势安排了一遍,还是不行。安装供应商APP抓包,wireshark走起,果然有猫腻儿!协议文档显示connect端口为2222,但实际connect端口却是3333。

更换connect端口到3333,果然connect成功了。成功之后是心跳连接,按照文档封装指令名和参数数据,直接好家伙,卵用没有。

再抓包,由于数据的传递中存在一部分加密信息,又增加了大小端数据转换,抓到的数据大部分显示内容是乱码。

不怕,Demo调整完毕,直接Xcode运行,拦截GCDAsyncSocket的send和receive,解析Send出去的Data数据,发现我们封装的时候少了一个op参数,正常参数要封装到param字段中。构建完成,再次发送,成功拿到心跳数据。

但是返回的数据需要再次解码,这一部分的文档太简单潦草了,只提示了指令位置和数据长度。没有经验的开发者,陷入了与进行->闪退、运行->闪退、运行->闪退的循环中。

这羊驼,把SDK使用hopper搞出来伪代码,分析他们避免闪退的手法。好家伙,他们使用一个可变的Data,将所有返回的数据添加可变Data中,每次添加后解析一次,解析成功后将其中的数据移出可变的Data。

学到了,搞一个NSMutableData,加加减减的走起来。搞清楚了所有的指令,开始完成核心的缩略图和视频播放。
缩略图又发生了文档错误,文档显示指令发出后立即connect到2224端口,但实际操作中却是connect到2228,修改完成后搞定了缩略图。视频播放也是如此,文档显示端口为3336,实际操作却是链接到2214。

5. 播放过程卡顿的非常厉害

功能完成后,在实际测试中却发现,iphone在大部分情况下都会卡顿的非常严重,一秒钟的视频实际需要三秒以上才能传输完成。使用供应商的APP也是如此,卡顿十分频繁,严重影响使用体验。

在一遍又一遍催促供应商后,供应商表示他们的APP是用来玩儿的,实际参考价值不大?这是什么操作?好在他们又介绍了一家正在做商业APP的公司,但这家公司不可能和我们分享这些内容的,他们毕竟是靠这个盈利的。感觉压力好大!

不管了,我们下载了这家公司在APPStore上的APP,实际测试后发现此APP确实没有非常严重的卡顿现象,普通的缓冲并不影响使用体验。老紫开始挠头了,这玩意儿不是自己做了一个缓冲池,写了一套底层播放器吧?这我一个人写到猴年马月去呀?

不管了,老规矩,先抓个包看看。呵呵,这是什么鬼?这个http://xxx.xxx.x.xxx:8080/xx/xxxx_xx.mov?ctp=1的是个啥?这玩意儿不就是个普通的http播放协议吗?这么简单好用的东西,你文档上面竟然不写的吗?

删掉所有的音视频帧解析内容,调用IJKPlayer,将url设置为这个藏起来的http,搞定!

你可能感兴趣的:(一次使用反编译、网络拦截等各种手段的超级难受的ios集成经历)