背景#
最近集成MapManager
SDK,遇到了几个问题这里记录一下:
问题一:
对接文档中提示的导入 GMObjC 算法 SDK 方式如下,导入后编译不通过,提示:"sm2_plaintext_size" Too many arguments to function call, expected 3, have 4
pod 'GMObjC','3.0.0'
问题二:
导入MapManager
后,QMUI 库或者其他第三方库,原本正常的,现在报错编译不通过。
问题三:
上面都解决了,编译成功,一启动就崩溃。
解决:#
问题一"sm2_plaintext_size" Too many arguments to function call, expected 3, have 4
的解决很简单,改为pod 'GMObjC'
,安装最新版即可。
问题二,查看后,发现报错的地方是属性或者方法中使用了 debug 或者 release 定义变量。但是为什么之前没有问题,导入MapManager
SDK 后,就报错了呢?仔细排查后发现,在MapManager
SDK 中MapService.h
类,有如下代码:
#define debug @"debug"
#define release @"release"
定义的宏没有前缀区分,导致项目中其他使用到 debug 或 release 的地方都会报错。所以这里修改为如下代码,就可解决。Ps:封装第三方 SDK 时,对于定义的宏,如果必须要暴露外部使用的,一定要处理。
#define kDebugStr @"debug"
#define kReleaseStr @"release"
最后,问题三,上面的问题都解决后,编译成功,一运行就崩溃,提示有内存泄漏。排查了好久,刚开始以为是有什么依赖库没有导入;但是对比教程后,并没有少导入三方库。再后来以为是MapManager
有问题,于是把MapManager
移除,只留GMObjC
发现还是一运行就崩溃。所以去查看GMObjC
的Github,发现有这么一段话:
GMObjC relies on OpenSSL 1.1.1 and above. CocoaPods does not support different versions of the same static library. If you encounter OpenSSL conflicts with third-party libraries, for example, Baidu MapKit depends on a lower version of the OpenSSL static library, a dependency conflict will occur.
意思是,GMObjC
依赖了 OpenSSL,可能某些三方 SDK 也依赖了,会产生冲突,比如:百度地图 SDK。恰好我的项目中就有百度地图,会不会是这个问题,虽然一般来说冲突的表现是,编译报错;但万一呢,于是把GMObjC
从 Pod 方式改为使用 Carthage 导入,编译运行发现好了。。。。果然是和百度地图冲突了,好坑。。。
然后再把MapManager
集成回来,记得问题二还要修改。。。。编译运行,就可以了。