実機では動くのにシミュレータだけは動かない
Xcode12からはVALID_ARCHSが非推奨となり、Architecturesが$(ARCHS_STANDARD)となりました。
これは”armアーキテクチャ”で”x86_64アーキテクチャ”のシミュレータにビルドしようとしていることが原因になります。そんな設定変更した覚えがないのに、ね。Xcode12ではこれがデフォルトなのです。
おそらくM1チップ macなら問題ないので、Appleの姿勢が強く出てます。
新しいBuild Setting項目 “Excluded architectures”
従来はビルド時にVALID_ARCHSが指定されているので、有効なアーキテクチャでビルドを行うことができました。
Xcode12以降でVALID_ARCHSが廃止されARCHS_STANDARDに変わりました。そして標準のアーキテクチャはarmです。
何も設定をしなければarmアーキテクチャでビルドを行うようなっているのです。そして、新たにExcluded architecturesが追加され、ビルド対象に応じてアーキテクチャの除外設定をするための設定が追加されています。
以下のようにしてAny iOS Simulator SDKにarm64を追加することで、シミュレータへのビルド時にはarm64,arm64eのアーキテクチャが除外されて、x86_64アーキテクチャのバイナリが生成されるという仕組みになっているようです。
あと、User-DefinedにVALID_ARCHSがある場合は、削除が必要です。
CocoaPodsでライブラリを入れていると更に混乱する
突然あらわれる”No such module ‘XXXXX’
うそだろ、さっきまで参照できてたんだぜ。何なら今でも実機なら参照できるんだぜ。
これも、原因は同じです。一番簡単なのはPodfileに以下の記述を追加することです。
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
end
end
end
一番最後にでも追記して、それからpod installを行います。
Xcodeでワークスペースを開いて、Podsのプロジェクトを見ると以下のような設定が追加されています。
これで、シミュレータに対してビルドを行うことができます。
おそらく最初にこの問題に遭遇するとどこから手を付けてよいかわからず混乱んするかと思います。順序としては
- 本体のプロジェクトにExcluded Architecturesを追加する
- User-DefinedにVALID_ARCHSがあれば削除する
- CocoaPodsのPodfile記述に追記する、または手動でExcluded Architecturesを追加する。
となります。
Xcodeのビルドエラー内容はこの問題に対してあまり当てにはならないので、実機ビルドが出来るのであれば、あとは本問題だけが残っているということになるので、落ち着いて切り分けして対応をしていきましょう。
Carthageだとどうなるか
すんません、調べてません…