pod install で「Can’t merge user_target_xcconfig for pod targets」が出たときの対処方法

iOS

以下のドキュメント見ながら、手元のアプリでGoogle AdMob メディエーションの広告SDKを追加する作業をしていました。

しかし、いくつか追加していくと「pod install」実行時に以下のエラーが出るようになってしました。

[!] Can’t merge user_target_xcconfig for pod targets: [“Ads-Global”, “APM”, “BUAdSDK”, “BURelyAdSDK”, “Dep_Accurate”, “AFNetworking”, “BURelyFoundation”, “Foundation”, “Gecko”, “NETWork”, “Pangle”, “SDWebImage”, “YYModel”, “ZFPlayer”, “Zip”, “FBAudienceNetwork”, “ImobileSdkAds”, “NendSDK_iOS”]. Singular build setting EXCLUDED_ARCHS[sdk=iphonesimulator*] has different values.

このエラーで結構ハマったのですが、調査して対処方法を見つけたのでメモを残しておこうと思います。

何が原因でエラーが出ているのか?

まず、何が起きてるのか、原因を追ってみました。

「user_target_xcconfig をマージできない」と言っているので、各 targets の podspec の内容を確認してみます。

podspac は以下のリポジトリにあります。通常は pod 初期化時に ~/.cocoapods に clone されているものですね。

GitHub - CocoaPods/Specs: The CocoaPods Master Repo
The CocoaPods Master Repo. Contribute to CocoaPods/Specs development by creating an account on GitHub.

Specs/tree/master/Specs を見ると分かるのですが、各パスに [0-9a-f]/[0-9a-f]/[0-9a-f]/ のプレフィックスが付いていてちょっと探しづらいです。

Ads-Global など各広告SDKのファイルがどこにあるかは、以下のように clone 済みのディレクトリで find すると確認できます。

(git grep とかだと他から参照している箇所が大量に出てくるので探しづらいです)

$ (cd ~/.cocoapods/repos/master && find . -type d -name "Ads-Global")
./Specs/d/1/c/Ads-Global

user_target_xcconfig の定義内容は各広告SDKそれぞれ以下のようでした。

Ads-Global

Specs/d/1/c/Ads-Global/4.7.0.6/Ads-Global.podspec.json#L66-L68

"user_target_xcconfig": {
  "EXCLUDED_ARCHS[sdk=iphonesimulator*]": "arm64"
},

NendSDK_iOS

Specs/6/1/d/NendSDK_iOS/7.4.0/NendSDK_iOS.podspec.json#L34-L36

"user_target_xcconfig": {
  "EXCLUDED_ARCHS[sdk=iphonesimulator*]": "arm64 i386"
},

ImobileSdkAds

Specs/2/6/d/ImobileSdkAds/2.2.0/ImobileSdkAds.podspec.json#L33-L35

"user_target_xcconfig": {
  "EXCLUDED_ARCHS[sdk=iphonesimulator*]": "arm64"
}

FBAudienceNetwork

Specs/2/1/5/FBAudienceNetwork/6.12.0/FBAudienceNetwork.podspec.json#L48-L50

"user_target_xcconfig": {
  "EXCLUDED_ARCHS[sdk=iphonesimulator*]": "i386"
},

これらを見る限り、i386 を指定している NendSDK_iOS と FBAudienceNetwork が悪そうです。

回避策について調査

とりあえずググって色々調べると以下などが見つかりました。

Xcode12.4 Can't merge user_target_xcconfig for pod targets
I have been trying to update Pods, however, I get this warning every time I run pod update. Here are the Excluded Architectures of the Project and Pods respect...
Xcode building for iOS Simulator, but linking in an object file built for iOS, for architecture 'arm64'
I am trying to get a large (and working on Xcode 11!) project building in Xcode 12 (beta 5) to prepare for iOS 14. The codebase was previously in Objective-C, b...

しかし、これらで紹介されている以下のコードを適用しても解消しませんでした。

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end

自分のやり方が間違ってるのでしょうか??

上記のコードを貼り付ける場所を色々試行錯誤してみたのですが解消できず、上記の方法は諦めました。

原因はSDKを提供している広告ソース側

そもそも前述の通り、他の広告SDKと競合する記述になっている podspec がバグってるのが原因だと思いますが、何故こんなことになっているかというと広告ソース側が直してくれないということのようです。

google-admob-ads-sdk のグループでも同様の話題が出ています。

CocoaPods "user_target_xcconfig" merge conflict

GoogleMobileAdsMediationIronSource と GoogleMobileAdsMediationFacebook で競合して

[!] Can’t merge user_target_xcconfig for pod targets: [“FBAudienceNetwork”, “IronSourceSDK”]. Singular build setting EXCLUDED_ARCHS[sdk=iphonesimulator*] has different values.

のエラーが出ているとのことです。

2021/09/03 の投稿で、Googleから各ネットワークに連絡して修正するよう依頼するというような話が出ています。

しかし 2022/11/22 時点の最新版でも修正されていないということは、Facebook や Nend が直してくれていないということになりますね。

残念な気分になりますね…。

あまり使われていないということなのでしょうか?

「Can’t merge user_target_xcconfig for pod targets」の回避方法

そんなわけで、Podfile で管理していると他の広告SDKと競合しているから pod install のエラーは回避できないという状態です。

じゃあどうすればよいのか。

pod install でエラーが発生するということなので、Podfile管理から外して手動でSDK入れてしまえばよいわけですね。

今回のケースだと、Podfileから以下を削除します。

pod 'GoogleMobileAdsMediationNend'
pod 'GoogleMobileAdsMediationFacebook'

そして、以下のリンクから Nend_iOS、FBAudienceNetwork のSDKをDLして手動で組み込みました。

Nend_iOS

FBAudienceNetwork

手動でSDKを入れたら解決しました。

Podfile 管理じゃないのでバージョンアップのときに多少面倒ですが、サクッと削除して新しいバージョンをポチッとDLしてきてバーッっとzip展開してガーッとXcodeに突っ込めばよいだけではあるので、それほど大変ではないかと思います。実際、作業してみた結果は思ってたより楽でした。

おそらく「Can’t merge user_target_xcconfig for pod targets」が出ないようにする対応のほうが大変なのではないでしょうか。

まとめ

というわけで、「Can’t merge user_target_xcconfig for pod targets」の解決方法というか回避方法を紹介しました。

Podfile での管理をやめて手動でSDKを入れるようにすれば解決です。

Podfile は便利ですが、ちゃんとメンテナンスしてくれない広告ソースのせいでビルド通らなくなるのは悲しいですね…。

同じエラーで困っている方の助けになれば幸いです。

コメント

タイトルとURLをコピーしました