Guia

Faça o build e publique um app Flutter para iOS sem Mac

O Flutter funciona bem no Windows e no Linux, até você precisar do iOS. Em um PC, o Flutter nem oferece o comando de build para iOS. Você precisa do macOS nessa etapa, em um Mac alugado ou em um runner de CI. Fizemos o caminho completo em 19 de outubro de 2026, com Flutter 3.47.7 e Xcode 26.6.

O que funciona no Windows e no Linux

Seu código Dart, os testes de widget e os builds Android funcionam em um PC. No nosso teste, um app novo passou no flutter test nos runners Windows Server 2025 e Ubuntu 24.04 do GitHub. O job do Ubuntu também gerou um APK Android de debug. O hot reload em um emulador Android funciona do mesmo jeito.

Depois pedimos um build iOS às duas máquinas. O Flutter esconde os comandos de iOS em qualquer sistema que não seja macOS. Os dois runners mostraram a mesma linha:

Could not find a subcommand named "ios" for "flutter build".

A lista de alvos de build trazia apk, appbundle, web e o alvo de desktop do sistema. Não havia ios nem ipa.

O que precisa do macOS

  • flutter build ios e flutter build ipa. O guia de release do Flutter diz que o Xcode é obrigatório e que você precisa usar um aparelho com macOS.
  • Pacotes nativos. Desde o Flutter 3.44, os plugins entram pelo Swift Package Manager. O Flutter volta ao CocoaPods para plugins que ainda não têm suporte. Os dois rodam dentro do build do Xcode.
  • O Simulador do iOS. Ele vem com o Xcode, então só roda em um Mac. Veja o Simulador do iOS no Windows para conhecer as opções.
  • Assinatura e upload. Certificados e perfis são criados e usados no Mac.

Configure o Flutter em um Mac alugado

Um Mac da MacRun vem com Xcode 27.1 e o simulador do iOS 27.1. O Xcode 26.6 também está instalado. O Flutter não vem pré-instalado, então você mesmo instala. Você tem direitos de administrador e Homebrew. Este único comando funcionou no nosso teste e instalou o Flutter 3.47.7 em menos de um minuto:

brew install --cask flutter
flutter --version

A documentação do Flutter usa um download. Você descompacta o pacote para macOS em uma pasta como ~/develop e depois adiciona esta linha ao ~/.zprofile:

export PATH="$HOME/develop/flutter/bin:$PATH"

Em seguida vem a configuração do Xcode da página de iOS do Flutter. Ela seleciona o Xcode, roda as tarefas de primeira abertura e mostra a licença. Depois confere a plataforma iOS e os runtimes do simulador:

sudo sh -c 'xcode-select -s /Applications/Xcode-27.1.app/Contents/Developer && xcodebuild -runFirstLaunch'
sudo xcodebuild -license
xcodebuild -downloadPlatform iOS
flutter doctor -v

Em um Mac da MacRun, o Xcode 27.1 fica em /Applications/Xcode-27.1.app e já está selecionado. O Xcode 26.6 fica em /Applications/Xcode.app. Em outro Mac, use o caminho que ls -d /Applications/Xcode*.app mostrar. No nosso runner, o flutter doctor deu um check verde para o Xcode e encontrou o CocoaPods 1.17.0. Ele apontou as licenças do Android, que não importam para o iOS.

Faça o build e rode no Simulador

Clone seu repositório, rode flutter pub get e faça o build para o Simulador. No nosso teste, o app tinha um plugin, shared_preferences. Nenhuma pasta Pods apareceu, então o Flutter usou o 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

Use um nome de aparelho da lista e o seu próprio bundle ID. Na MacRun, o runtime do iOS 27.1 traz o aparelho iPhone Duo. Pelo compartilhamento de tela, você também pode usar flutter run com um simulador ligado para ter hot reload. A partir do Windows, siga Xcode a partir do Windows para ver a tela do Mac.

O fluxo que rodamos no GitHub Actions

Este é o job de macOS do nosso teste. Ele cria um app, adiciona um plugin e faz o build para o Simulador. Depois instala e abre o app, e gera e arquiva um build de release sem assinatura.

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

