[iOS][Xcode] error: Building for iOS Simulator, but the linked framework ‘Hoge.framework’ was built for iOS.というエラーが出たときの対処法

はじめに

Xcode でビルドしようとした際にタイトルのエラーに遭遇したので対処法を書いていきます。

テストターゲットにCarthage で framework を追加しており、アプリをビルドしようとした際に遭遇しました。

前提条件

Mac: macOS Catalina 10.15.6
Xcode: Version 12.4 (12D4e)
Carthage: 0.36.0 (後半で0.37.0 以降にアップデートします)

現象

ビルド時に以下のようなエラーが出ました。

テストビルドのエラー

テキストに起こすと以下。

error: Building for iOS Simulator, but the linked framework 'Quick.framework' was built for iOS. (in target 'SampleApp02Tests' from project 'SampleApp02')

SampleApp02 というアプリなんですが、それのTestターゲットに
Quick.framework を追加した状態でのエラーです。
(このエラーメッセージはCarthage のバージョンで少し異なってくるかもしれません)

iOSシミュレータをビルドしているが、
リンクされているのはiOS用(=シミュレータ用ではない)のframeworkです、
と怒られています。

簡単な対処法(ただし根本的ではない)

Stackoverflowに回答があります

Build SettingsValidate Workspace の設定を一度 Yes にし、その後 No に変更すればOKです。
デフォルト表示は No ですが、実際の挙動はどうやら Yes (Error) となっているようです。

Yes のままでもエラーは回避できますが、ビルド時にワーニングが出ます。

ただ、この対処法は少なくとも「フレームワークの検証をしない」という状態になるため、
将来的にはビルドできなくなる可能性も出てくるのかなと思います🤔

より根本的な対処法

そもそもの原因

そもそも Validate Workspace が Yes (Error) でエラーになるのは、
フレームワークの検証で引っかかっているからのようです。

どういうことかと言うと。

Carthage 0.36.0 で作成された framework は、
その中に実機用やシミュレータ用の複数のバイナリが含まれています。
それらが1つのframework として生成されます。

これはuniversal framework もしくは、より直感的に fat framework と呼ばれています。

fat framework のイメージは以下が非常に分かりやすいと思います。
Qiita: XCFrameworksに対応したCarthageを使ってみた CarthageがIntel Mac上でどのように動いていたか

そして、Xcode12.3 からはデフォルト(つまりValidate Workspaceが Yes(Error)の状態)で
fat framework を弾くようになりました。

そのため、ビルドができなくなったようです。

ちなみにアプリのビルド時、Carthage の copy-frameworks スクリプトを実行していると思いますが、
そこでは fat framework を元に
– 実機ビルドなら実機用のみの framework を出力する
– シミュレータビルドならシミュレータ用のみの framework を出力する
という処理をしているようです。

そこで XCFramework

fat framework が弾かれるようになった。
ではどうするか。

fat framework をやめ、XCFramework を使います。

XCFramework とは何か。
イメージを掴むには、中身を見るのが手っ取り早そうです。

XCFramework の中身

このようにXCFramework の中には複数の framework が含まれています。
ios-arm64-armv7 がiOS用、ios-arm64_i386_x86_64-simulator がシミュレータ用のframework かな🤔

このXCFramework を、既存の framework の代わりにXcode に組み込むことで、
ビルド時にXcode が適切なアーキテクチャのframework を選択してリンクするようになります。

ということは先に述べた copy-frameworks スクリプトも不要になります🙌

XCFramework を使う

主流になりそうだし使った方がよさそう、ということでCarthage でXCFramework を作ります!

そのためには Carthage 0.37.0 以降が必要なので準備しましょう。

準備できたらあとは --use-xcframeworks オプションを付けて
carthage コマンドを打つだけです。

carthage update --use-xcframeworks --platform iOS

これ以降の導入手順は難しくないです。

DevelopersIO: [iOS] CarthageでもXCFrameworkが使いたい
Qiita: XCFrameworksに対応したCarthageを使ってみた CarthageでXCFrameworksをビルドする
などが参考になりそうです。

最後に

以上です。

可能ならワークアラウンド的な方法ではなく根本的な対応をすると、
今後困る可能性が減りそうですね🙌

お疲れ様でした!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。