背景#
最近集成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
集成回來,記得問題二還要修改。。。。編譯運行,就可以了。