白黒羊

Unity Cloud Build での XXXXX requires CocoaPods version >= x.y.z エラーに対応する

AdMobをアップデートしてUnity Cloud Build でビルドすると

[!] `GoogleAppMeasurement` requires CocoaPods version `>= 1.10.2`, which is not satisfied by your current version, `1.10.0`.

このエラーが出ました。
ローカルでのCocoaPodsはsudo権限などを使ってアップデートして対応します。

前にこの記事を書きましたが、実際にはMacならばHomebrewを使ってアップデートするのが良さそうです。

しかし、Unity Cloud Buildなどの環境ではもちろんCocoaPodsをアップデートすることはできません。

同じような状況で困っている人を見つけました。

Error satisfying GoogleUtilities_MethodSwizzler dependency. · Issue #1845 · firebase_firebase-ios-sdk

このスレッドを見ると、workaroundとしてPodfileでバージョンを指定するのが良いと書いてありました。

GoogleMobileAdsDependencies.xml で、以下のようにGoogleAppMeasurementのバージョンを指定してやります。

  <iosPods>
    <iosPod name="GoogleAppMeasurement" version="8.7">
      <sources>
        <source>https://github.com/CocoaPods/Specs</source>
      </sources>
    </iosPod>
    <iosPod name="Google-Mobile-Ads-SDK" version="~> 8.8">
      <sources>
        <source>https://github.com/CocoaPods/Specs</source>
      </sources>
    </iosPod>
  </iosPods>
</dependencies>

この 8.7 というバージョンはこのCocoaPodsのSpecsを見て判断しています。

Specs_GoogleAppMeasurement.podspec.json at master · CocoaPods_Specs

{
  "authors": "Google, Inc.",
  "cocoapods_version": ">= 1.10.0",
  "default_subspecs": "AdIdSupport",
  "dependencies": {

このGitHub内で Google-Mobile-Ads-SDK8.8が依存するGoogleAppMeasurementのバージョンが8.7でも大丈夫なことも確認します。

これでCocoaPodsのバージョンが問題になることはなくなりました。

ただXCodeのバージョンが最新ではない都合で(今後更新の予定は出ていますが)、次はBitcodeのエラーが出てきます。

96: ❌;  ld: could not reparse object file in bitcode bundle: 'Invalid bitcode version (Producer: '1205.0.22.11.0_0' Reader: '1200.0.32.29_0')', using libLTO version 'LLVM version 12.0.0, (clang-1200.0.32.29)' for architecture arm64
97: ❌;  clang: error: linker command failed with exit code 1 (use -v to see invocation)

下記の記事を参考にEnable BitcodeをNoにしてみることにしました。

すでにPBXProjectは使っていたので、こんな感じの関数を作って、 [PostProcessBuild] アトリビュートのついた関数から呼び出しています。

読み出しとか書き出しの処理も必要なので、このためだけにPBXProjectを触るという方は上記のないちさんのページを参照してください。

private static void DisableBitCode(PBXProject pbx)
{
#if UNITY_CLOUD_BUILD
    var manifest = Resources.Load<UnityEngine.CloudBuild.BuildManifestObject>("UnityCloudBuildManifest.scriptable");
    var version = manifest.GetValue("xcodeVersion", "0.0.0");
    if (version == "12.5.0") return;
#endif
    var target = pbx.GetUnityFrameworkTargetGuid();
    pbx.SetBuildProperty(target, "ENABLE_BITCODE", "NO");
}

XCodeのバージョンが12.5.0ではないときにだけENABLE_BITCODENOにすると設定してみました。

本当はAdMobが要求するXCodeのバージョンと一致しないときにENABLE_BITCODENOにしたかったのですが、それを取得する方法が見つからなかったので、12.5.0とハードコーディングしています……。
将来的に13.0.0になったときとかに困ると思うのでそのうち直します。

なおこちらのUnityCloudBuildManifest情報の取得は、RyotaMurohoshiさんの記事を参考にしています。

BuildManifestでUnity Cloud Buildのビルド情報を上手に管理しよう! – Qiita

Unity – Manual_ Build manifest

Unity – Manual_ Build manifest as ScriptableObject

公式のマニュアルのサンプルの書き方がちょっとわかりづらいのですが(下に書いてあるAPIと引数の数が一致していない)、サンプル通りに設定してうまく動かすことができました。

【2021/10/16 追記】こちらに公式情報が出ていました。Unity Dash boardにサインインした状態でなら以下のリンクからmanifestに関する詳細情報を得られます。

https://dashboard.unity3d.com/app/develop/support/guides/manifest/

これでもダメなときは.unitypackageに含まれるunity-plugin-library.aではなく、Release pageにあるzipからAssets/Plugins/iOS/GADU… ファイルを全てプロジェクト内に持ってくる必要もあるかもしれません。

そこまで全部やってようやくビルドが通りました。長かった……。