Guia

Faça o build de um app React Native para iOS sem Mac

A maior parte do trabalho com React Native roda bem no Windows ou no Linux. O build de iOS não. O CocoaPods e o xcodebuild precisam do macOS, então você pega um Mac emprestado para essa etapa. Abaixo está um workflow do GitHub Actions que faz isso. Nós rodamos esse workflow em 2 de outubro de 2026, e ele fez o build do React Native 0.87.1 com o Xcode 26.6.

O que funciona no Windows e no Linux

Seu código JavaScript e TypeScript, o Metro e o Jest rodam em qualquer computador. No nosso teste, um app recém-criado passou no teste do Jest no runner ubuntu-24.04 do GitHub e no runner windows-2025. Os dois usaram Node 22. Você também pode compilar e rodar o app Android em qualquer um dos dois sistemas. A documentação do React Native explica a configuração do Android para Windows e para Linux.

Para iOS, a mesma documentação é direta. Nas páginas de configuração para Windows e Linux, ela diz que é preciso um Mac para compilar projetos com código nativo para iOS. A sugestão dela é o Expo Go, que roda o seu JavaScript em um iPhone de verdade durante o desenvolvimento. Isso cobre telas e lógica. Mas não gera um app que você possa publicar.

O que precisa do macOS

  • pod install. O projeto iOS baixa o React Native e as dependências nativas pelo CocoaPods. O Codegen também roda nessa etapa.
  • xcodebuild. O Xcode e o SDK do iOS só existem para macOS. A Apple pede macOS Tahoe 26.2 ou mais recente para o Xcode 26.6 na página de requisitos de sistema do Xcode.
  • O Simulador. Ele vem dentro do Xcode, então também é só para Mac.
  • Assinatura e envio. Essa parte está em como publicar um app de iOS sem Mac.

O workflow que rodamos

Ele cria um app novo com o comando do reactnative.dev. Roda os testes no Linux e no Windows. Depois faz o build de iOS em um runner macos-26. As opções do init vêm da documentação do React Native CLI. Elas escolhem o npm, pulam a pergunta sobre os pods e pulam a configuração do git. Salve em .github/workflows/rn-ios.yml e inicie pela aba Actions.

