M1 MacはIntel Macとアーキテクチャが異なるので、FrameworkのバイナリがどのアーキテクチャでビルドされたかによってiPhone Simulatorでビルドできないことがある。

CocoaPodsもCarthageもSwiftPMも基本的にはローカルにrepositoryをCheckoutを行い、ビルドをするため、ビルドしたマシンのアーキテクチャに依存する。

しかし、vendored frameworkのようなソースコードを公開しておらず、ビルド済みバイナリの配布を行うものは、x86_64, i386アーキテクチャのみが含まれているバイナリが落ちてくることがある。

Macアプリには、App Storeで配布されているネイティブコードで書かれたUniversalバイナリと、Intel向けにビルドしたバイナリをM1で動かすためのRosetta 2で開くものの2種類ある。

どのアプリがどちらのバイナリなのかは、アプリのInfoを開くと明示してあるので確認しやすい。

Universalバイナリについては、「Open using Rosetta」にチェックをいれると、Intel環境(x86_64)で動作する。Intel環境で動作させればiPhone Simulatorもこれに追従するので、x86_64でビルドされたFrameworkを動作させることができるが、M1によって得られるパフォーマンスの向上は切り捨ててしまうことになる。

vendored frameworkをx86_64とarm両方に対応させるためには、WWDC 2019で公開されたxcframeworkという形式のフレームワークを提供するのがよい。xcframeworkはx86_64向けビルド、arm向けビルドを両方内包することができる形式である。

この形式は同時に公開されたMac Catalystに対応するための形式であったが、その時点でまさかMacがarmアーキテクチャに移行することになるとは夢にもおもわなかったはずである。

さて、現時点でxcframeworkに対応しているのはSwiftPMとCocoaPodsだけ(CocoaPodsにもarm登場当時対応していない項目はあったが、現在は修正済み)で、Carthageは対応していない。

vendored frameworkとして提供している多くの広告SDKの中で、それなりにユーザー数が多いと思われるフレームワークにFirebase Analyticsがある。M1リリース当初はiPhone Simulatorでビルドできなかったが、vendored frameworkをxcframeworkに変更し、arm向けビルドを追加したことにより、無事にビルドできるようになった。

firebase/firebase-ios-sdk

同時に、Carthageはxcframeworkに対応していないので、M1ではビルドできない旨も記載されている。CarthageのXCFramework対応の顛末については、Issueを参照されたい。

XCFrameworks are required to include the arm64 slice for iOS devices and the macOS simulator for Macs running on Apple silicon. Unfortunately, Carthage does not support XCFrameworks yet which prevents us from being able to include support. See Carthage/Carthage#2799 for progress.

Catalyst support · Issue #2799 · Carthage/Carthage

Carthageがxcframeworkに対応するまでには時間がかかるのと、SwiftPMのIPA生成時エラーがあるので(https://github.com/firebase/firebase-ios-sdk/issues/6472)、ここでは二種類のワークアラウンドを紹介する。

  1. CocoaPodsのintegrate_targetsを利用しないでビルド済みバイナリを生成する

Carthageを利用する利点として、事前にビルド済みバイナリを生成しておくことでビルド時間を短縮できることがある。しかしこれはCarthageの特権ではなく、やっていることはxcodebuildをつかってビルドしているにすぎない。同様のことはCocoaPodsを使ってでも実現することができる。