MacなしでFlutterのiOSアプリをビルドして公開する
FlutterはWindowsでもLinuxでもよく動きます。ただし、iOSが必要になるまでの話です。PCでは、FlutterはiOSのビルドコマンドを表示すらしません。その工程にはmacOSが必要です。レンタルのMacか、CIのrunnerを使います。当社は2026年10月19日に、Flutter 3.47.7とXcode 26.6で全体の流れを実行しました。
WindowsとLinuxでできること
Dartのコード、ウィジェットのテスト、Androidのビルドは、すべてPCで動きます。当社のテストでは、作成したばかりのアプリが、GitHubのWindows Server 2025とUbuntu 24.04のrunnerでflutter testに通りました。Ubuntuのジョブでは、デバッグ用のAndroid APKもビルドできました。Androidエミュレータでのホットリロードも同じように動きます。
次に、両方のマシンでiOSのビルドを試しました。FlutterはmacOS以外のシステムでは、iOSのコマンドを隠します。どちらのrunnerも同じ行を出力しました。
Could not find a subcommand named "ios" for "flutter build".
ビルドのターゲットとして表示されたのは、apk、appbundle、web、そしてホストのデスクトップです。iosとipaはありませんでした。
macOSが必要なもの
- flutter build iosとflutter build ipa。Flutterのリリースガイドには、Xcodeが必要で、macOSが動くデバイスを使う必要があると書かれています。
- ネイティブのパッケージ。Flutter 3.44からは、プラグインはSwift Package Managerで入ります。まだ対応していないプラグインには、FlutterはCocoaPodsを使います。どちらもXcodeのビルドの中で動きます。
- iOSシミュレータ。Xcodeに付属しているので、Macでしか動きません。選択肢についてはWindowsでiOSシミュレータをご覧ください。
- 署名とアップロード。証明書とプロファイルは、Macで作成して使います。
レンタルのMacにFlutterを入れる
MacRunのMacには、Xcode 27.1とiOS 27.1のシミュレータが入っています。Xcode 26.6もインストール済みです。Flutterは入っていないので、自分で追加します。管理者権限とHomebrewが使えます。当社のテストでは、次のコマンド1つで、1分もかからずにFlutter 3.47.7が入りました。
brew install --cask flutter flutter --version
Flutterのドキュメントでは、ダウンロードする方法を使っています。macOS用のファイルを~/developなどのフォルダに展開し、~/.zprofileに次の行を追加します。
export PATH="$HOME/develop/flutter/bin:$PATH"
次は、FlutterのiOSページにあるXcodeの設定です。Xcodeを選び、初回起動の処理を実行し、ライセンスを表示します。そのあと、iOSのプラットフォームとシミュレータのランタイムを確認します。
sudo sh -c 'xcode-select -s /Applications/Xcode-27.1.app/Contents/Developer && xcodebuild -runFirstLaunch' sudo xcodebuild -license xcodebuild -downloadPlatform iOS flutter doctor -v
MacRunのMacでは、Xcode 27.1は/Applications/Xcode-27.1.appにあり、すでに選択されています。Xcode 26.6は/Applications/Xcode.appにあります。ほかのMacでは、ls -d /Applications/Xcode*.appが表示するパスを使ってください。当社のrunnerでは、flutter doctorはXcodeに緑のチェックを付け、CocoaPods 1.17.0を見つけました。Androidのライセンスについて警告が出ましたが、iOSには関係ありません。
ビルドしてシミュレータで動かす
リポジトリをクローンし、flutter pub getを実行して、シミュレータ向けにビルドします。当社のテストでは、アプリにプラグインが1つ、shared_preferencesが入っていました。Podsフォルダはできなかったので、FlutterはSwift Package Managerを使ったことになります。
flutter build ios --simulator xcrun simctl list devices available xcrun simctl boot "iPhone Duo" xcrun simctl install booted build/ios/iphonesimulator/Runner.app xcrun simctl launch booted com.example.demo
デバイス名は一覧から選び、バンドルIDは自分のものを使ってください。MacRunでは、iOS 27.1のランタイムにiPhone Duoのデバイスがあります。画面共有を使えば、起動したシミュレータでflutter runを実行して、ホットリロードもできます。WindowsからはWindowsからXcodeの手順で、Macの画面を表示します。
GitHub Actionsで実行したワークフロー
これは当社のテストのmacOSジョブです。アプリを作り、プラグインを追加し、シミュレータ向けにビルドします。そのあとアプリをインストールして開き、署名なしでリリースをビルドしてアーカイブします。
name: flutter-guide
on: workflow_dispatch
jobs:
macos:
runs-on: macos-26
steps:
- uses: subosito/flutter-action@v2
with:
channel: stable
cache: true
- run: xcodebuild -version && sw_vers
- run: flutter doctor -v
- run: flutter create demo
- run: flutter pub add shared_preferences
working-directory: demo
- name: Simulator build
run: time flutter build ios --simulator
working-directory: demo
- name: Install and launch in the Simulator
run: |
xcrun simctl list devices available | grep -i iphone | head -5
UDID=$(xcrun simctl list devices available -j | python3 -c "import json,sys; d=json.load(sys.stdin)['devices']; print(next(x['udid'] for k,v in d.items() if 'iOS' in k for x in v if x['name'].startswith('iPhone')))")
echo "UDID=$UDID"
xcrun simctl boot "$UDID"
xcrun simctl bootstatus "$UDID"
xcrun simctl install booted build/ios/iphonesimulator/Runner.app
xcrun simctl launch booted com.example.demo
sleep 10
xcrun simctl io booted screenshot shot.png
ls -la shot.png
working-directory: demo
- name: Release build, no signing
run: time flutter build ios --release --no-codesign
working-directory: demo
- name: Archive, no signing
run: time flutter build ipa --no-codesign
working-directory: demoジョブ全体は5分39秒でした。次の行はそのログからの抜粋です。
[✓] Xcode - develop for iOS and macOS (Xcode 26.6) [5.9s] ✓ Built build/ios/iphonesimulator/Runner.app com.example.demo: 14546 ✓ Built build/ios/iphoneos/Runner.app (14.6MB) ✓ Built build/ios/archive/Runner.xcarchive (170.4MB) Codesigning disabled with --no-codesign, skipping IPA.
シミュレータ向けのビルドは48秒でした。リリースビルドは1分14秒、アーカイブは45秒です。大事なのは最後の行です。署名がないと、Flutterはアーカイブで止まります。本物の.ipaには、AppleのチームIDが必要です。
TestFlightに出す
Apple Developer Programが必要です。年間99 USDです。App Store Connectで、どのブラウザからでもアプリを作成できます。Macでは、ios/Runner.xcworkspaceをXcodeで一度開きます。Signing and Capabilitiesでチームを選びます。そのあと.ipaをビルドします。
flutter build ipa --build-name 1.0.0 --build-number 2
Flutterはアーカイブをbuild/ios/archiveに、.ipaをbuild/ios/ipaに書き出します。Transporterでアップロードするか、App Store Connect APIキーを使って、Flutterのドキュメントにある次の行でアップロードします。
xcrun altool --upload-app --type ios -f build/ios/ipa/*.ipa \ --apiKey your_api_key --apiIssuer your_issuer_id
当社のテストにはAppleのアカウントがなかったので、署名の工程はCIで実行できませんでした。この手順はFlutterのリリースガイドによるものです。自分のiPhoneでテストするには、TestFlightからビルドをインストールします。リモートのMacからは、PCにつないだスマートフォンは見えません。APIキーと審査については公開ガイドをご覧ください。
この用途でMacを借りるべきでない人
.ipaだけが必要なら、クラウドビルドで足りるかもしれません。Flutterのリリースガイドには、Codemagicの節があります。Codemagicの個人アカウントには、macOSのビルド時間が毎月500分、無料で含まれます。GitHub ActionsのmacOS runnerなら、上のワークフローを分単位の課金で実行できます。何年も毎週リリースするなら、中古のMac miniのほうが長い目で見て安くなることもあります。
アプリを目で見る必要があるときは、レンタルのMacが向いています。シミュレータ、Xcodeの署名画面、デバッガでのクラッシュの調査などです。MacRunの1日パスは、専用のM6 Mac miniが$15で、1週間は$59です。支払いは1回だけで、自動更新はありません。期間が終わるとMacのデータは消去されるので、先にコードをpushし、.ipaを保存してください。
よくある質問
FlutterはWindowsでiOSをビルドできますか?
+
できません。WindowsとLinuxでは、Flutterはflutter build iosもflutter build ipaもまったく表示しません。Flutterのリリースガイドには、macOSが動くデバイスを使う必要があると書かれています。その工程は、レンタルのMacかmacOSのCI runnerでまかなえます。
WindowsからFlutterアプリをiOSシミュレータで動かせますか?
+
Windowsの上では動きません。シミュレータはXcodeに付属しているからです。リモートのMacでビルドし、そのシミュレータを画面共有で見ることはできます。当社はmacOSのrunnerで、xcrun simctlを使ってFlutterアプリをインストールし、起動しました。
FlutterのiOSビルドには今もCocoaPodsが必要ですか?
+
必要な場面は減りました。Flutter 3.44からは、iOSではSwift Package Managerが標準でオンです。まだ対応していないプラグインには、FlutterはCocoaPodsを使います。Flutterによると、CocoaPodsのレジストリは2026年12月2日に読み取り専用になります。
署名なしでFlutterの.ipaをビルドできますか?
+
署名なしでもアーカイブはできます。当社のテストでは、flutter build ipa --no-codesignで170.4 MBの.xcarchiveができ、そのあとIPAはスキップすると表示されました。TestFlight用の本物の.ipaには、Apple Developerのチームが必要です。
MacでのFlutterのiOSビルドには、どのくらい時間がかかりますか?
+
GitHubのmacos-26 runnerでは、プラグインが1つの新しいアプリのシミュレータ向けビルドが48秒でした。署名なしのリリースビルドは1分14秒です。大きなアプリでは、もっと時間がかかります。
MacRunのMacにはFlutterが入っていますか?
+
入っていません。Xcode 27.1、Xcode 26.6、iOS 27.1のシミュレータがインストール済みです。管理者権限とHomebrewが使えます。当社のテストでは、brew install --cask flutterは1分かかりませんでした。