O job inteiro levou 5 minutos e 39 segundos. Estas linhas vêm do log dele:

[✓] 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.

O build para o Simulador levou 48 segundos. O build de release levou 1 minuto e 14 segundos, e o archive 45 segundos. A última linha é importante. Sem assinatura, o Flutter para no archive. Um .ipa de verdade precisa do seu time da Apple.

Envie para o TestFlight

Você precisa do Apple Developer Program, que custa 99 USD por ano. Crie o app no App Store Connect em qualquer navegador. No Mac, abra ios/Runner.xcworkspace no Xcode uma vez. Escolha seu time em Signing and Capabilities. Depois gere o .ipa:

flutter build ipa --build-name 1.0.0 --build-number 2

O Flutter grava o archive em build/ios/archive e o .ipa em build/ios/ipa. Envie com o Transporter, ou com esta linha da documentação do Flutter e uma chave de API do App Store Connect:

xcrun altool --upload-app --type ios -f build/ios/ipa/*.ipa \
  --apiKey your_api_key --apiIssuer your_issuer_id

Não conseguimos rodar as etapas assinadas no CI, porque nosso teste não tinha conta Apple. Elas vêm do guia de release do Flutter. Para testar no seu próprio iPhone, instale o build pelo TestFlight. Um Mac remoto não enxerga um celular ligado ao seu PC. Nosso guia de publicação explica as chaves de API e a revisão.

Quem não deve alugar um Mac para isso

Se você só precisa de um .ipa, um build na nuvem pode bastar. O guia de release do Flutter tem uma seção sobre o Codemagic. As contas pessoais do Codemagic incluem 500 minutos de build em macOS por mês, de graça. Um runner macOS do GitHub Actions roda o fluxo acima, cobrado por minuto. Se você publica toda semana por anos, um Mac mini usado pode sair mais barato com o tempo.

Um Mac alugado faz sentido quando você precisa ver o app. Isso quer dizer o Simulador, as telas de assinatura do Xcode ou um crash no depurador. Um passe diário da MacRun custa $15 por um Mac mini M6 dedicado, e uma semana custa $59. Você paga uma vez e nada se renova. O Mac é apagado no final, então envie seu código e salve seu .ipa antes.

Perguntas frequentes

O Flutter consegue fazer build de iOS no Windows?

+

Não. No Windows e no Linux, o Flutter nem oferece flutter build ios ou flutter build ipa. O guia de release do Flutter diz que você precisa usar um aparelho com macOS. Um Mac alugado ou um runner de CI com macOS cobre essa etapa.

Posso rodar meu app Flutter no Simulador do iOS a partir do Windows?

+

Não no próprio Windows, porque o Simulador vem com o Xcode. Você pode fazer o build em um Mac remoto e ver o Simulador dele pelo compartilhamento de tela. Instalamos e abrimos um app Flutter com xcrun simctl em um runner macOS.

O Flutter ainda precisa do CocoaPods para iOS?

+

Com menos frequência. Desde o Flutter 3.44, o Swift Package Manager vem ligado por padrão no iOS. O Flutter volta ao CocoaPods para plugins que ainda não têm suporte. O Flutter diz que o registro do CocoaPods vira somente leitura em 2 de dezembro de 2026.

Posso gerar um .ipa do Flutter sem assinatura?

+

Você pode arquivar sem assinatura. No nosso teste, flutter build ipa --no-codesign gerou um .xcarchive de 170.4 MB e depois avisou que ia pular o IPA. Um .ipa de verdade para o TestFlight precisa do seu time do Apple Developer.

Quanto tempo leva um build iOS do Flutter em um Mac?

+

No runner macos-26 do GitHub, um build para o Simulador de um app novo com um plugin levou 48 segundos. Um build de release sem assinatura levou 1 minuto e 14 segundos. Apps maiores levam mais tempo.

O Flutter vem instalado em um Mac da MacRun?

+

Não. O Xcode 27.1, o Xcode 26.6 e o simulador do iOS 27.1 estão instalados. Você tem direitos de administrador e Homebrew, e brew install --cask flutter levou menos de um minuto no nosso teste.

Guias relacionados