Unity

Unity Cloud BuildでiOSビルドすると「Invalid bitcode version」エラーが出る

Unity
記事内に商品プロモーションを含む場合があります

こちらの記事を参考に Unity Cloud Build でiOSビルドするフローを作っていました。

ビルドを実行したら以下のエラー。Unityバージョンは2020.3.18f1です

could not reparse object file in bitcode bundle: 'Invalid bitcode version (Producer: '1205.0.22.9.0_0' Reader: '1200.0.32.29_0')', using libLTO version 'LLVM version 12.0.0, (clang-1200.0.32.29)' for architecture arm64

こちらの対処法をメモ書きで残しておきます。

Link frameworks statically をONにする

(2022/1/17追記)この記事を書いた後にフレームワークを追加したところ別のエラーが出たので再調査したら、設定を変更するだけでbitcodeのエラーも解消しました。

Assets > External Dependency Manager > iOS Resolver > Settings より「Link frameworks statically」のチェックをONにします。

Link frameworks staticallyをONにする

ExternalDependencyManagerを利用していて同様のエラーに遭遇した場合は、こちらの対応を行えば以降のbitcode問題については気にしなくても大丈夫だと思います。

bitcodeとは

bitcodeってなんぞ…ということで引用

bitcodeとはコンパイル済みのプログラムにおける中間表現のことで、bitcode込みでAppStoreConnectにuploadすることでAppStoreConnect上でcompile、linkが可能となる。
こうすることで、Appleは将来アプリの新しいversionをApp Storeに提出することなくアプリのバイナリを最適化できるようになります。
ただし、bitcodeに対応するにはアプリのメインのコードだけでなく、依存するframeworkなどもbitcode対応する必要があります。
iOSの場合、bitcode対応は任意で、watchOSやtvOSの場合は必須です。
引用元:dSYM/bitcodeについて

なるほど便利そう、bitcode。

今回はFirebaseとAdMobのSDKを利用しているので、要するにいずれかのframeworkがCloudBuildで使われたXcodeバージョン(12.4)に対応していなくてエラーを吐いていたようです。

ここで「ん…?手元のMacではXcode12.4でiOSビルド通ってるぞ」と思って混乱したのですが、手元ではiPhoneをUSB接続して実行していたのでエラーが出ていないだけでした。Archiveを実行したら同じエラーが出ました。

エラーのこの部分のうち、Producerの方を見れば必要なXcodeのバージョンがわかります。

Producer: '1205.0.22.9.0_0' Reader: '1200.0.32.29_0'

このままではXcodeとの対応が謎ですが、対応リストを作ってくれている方がいました。感謝!

1205.0.22.9はXcode12.5であることが判明。

CloudBuildではXcode12.5が使えない

ここで問題発生。CloudBuildではまだXcode12.5が使えません。

使えるMacOSがCatalinaで、BigSurに対応していないということでしょう。

ここまではCloudBuildいいじゃんと思いながら作業していたのですが、最新環境に対応できないのは自分で構築するビルド環境と比べてデメリットですね…。

SDKのバージョンを下げれば解消しそうですが、ビルドが通るバージョンを探るのも面倒なので…。

今回は「開発時(もしくはCloudBuildがXcode12.5に対応するまで)はbitcodeを無効化してビルド、リリース用アプリは手元のMacでビルド」することにしました。

Unityでbitcodeを無効化する方法

手元でビルドする場合はXcode上にて手動で変更できますが、CloudBuildではXcodeビルドの前に実行するスクリプトが必要です。

以前はUnityのBuildSettingsから変更できたようですが、現在は項目が消えています。

Xcodeプロジェクトの設定は「PostProcessBuild」属性を使ってビルド後の処理を追加することで変更できます。

通常はPBXProjectクラス経由でこちらの方法を使って設定しますが、bitcodeについてはこれでOFFにしてもプロジェクト全体ではOFFにならず結局ビルドが通りませんでした。

それならばと、ゴリ押しですがテキストベースで全てOFFにしました。

これで無事にビルド成功!