网络货运平台SDK初始化失败修改
背景
之前集成了网络货运平台SDK,已经成功初始化,调试过。后来由于变动,这个功能搁置了,最近重新启用这个功能,发现初始化失败。报错如下:
code = 100018, fail = “公钥为空”, message = “服务开启失败”。
如下图:
排查
排查一
由于报错公钥为空
,所以首先排查初始化时传入的appId
、appSecurity
、enterpriseSenderCode
,确认这些值没有错误,且正常可用(安卓端可以初始化成功),然后排查初始化方法,确认方法调用没有错误。
然后陷入了疑惑,为什么SDK 集成成功,所有需要的值没有错误的情况下,SDK初始化失败,且提示公钥为空
呢?
排查二
无奈,再次下载 QQ,联系网络货运平台 SDK 的技术支持,答复说:100018
是加密 pod可能有问题
(这里建议联系的时候要有耐心,且要有悟性),距离我上次集成已经过去一年了,已经忘记了当时集成的时候都有哪些 Pod 库,技术支持指明了方向,余下的只能自己查了。再次查看集成文档发现,SDK 依赖了GMObjC
和GMOpenSSL
两个库。且提供的文档里指定的版本如下图:
然后想起来,当时集成的时候按照SDK提供的写法集成,遇到了些问题。具体是什么问题,记不清了。
但是既然技术支持说是这个可能有问题,那只能改成SDK提供的写法,再次集成,运行,发现启动崩溃。噢,想起来了,当时集成的时候按照SDK的这种写法是启动崩溃了,所以就去除了依赖版本指定,改为下面的写法集成,但是当时都已经调试通过了,没问题啊。难道是最近一年中,GMObjC
库版本被更新了,从而导致了初始化失败?
1 | pod 'GMObjC' |
排查三
查看一年前提交的代码,找到了当时集成时依赖的GMObjC
和GMOpenSSL
的版本,噢,GMOpenSSL
的版本确实不一样了,修改为之前的版本,再次集成,运行,发现还是初始化失败。
神奇了,理论上,当时就能调试通过的,集成和之前版本一致的库,为什么初始化失败呢?
排查四
是不是GMObjC
比SDK 文档里指定的高导致的,只把GMObjC
改为文档里写法集成,编译发现编译失败,因为某个方法的参数不一致。。。绝了。没办法,只能回到一开始,按照SDK文档写法集成,然后排查为什么会启动崩溃。搜索后发现是百度地图和GMObjC
不兼容导致,pod 导入GMObjc 国密库后出现 百度地图mamager初始化crash ,然后我按照百度的说法去找GMObjc依赖openssl版本1.1.1以下的版本,MD,GMObjc
依赖的 openssl1.1.1
起步,就没有低于1.1.1
的,坑爹的百度开发,甩的一手好锅。
排查五
在找GMObjC版本的过程中,发现了在GMObjC的文档里,提到了和百度 SDK 冲突的问题,提到了两种解决方式:
- 升级三方 sdk 到openssl版本1.1.1以上的版本;这个方法放弃了,且不说百度有没有新版 SDK,升级后需要验证功能和修改兼容,时间成本太高。
- 改
GMObjC
为动态库,改为动态库后,就不会有冲突了。
然后紧接着说到用Carthage
集成GMObjC
,这种方式集成的就是动态库,所以试试把Pod
集成的GMObjC
改为Carthage
集成。按照GMObjC提供的方法,再加上SDK 里限制的版本,集成。
1 | # Install carthage |
然后再次编译运行,就可以看到初始化成功了。。。如下图: