FlutterのiOSビルドができない
Flutterのアプリ開発を行っている大学3回生です。
普段はUbuntuでVSCode + Android Studioで開発しているのですが,慣れないMacbookとXCodeでiOSアプリのビルド&アップロードが必要になり,様々な苦労をしたのでシェアします。
XCodeでプロジェクトディレクトリを開く方法がわからない
GitHubからリポジトリをクローンしてきたものの,XCodeで開くこともできず…。
問題
XCodeでリポジトリのルートディレクトリを選択するも,開けない。
原因
VSCodeやAndroid Studioでプロジェクトを開く際は,ルートディレクトリを直接開いて作業することが多いですが,XCodeでFlutterアプリのプロジェクトを開くには,<root_dir>/ios/Runner.xcworkspace
というファイルを選択して開く必要があるようです。なお,Runner.xcodeproj
を選択してしまうとまた別の問題が発生するようですのでご注意を (参考サイト)
解決策
<root_dir>/ios/Runner.xcworkspace
を指定して開く。
参考サイト
iOS Simulatorによるデバッグを試みるもビルド失敗
リリースビルドの前に,まずはシミュレータによるデバッグが成功するかどうか調べようとして,XCodeのプロジェクトナビゲータ(左側のバー)で▶ボタンを押し,デバッグを試みたものの……
問題
次のようなエラーが発生しました。
error: unable to parse contents of file list ‘/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-input-files.xcfilelist’
原因
このエラーについて調査した結果,CocoaPodsがインストールされていないことが原因と判明しました。CocoaPodsとは,iOS/Macアプリ開発用のパッケージ管理ツールだそうです。
解決策
CocoaPodsをインストールすることによって解決できました。今回私が躓いた原因は「そもそもインストールされていない」ということでしたが,「古いバージョンを使用している」場合にも同様の方法により解決が期待できるようです。
sudo gem install cocoapods
CocoaPodsをインストールした後は,実際にビルドする前に以下のコマンドも実行する必要があります。
cd ios # ルートディレクトリ直下のiosディレクトリへ移動
pod install
pod install
を実行した後でXCode上でRunした時に"Generated.xcconfigというファイルが見つからない"というエラーが出た場合は,先にルートディレクトリでflutter pub get
を実行してから再度pod install
を実行してみてください。
参考: Flutter iOSのシミュレーターで実行エラーになるときの対処法の章「pod install成功 → Xcodeで依然エラー」
参考サイト
ちなみに調査時にはこちらのページも見ていたのですが,今回はこちらの方法では解決できませんでした。
https://qiita.com/kogepan159/items/eade1c9d3049b0d9a4d9
XCodeでビルドエラーの詳細がどこに書かれているかわからない
先程のCocoaPods絡みのエラーを解決したところで,改めてXCodeからデバッグを試みたところ…
問題
表示されたエラーメッセージはこのようなものでした。
Command PhaseScriptExecution failed with a nonzero exit code
あまりに不親切ですね。とはいえ,どこかにエラー詳細を読む方法があるはずです。
解決策
Report Navigatorと呼ばれる場所(デフォルトで左側にあるバー)からエラーログを読みに行くことができました。詳細は以下の記事をご覧ください。
xcode_backend.sh: no such file or directory.
エラー
先程の投稿でビルドエラーの詳細を調査できるようになりました。そこで該当エラー出力を読みに行ったところ…
問題
以下のようなエラー文が出力されていました。
xcode_backend.sh: no such file or directory.
原因
ビルド時にFlutter SDKの所在を知るためFLUTTER_ROOT
という環境変数が参照されるが,そのFLUTTER_ROOT
が設定されていなかった。
解決策
~/.zshrc
に環境変数FLUTTER_ROOT
として,Flutter SDKのパス(flutter doctor
で調べられます!)を設定する。今回は~/.zshrc
に書き込んでいますが,状況に応じて.zprofile
や.bashrc
等に書き込んでください。
export FLUTTER_ROOT="(SDKの展開先)"
参考サイト
flutter build ios
コマンドが失敗する
色々調べて,リリースビルドのためにはflutter build ios --release
を実行してから,XCode内で"Product"=>"Archive"を実行すれば良いらしいと判明し,flutter build ios --release
を実行したところ…
問題
以下のようなエラーが出ました。
Cannot find "xcodebuild". Xcode 13.0 or greater is required to develop for iOS.
原因
間違いなくXCodeは入っているので,どうやらFlutter SDK側にXCodeが認識されていないようです。
実際flutter doctor
を実行したところ,iOS toolchain
の章にXCode installation is incomplete
と書かれていました。
解決策
flutter doctor
を実行した際のXCode installation is incomplete
のすぐ下に,Once installed, run
から次の文が書かれていました。
Once installed, run:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
すなわち,以下のコマンドを実行することで解決です。
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
参考サイト
2回目以降のリリースについて
参考サイト:
M1 Macでcocoapodsがエラーを吐く
症状: VSCodeからFlutterアプリケーションをiOS Simulatorでデバッグしようとしたらエラーで止まり、以下のように出てきた。そしてエラーメッセージに従いsudo gem uninstall ffi && sudo gem install ffi -- --enable-libffi-alloc
を実行したのだが、それでも状況は変わらなかった。
Error: To set up CocoaPods for ARM macOS, run:
sudo gem uninstall ffi && sudo gem install ffi -- --enable-libffi-alloc
Error running pod install
Error launching application on iPhone 15 Pro Max.
Exited
以下のStackoverflow記事を参考にいろいろやっていこうとしたのだが、結局これ
arch -arm64 brew install cocoapods
だけで済んでしまった。ターミナルの"Rossetta"モードによる起動などもしていないが…
また同じような問題に遭遇したら、詳しく調べようと思う。
ちなみに問題の調査中に、原因として「システムデフォルトのRubyではなくrbenvを使用して入れたRubyを使用している場合に問題が起きる」というように説明する記事を見つけた気がするのだが、リンクを忘れてしまった。
Unable to find bundled Java version
flutter doctorを実行した際に表示されていたもの。
こちらの記事を参考に次のコマンドで解決。
cd /Applications/Android Studio.app/Contents
ln -s jbr jre
※こちらの環境では、上記記事の回答リストのはじめの方にある以下のコマンドでは解決しなかった。理由は、最初のcdコマンドの行き先のjre
というディレクトリがそもそも存在していなかったから。
cd /Applications/Android\ Studio.app/Contents/jre
ln -s ../jre jdk
ln -s "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin" jdk
flutter doctor -v
Linker command failed with exit code 1
このエラーが発生したときには、DerivedDataの削除をするといいらしい
(この記事では他にも、Reveal in Logの確認、Enable Bitcodeの項目をいじるなど、試したことが書いてあって良い)
ただし、上記記事で紹介されていたsudo rm -rf ~/Library/Developer/Xcode/DerivedData/*
はpermission deniedで失敗してしまった。
もう少し調べてみると、XCode→上部メニュー[Product]→Clean Build Folder でDerivedDataの削除ができるみたい。
そもそものXCodeの使い方のところから。どうやったらエラー詳細見れるねん問題。困ったら Reveal in Log を開く。
その他の方法
まだ試してないけど。
XCode の設定解説
XCodeのプロジェクト設定を解説してくれるページ。
直接FlutterのiOSビルドに関連するわけではないが、知ってて損はない内容なので、ちゃんと頭に入れておこうと思う。