Publique um app de iOS na App Store sem ter um Mac
Você pode publicar um app de iOS sem ter um Mac. Mas não pode fazer isso sem o macOS. O build e a assinatura do app precisam do Xcode. Quase todo o resto acontece em um navegador ou no seu iPhone. Um Mac alugado ou um runner de CI cobre a única etapa que precisa do macOS.
O que a Apple exige em outubro de 2026
- Uma assinatura paga. O Apple Developer Program custa 99 USD por ano de assinatura, segundo a página de inscrição da Apple. Organizações sem fins lucrativos, escolas e órgãos públicos podem pedir isenção da taxa.
- Um Xcode recente. Desde 28 de abril de 2026, os envios precisam ser feitos com Xcode 26 ou mais recente e um SDK do iOS 26. Isso está na página de próximos requisitos da Apple.
- Um macOS recente. O Xcode 26.6 precisa do macOS Tahoe 26.2 ou mais recente, segundo os requisitos de sistema do Xcode da Apple.
Então o build acontece em um Mac. A única pergunta é de quem é o Mac.
O que você pode fazer no Windows ou no Linux
- Inscrever-se no programa pela web ou pelo app Apple Developer.
- Criar o registro do app no App Store Connect.
- Criar uma chave de API do App Store Connect (passos abaixo).
- Adicionar testadores, escrever a página da loja e enviar para revisão.
- Enviar um build pronto. A ferramenta de linha de comando Transporter da Apple funciona no Windows 11 e no Red Hat Enterprise Linux. Nesses sistemas, ela precisa do AppStoreInfo.plist que o Xcode gera na exportação. Então o envio pode rodar no seu PC, mas o arquivo ainda vem de um Mac.
Crie uma chave de API primeiro
Uma chave de API deixa as ferramentas no Mac falarem com a Apple. Não é preciso senha nem confirmação de dois fatores. Os passos da Apple para uma chave de equipe:
- No App Store Connect, abra Users and Access (Usuários e Acesso) e depois Integrations.
- Escolha App Store Connect API e depois a aba Team Keys.
- Clique em Generate API Key, dê um nome, escolha uma função e gere a chave.
- Baixe o arquivo .p8. A Apple deixa baixar uma única vez.
Você precisa da função Admin para criar chaves de equipe. Anote o Key ID e o Issuer ID que aparecem nessa página. Mantenha o .p8 fora do seu repositório.
Assinatura sem um keychain seu
A assinatura precisa de um certificado de distribuição e de um perfil de provisionamento. Há dois jeitos de ter os dois em um Mac alugado.
Assinatura automática. O xcodebuild aceita a chave de API. Com a opção allowProvisioningUpdates, o texto de ajuda dele diz que ele cria e atualiza perfis, app IDs e certificados para alvos com assinatura automática. A Apple também oferece certificados de distribuição gerenciados na nuvem. A Apple guarda esses certificados, então nenhuma chave privada fica na máquina alugada.
Assinatura manual. Crie uma solicitação de assinatura de certificado com o Acesso às Chaves no Mac alugado. Depois crie um certificado Apple Distribution e um perfil App Store em Certificates, Identifiers and Profiles. Apague o keychain antes de devolver o Mac.
Build e envio a partir do Mac na nuvem
Gere o archive do app. Troque os nomes, o key ID e o issuer ID pelos seus.
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp \ -configuration Release -destination 'generic/platform=iOS' \ -archivePath build/MyApp.xcarchive archive \ -allowProvisioningUpdates \ -authenticationKeyPath ~/private_keys/AuthKey_ABC123DEF4.p8 \ -authenticationKeyID ABC123DEF4 \ -authenticationKeyIssuerID YOUR-ISSUER-ID
Depois exporte. Com destination definido como upload, a exportação manda o build direto para o App Store Connect. O nome de método app-store-connect substituiu o antigo valor app-store.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>method</key><string>app-store-connect</string> <key>destination</key><string>upload</string> <key>signingStyle</key><string>automatic</string> <key>teamID</key><string>YOURTEAMID</string> </dict> </plist>
xcodebuild -exportArchive -archivePath build/MyApp.xcarchive \ -exportOptionsPlist ExportOptions.plist -exportPath build/export \ -allowProvisioningUpdates \ -authenticationKeyPath ~/private_keys/AuthKey_ABC123DEF4.p8 \ -authenticationKeyID ABC123DEF4 \ -authenticationKeyIssuerID YOUR-ISSUER-ID
Prefere uma etapa de envio separada? Defina destination como export e use o altool. Ele encontra o arquivo da chave em ~/private_keys pelo ID.
xcrun altool --upload-package build/export/MyApp.ipa \ --api-key ABC123DEF4 --api-issuer YOUR-ISSUER-ID
Quem usa fastlane pode fazer o mesmo com duas ações da documentação dele: app_store_connect_api_key carrega a chave, e pilot envia para o TestFlight.
Conferimos cada opção acima com a saída de ajuda do xcodebuild e do altool no Xcode 26.6. Não rodamos um envio assinado com estas linhas exatas. A configuração de assinatura do seu projeto decide os detalhes.
Números de versão e de build
A Apple associa cada envio ao seu app pelo bundle ID e pelo número de versão. O texto do build identifica cada build, então ele precisa ser único. Aumente o número do build a cada envio. No CI, o número da execução é uma boa fonte para ele. Use o número de versão para o que os usuários veem na loja.
TestFlight no seu iPhone
A Apple processa cada envio e manda um e-mail quando ele está pronto. Depois o resto acontece no App Store Connect e no celular. Segundo a visão geral do TestFlight da Apple:
- Até 100 testadores internos da sua equipe no App Store Connect.
- Até 10.000 testadores externos por e-mail ou link público.
- O primeiro build para testadores externos passa pela App Review.
- Cada build pode ser testado por até 90 dias.
Os testadores instalam o app gratuito TestFlight e aceitam o convite. Você não precisa de um Mac para nada disso. Os screenshots da loja são fáceis de tirar no Simulador do Mac alugado.
Um dia basta para uma versão
A maioria das etapas acima acontece uma vez só. Você cria a chave de API, configura a assinatura, gera o archive e envia. Se você publica algumas vezes por ano, não precisa de um Mac todo mês. Precisa de um no dia da publicação.
Um passe diário da MacRun dá a você um Mac mini M6 dedicado com Xcode 27.1 por 24 horas, por $15. Uma semana custa $59, o que deixa tempo para o TestFlight e para uma correção depois da revisão. Você paga uma vez. Nada se renova, e o Mac é apagado quando o tempo acaba. Copie os seus arquivos de assinatura antes disso.
Quem não deve alugar um Mac para isso
No Expo, o EAS Build e o EAS Submit fazem o build e o envio na nuvem do Expo. Se você publica duas vezes por ano, um runner de CI hospedado custa centavos por build. Leia CI/CD de iOS com GitHub Actions para essa configuração. A MacRun não oferece assinatura de código gerenciada. Os certificados e as chaves são seus.
Um Mac alugado serve quando você publica com frequência. Também serve quando você precisa da tela do Xcode para corrigir a assinatura à mão. Para uma versão, um dia ou uma semana basta. Os nossos planos M6 estão na página de preços.
Perguntas frequentes
Dá para publicar um app de iOS sem Mac?
+
Sim, se você conseguir acessar um macOS em algum lugar. O build e a assinatura precisam do Xcode em um Mac, que pode ser alugado ou na nuvem. A inscrição, o App Store Connect, o TestFlight e a revisão funcionam pelo navegador ou pelo iPhone.
Posso enviar um .ipa para o App Store Connect pelo Windows?
+
A ferramenta de linha de comando Transporter da Apple funciona no Windows 11 e no Red Hat Enterprise Linux. Nesses sistemas, ela precisa do AppStoreInfo.plist que o Xcode exporta com o build. Então o .ipa ainda precisa ser gerado em um Mac.
Qual Xcode preciso para enviar em 2026?
+
Desde 28 de abril de 2026, a Apple exige que os apps enviados ao App Store Connect sejam compilados com Xcode 26 ou mais recente, usando um SDK do iOS 26. O Xcode 26.6 roda no macOS Tahoe 26.2 ou mais recente.
Quanto custa publicar na App Store?
+
O Apple Developer Program custa 99 USD por ano de assinatura. Existem isenções da taxa para organizações sem fins lucrativos, escolas e órgãos públicos elegíveis. O tempo de Mac para o build é à parte, de centavos por build em CI hospedado a $15 pelo aluguel de um Mac por um dia.