ガイド

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分かかりませんでした。

関連ガイド