Open12

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を指定して開く。

参考サイト

https://dev.classmethod.jp/articles/ios-app-development-beginners-dont-know-how-to-open-a-project-in-xcode/

やまやま

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://www.yukiiworks.com/archives/375

ちなみに調査時にはこちらのページも見ていたのですが,今回はこちらの方法では解決できませんでした。
https://qiita.com/kogepan159/items/eade1c9d3049b0d9a4d9

やまやま

XCodeでビルドエラーの詳細がどこに書かれているかわからない

先程のCocoaPods絡みのエラーを解決したところで,改めてXCodeからデバッグを試みたところ…

問題

表示されたエラーメッセージはこのようなものでした。

Command PhaseScriptExecution failed with a nonzero exit code

あまりに不親切ですね。とはいえ,どこかにエラー詳細を読む方法があるはずです。

解決策

Report Navigatorと呼ばれる場所(デフォルトで左側にあるバー)からエラーログを読みに行くことができました。詳細は以下の記事をご覧ください。
https://zenn.dev/yu1ro/articles/5ce0a946e876e1

やまやま

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等に書き込んでください。

~/.zshrcに追記
export FLUTTER_ROOT="(SDKの展開先)"

参考サイト

https://stackoverflow.com/questions/56844012/xcode-backend-sh-no-such-file-or-directory-do-i-need-to-create-this-file
https://qiita.com/macneko/items/b0c2da4270d1f99ccdda

やまやま

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

参考サイト

https://stackoverflow.com/questions/52470137/flutter-build-ios-on-root-of-my-flutter-app-does-not-work

やまやま

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"モードによる起動などもしていないが…
また同じような問題に遭遇したら、詳しく調べようと思う。

https://stackoverflow.com/questions/65445365/cocoapods-installation-fails-on-macbook-pro-m1-apple-silicon-mac

ちなみに問題の調査中に、原因として「システムデフォルトのRubyではなくrbenvを使用して入れたRubyを使用している場合に問題が起きる」というように説明する記事を見つけた気がするのだが、リンクを忘れてしまった。

やまやま

Unable to find bundled Java version

flutter doctorを実行した際に表示されていたもの。

こちらの記事を参考に次のコマンドで解決。

cd /Applications/Android Studio.app/Contents
ln -s jbr jre

https://stackoverflow.com/questions/68569430/unable-to-find-bundled-java-version-with-flutter-doctor-after-updating-android

※こちらの環境では、上記記事の回答リストのはじめの方にある以下のコマンドでは解決しなかった。理由は、最初の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の項目をいじるなど、試したことが書いてあって良い)
https://qiita.com/buntafujikawa/items/f670e4e8b43737f1aee2

ただし、上記記事で紹介されていたsudo rm -rf ~/Library/Developer/Xcode/DerivedData/*はpermission deniedで失敗してしまった。
もう少し調べてみると、XCode→上部メニュー[Product]→Clean Build Folder でDerivedDataの削除ができるみたい。
https://dev.classmethod.jp/articles/remove-xcode-derived-data/

そもそものXCodeの使い方のところから。どうやったらエラー詳細見れるねん問題。困ったら Reveal in Log を開く。
https://qiita.com/aframeworks-blog/items/db45373e1ccb3c32fae3

やまやま

XCode の設定解説

XCodeのプロジェクト設定を解説してくれるページ。
直接FlutterのiOSビルドに関連するわけではないが、知ってて損はない内容なので、ちゃんと頭に入れておこうと思う。

https://note.com/navitime_tech/n/n01d34465db40