Flutter: iOSシミュレーターでReleaseビルドしたら「No such module 'Flutter'
」のエラー(実機では問題なし)
結論:iOSシミュレーターはDebugモードでビルドする(仕方なく...)
2023/1/3 Flutter エラー・バグ日記
Xcodeの「Edit Scheme」をReleaseビルドに設定した状態で、iOSシミュレーターでビルドしたところ、下図のようなエラーになった。
実機では発生しないが、iOSシミュレーターでビルドすると発生する。
最初は、「No such module 'Flutter'
」だったが、その後、後述する様々な試行錯誤をしたときには、「Module 'XXXX' not found
」のエラーに変わった(「XXXX」は特定のパッケージ名)。
とにかく、必要なモジュールが見つからない、ということらしい。
実行環境は、以下のとおり。
- MacBook Pro(Intelプロセッサ)
- macOS Monterey 12.6
- Xcode 14.0
- Flutter 3.3.4 channel stable
定番の対応は効果なし
まずは、Xcodeのビルドエラーで試す下記定番の対応
- flutter clean → pub get → pod install
- Podfile.lock削除 → flutter clean → pub get → pod install
--repo-update
- Podfile冒頭の「
platform :ios, '番号'
」の行のコメントアウト(#)を外し、番号を上げる('14'
など)
をやってみるも、エラーは変わらず。
「No such module 'Flutter'
」で調べてヒットした下記スレッドにおいても、上記定番の対応が回答されているが、自分のケースでは解消できなかった。。
「Runner.xcworkspace」を開くも、変わらず
続けて調べた下記の記事
には、「Runner.xcodeproj」ではなく、「Runner.xcworkspace」を開くとモジュールが読み込まれる、との情報があったので、試してみるも、エラーは変わらなかった。
「Flutter.xcframework」を作る方法も効果なし
下記記事では、「Flutter.xcframework」が存在していないことが原因であり、これを生成してXcodeの「Build Setting」→「Framework Search Paths」に紐付けると解消した、と報告されていた。
こちらのFlutter公式サイトにも説明があるが、「FlutterモジュールをiOSプロジェクトに統合する」という作業らしい。
やや大掛かりなので憚られたが、思い切って試したところ、結局エラーは変わらなかった。
ただ、エラーメッセージは、「Module 'XXXX' not found
」に変わり、使用している特定のパッケージ名が表示されるようになった。
※なお、Releaseビルドを使っていたので、「Flutter.xcframework」作成のコマンドは、上記記事に書かれている
flutter build ios-framework --no-debug --no-profile --release --output=Flutter
の方を採用した。
Debugモードでビルドすると解消する
前述の記事内容を見て、ビルドのモードが原因かもしれないと気づいた。
こちらの日記に記載した経緯から、Xcodeの「Product」→「Scheme」→「Edit Scheme」で、ビルドモードを「Debug」から「Release」に変更していた。
そこで、Debugビルドに戻してみたところ、エラーが解消され、ビルドできるようになった。
再度、Releaseモードでビルドすると、別のエラーが発生
リリース時の挙動を確認するには、Releaseモードでもビルドできた方が良いため、改めてReleaseモードでビルドしてみると、今度は「Build Succeeded」が表示され、ビルドが成功した。
どうやら、一旦Debugモードでビルドしておけば、Releaseモードでもビルドは成功するらしい。
しかし、アプリが起動する前に、
iPhone 14 Pro cannot run Runner.
Runner's architectures (arm64) include none that iPhone 14 Pro can execute (Intel 64-bit).
というダイアログが表示されてしまい、結局アプリを起動できなかった。
アーキテクチャーであるarm64に関連した問題らしい。。Intel製のMacを使っているためだろうか。。
Xcodeの「Excluded Architectures」に「arm64」を追記するも解消せず
「arm64」関連で調べていくと、以下の記事群が見つかった。
いずれの記事でも、概ね以下の対応で解消すると報告されていた。
- ① 導入ライブラリ(パッケージ)を最新に更新する
- ② Xcodeの「Excluded Architectures」に「arm64」を追加する(後述の図参照)
- ③ Xcodeの「User-Defined」から「VALID_ARCHS」を削除する(後述の図参照)
- ④ Podfileに、iOSシミュレータのarm64を除外する設定を追記する
結論としては、残念ながら、上記①〜④いずれをやってもエラーは解消しなかった。
①は、最新版に更新してもエラーは変わらず。
②は、下図のとおり「arm64」を加えてみたが、
今度は、
error build: Command PhaseScriptExecution failed with a nonzero exit code
というエラーが出て、ビルドできず。。
③は、そもそも下図のとおり、「User-Defined」に「VALID_ARCHS」が無く、削除できず。。
④は、上記参考記事に沿って設定を追記するも、上記②と同じエラーになった。
iOSシミュレーターは、Debugモードでビルドすることに...
上記の他にも、Xcode内で、気になる箇所の設定を様々変更してみるも、エラーは解消できず。。
各記事を見ていると、どうやらAppleシリコンのMac登場により、iOSシミュレーターの仕様(使用するアーキテクチャー?)が変わったことが影響している模様。。
かなり時間を費やしてしまったが、、iOSシミュレーターは、実機の場合と異なり、Xcodeとの接続を切っても、Debugビルドでインストールしたアプリを起動できるため、Debugビルドを使用することで我慢することにする。
\一般的なエラー対処法をまとめた記事はこちら/
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/