FlutterアプリをXcodeでビルドしてArchiveを作成する際にハマったこと

2023.02.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部 Delivery部の若槻です。

今回は、FlutterアプリをXcodeでビルドしてArchiveを作成する際にいくつかハマった箇所があったので紹介します。

ビルドしたいアプリ

次のエントリでFlutterを利用して開発したiOSアプリをTestFlightで検証するために、App Store Connectにアップロードしようとしました。

開発はVS Codeで行い、アプリのビルドおよびiOS Simulatorでの実行は問題なく行えていました。

$ flutter devices
5 connected devices:

iPhone 14 Pro (mobile)       • 303EE434-DF48-40EF-B58C-AF4B6778F1B4 • ios            • com.apple.CoreSimulator.SimRuntime.iOS-16-1 (simulator)
iPhone 14 Pro Max (mobile)   • 2CA618C6-E1DF-42E2-B555-541EE8A289B3 • ios            • com.apple.CoreSimulator.SimRuntime.iOS-16-1 (simulator)
iPhone 14 Pro Max 2 (mobile) • 2922EF27-FB61-4D23-B640-053CDFE46AC4 • ios            • com.apple.CoreSimulator.SimRuntime.iOS-16-1 (simulator)
macOS (desktop)              • macos                                • darwin-arm64   • macOS 12.6 21G115 darwin-arm

$ flutter run -d 303EE434-DF48-40EF-B58C-AF4B6778F1B4 --dart-define=USERNAME=John
$ flutter run -d 2CA618C6-E1DF-42E2-B555-541EE8A289B3 --dart-define=USERNAME=Risa
$ flutter run -d 2922EF27-FB61-4D23-B640-053CDFE46AC4 --dart-define=USERNAME=Tanaka

事象1:Archiveボタンが無効になっている

アプリのソースコードをXcodeで開き、Archiveをしようとしたのですが、[Archive]メニューが無効になっており選択できなくなっています。

解決

Runnerで選択されている端末をiOS Simulatorからそれ以外のデバイスに変更します。

すると[Archive]メニューを有効にすることができました。

参考:provisioning - Xcode Product -> Archive disabled - Stack Overflow

事象2:Archiveでビルドエラーになる

アプリのソースコードをXcodeで開く際にRunner.xcodeprojを選択して開きました。

するとdevice_info_plusというパッケージが見つからずエラーとなっていました。VS Codeで開発している際はこのようなエラーは出ていませんでした。

Xcodeを少し触っているとエラーは消えました。何なんでしょうね。App Store Connectにアップロードするためにアプリのアーカイブを開始します。この時にソースコードのビルドが行われます。

しかしビルドエラーによりArchive Failとなってしまいました。

解決

ソースコードをXcodeで開く際にRunner.xcworkspaceを選択して開くきます。(先程はRunner.xcodeprojでした)

すると、Archive実行時にビルドエラーが発生しなくなり、アーカイブを作ることができました。

参考:「Module 'xxx' not found」の対処法まとめ【Flutter】 - Qiita

どういうことなのか

.xcodeprojが単一のプロジェクトを対象にしているのに対して、.xcworkspaceは複数のProjectを束ねることができる。クロスプラットフォームアプリを構築できるFlutterはiOS、Android、Webのそれぞれのソースに対して単一の依存関係を使用するため、.xcworkspaceを使う必要があった、と考えられる。

参考:【Xcode】xcodeprojとxcworkspaceの違いについて本気出して考えてみた - Qiita

参考

以上