今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

MapManagerSDKの統合記録

背景#

最近、MapManagerSDK を統合しましたが、いくつかの問題が発生しましたので、ここに記録しておきます:

問題 1:

連携ドキュメントで指示された GMObjC アルゴリズム SDK のインポート方法は次のとおりですが、インポート後にコンパイルエラーが発生し、次のようなメッセージが表示されます:"sm2_plaintext_size" Too many arguments to function call, expected 3, have 4

pod 'GMObjC','3.0.0'

問題 2:

MapManagerをインポートした後、QMUI ライブラリや他のサードパーティライブラリが正常に動作していたものが、エラーが発生してコンパイルできなくなりました。

問題 3:

上記の問題はすべて解決し、コンパイルは成功しましたが、起動するとすぐにクラッシュします。

解決方法:#

問題 1 の"sm2_plaintext_size" Too many arguments to function call, expected 3, have 4は非常に簡単に解決できます。pod 'GMObjC'に変更し、最新バージョンをインストールするだけです。

問題 2 については、確認したところ、エラーが発生している箇所は、プロパティやメソッドで debug または release を使用して変数を定義していることがわかりました。しかし、以前は問題がなかったのに、MapManagerSDK をインポートした後にエラーが発生するのはなぜでしょうか?注意深く調査した結果、MapManagerSDK のMapService.hクラスに次のコードがあることがわかりました:


#define debug @"debug"
#define release @"release"

プレフィックスの区別がないままマクロが定義されているため、プロジェクト内の他の箇所で debug または release を使用するとエラーが発生します。そのため、次のようにコードを変更することで解決できます。注意:サードパーティ SDK をラップする場合、外部で使用する必要があるマクロについては、必ず処理を行ってください。


#define kDebugStr @"debug"
#define kReleaseStr @"release"

最後に、問題 3 ですが、上記の問題をすべて解決した後、コンパイルは成功しましたが、実行するとメモリリークが発生します。長い間調査しましたが、何か依存ライブラリがインポートされていないのかと思いましたが、チュートリアルと比較しても、サードパーティライブラリが不足しているわけではありませんでした。その後、GMObjCGithubを確認したところ、次のような記述がありました:

GMObjC は OpenSSL 1.1.1 以降に依存しています。CocoaPods は同じ静的ライブラリの異なるバージョンをサポートしていません。たとえば、Baidu MapKit はより低いバージョンの OpenSSL 静的ライブラリに依存しているため、依存関係の競合が発生します。

つまり、GMObjCは OpenSSL に依存しており、一部のサードパーティ SDK も依存している可能性があり、競合が発生する可能性があります。例えば、百度地図 SDK などです。偶然にも私のプロジェクトには百度地図がありますが、これが問題の原因ではないかと思いました。通常、競合の表現はコンパイルエラーですが、念のためにGMObjCを Pod から Carthage に変更してみました。コンパイルと実行を行った結果、問題が解決しました。。。。やはり百度地図との競合でした、大変でした。。。

その後、MapManagerを再度統合する際に問題 2 も修正することを忘れずに。。。。コンパイルと実行を行うと、正常に動作します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。