name: rn-ios
on: workflow_dispatch
jobs:
  test-linux:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-node@v7
        with:
          node-version: 22
      - run: npx @react-native-community/cli@latest init RNDemo --pm npm --install-pods false --skip-git-init true
      - run: npm test
        working-directory: RNDemo
  test-windows:
    runs-on: windows-latest
    steps:
      - uses: actions/setup-node@v7
        with:
          node-version: 22
      - run: npx @react-native-community/cli@latest init RNDemo --pm npm --install-pods false --skip-git-init true
      - run: npm test
        working-directory: RNDemo
  build-ios:
    runs-on: macos-26
    steps:
      - uses: actions/setup-node@v7
        with:
          node-version: 22
      - run: sudo xcode-select -s /Applications/Xcode_26.6.app
      - run: xcodebuild -version && node -v && ruby -v
      - run: npx @react-native-community/cli@latest init RNDemo --pm npm --install-pods false --skip-git-init true
      - run: node -p "require('react-native/package.json').version"
        working-directory: RNDemo
      - run: bundle install
        working-directory: RNDemo/ios
      - run: bundle exec pod install
        working-directory: RNDemo/ios
      - name: Build for the iOS Simulator (Debug)
        run: |
          xcodebuild -workspace RNDemo.xcworkspace -scheme RNDemo \
            -configuration Debug -sdk iphonesimulator \
            -destination 'generic/platform=iOS Simulator' \
            -derivedDataPath build build
        working-directory: RNDemo/ios
      - name: Build for the iOS Simulator (Release, JS bundled)
        run: |
          xcodebuild -workspace RNDemo.xcworkspace -scheme RNDemo \
            -configuration Release -sdk iphonesimulator \
            -destination 'generic/platform=iOS Simulator' \
            -derivedDataPath build build
        working-directory: RNDemo/ios
      - run: ls -la build/Build/Products/Release-iphonesimulator/RNDemo.app/main.jsbundle && du -sh build/Build/Products/*-iphonesimulator/RNDemo.app
        working-directory: RNDemo/ios

No seu próprio repositório, troque a etapa de init por um checkout do seu código e uma instalação dos pacotes. O resto continua igual. Troque RNDemo pelo nome do seu workspace e do seu scheme.

O que a execução mostrou

Estas linhas foram copiadas do log do job build-ios. O job inteiro do macOS levou 2 minutos e 42 segundos.

Xcode 26.6
Build version 17F113
v22.23.2
0.87.1
Pod install took 43 [s] to run
Pod installation complete! There are 87 dependencies from the Podfile and 86 total pods installed.
** BUILD SUCCEEDED **
Welcome to Metro v0.87.1
** BUILD SUCCEEDED **
-rw-r--r--  1 runner  staff  1268567 Oct  2 04:02 build/Build/Products/Release-iphonesimulator/RNDemo.app/main.jsbundle
154M	build/Build/Products/Debug-iphonesimulator/RNDemo.app
 38M	build/Build/Products/Release-iphonesimulator/RNDemo.app

O build Debug levou cerca de 39 segundos e o build Release cerca de 35. É rápido porque o React Native 0.87 baixa um núcleo já compilado. O log do pod install diz isso com todas as letras. Versões mais antigas compilam muito mais código nativo, então espere builds mais longos nelas.

Por que compilar duas vezes? Um app Debug carrega o JavaScript do Metro enquanto roda. O build Release empacota o JavaScript dentro do app como main.jsbundle, aqui com 1,27 MB. Se o build Release passa, o seu bundle e o seu código nativo compilam.

Rode em todo pull request

O workflow acima é iniciado à mão. Para pegar problemas de iOS antes do merge, mude a linha do gatilho para rodar também em pull requests:

on:
  pull_request:
  workflow_dispatch:

Quando um build falha, o log é longo. O nosso passou de 18.000 linhas para dois builds pequenos. Procure no log por "error:" e leia o primeiro resultado. Os erros seguintes muitas vezes são efeitos do primeiro. Se o pod install falhar, olhe primeiro o Podfile e as suas dependências nativas.

Quanto custa

O GitHub cobra cada job arredondado para cima ao minuto. O nosso job de macOS deu 3 minutos. A $0.062 por minuto, a tarifa da referência de preços de runners do GitHub em outubro de 2026, isso dá cerca de 19 centavos. Repositórios públicos não pagam nada pelos runners padrão. Para alguns builds por semana, este é o jeito mais barato de ter um build de iOS.

No Expo, há outro caminho. O EAS Build compila o iOS na nuvem do Expo. O plano Free inclui 15 builds de iOS por mês em uma fila de baixa prioridade. Depois disso, um build médio de iOS custa $2, segundo expo.dev/pricing em outubro de 2026.

Onde o CI deixa de bastar

Um job de CI prova que o app compila. Ele não mostra o app. Um build para o simulador só roda no Simulador do iOS, que precisa da tela de um Mac. Quando um módulo nativo quebra só no iOS, você quer o Xcode aberto. Você quer breakpoints e um Simulador onde possa clicar. Para isso, veja como usar o Xcode no Windows com um Mac remoto.

O runner hospedado também começa vazio toda vez. Cada execução baixa de novo os pacotes do Node, as gems e os pods. Na nossa execução, o job de macOS também trouxe um aviso do GitHub. Ele dizia que jobs de macOS arm64 podem ficar mais tempo na fila por falta de capacidade.

Quem não deve alugar um Mac para isso

Se você faz alguns builds por semana, fique nos runners hospedados ou no EAS. Um Mac dedicado compensa a partir de cerca de 2,242 minutos de macOS por mês na tarifa básica do GitHub. Ele também compensa quando você precisa da tela. Se nenhuma das duas coisas vale para você, um Mac alugado é dinheiro que você não precisa gastar.

Se você passar dessa linha, o mesmo workflow roda em um runner de macOS auto-hospedado. Mude o runs-on e aponte o xcode-select para o seu Xcode. Os pods e os derived data ficam prontos entre as execuções. Veja os preços dos planos M6.

Se você só precisa da tela por um dia, para caçar um bug de iOS no Xcode, um passe diário custa $15. Você paga uma vez e nada se renova.

Perguntas frequentes

Posso fazer o build de um app React Native para iOS no Windows?

+

Você pode escrever e testar no Windows, mas o build de iOS precisa do macOS. A documentação do React Native diz que é preciso um Mac para compilar projetos com código nativo para iOS. Um Mac na nuvem ou um runner de CI cobre essa etapa.

Posso rodar o Simulador do iOS no Windows?

+

Não. O Simulador vem com o Xcode, que só roda no macOS. Você pode ver o Simulador de um Mac remoto por uma área de trabalho remota, ou usar o Expo Go em um iPhone de verdade durante o desenvolvimento.

Quanto tempo leva um build de iOS com React Native no GitHub Actions?

+

Na nossa execução de outubro de 2026, um app novo com React Native 0.87.1 levou 2 minutos e 42 segundos no job inteiro de macOS. Isso incluiu o pod install e dois builds para o simulador, um Debug e um Release. Apps maiores levam mais tempo.

Preciso de uma conta Apple Developer para compilar para o Simulador?

+

Não. O nosso workflow compilou para o Simulador sem nenhuma assinatura. Você precisa do Apple Developer Program pago para assinar o app para um aparelho, para o TestFlight ou para a App Store.

Guias relacionados