Seu build iOS foi rejeitado. Corrija e envie de novo sem Mac
A Apple mandou um e-mail, ou o seu upload falhou, e você não tem Mac. Primeiro veja se a correção precisa mesmo de um novo build. Algumas não precisam. Para as que precisam, esta página traz a correção e os comandos para arquivar, exportar e enviar de novo em um dia.
Isso precisa de um novo build?
Nem todo problema exige um novo build. Estas correções são feitas no App Store Connect, em qualquer navegador:
- Screenshots, a descrição e outros textos da página do produto.
- Respostas de export compliance para um build marcado como Missing Compliance.
- Suas respostas de App Privacy no App Store Connect.
Outras correções precisam de um novo build, então precisam do Xcode em um Mac. Isso inclui um Xcode ou SDK antigo, um privacy manifest, textos do Info.plist e mudanças de código ou de SDK. Todo novo upload também precisa de um número de build maior.
1. Build feito com um Xcode antigo demais
Desde 28 de abril de 2026, a Apple só aceita uploads feitos com o Xcode 26 ou mais novo, usando um SDK do iOS 26. Um build do Xcode 16 não passa nessa regra. Para ver o que gerou um archive, leia duas chaves do app dentro dele:
/usr/libexec/PlistBuddy -c 'Print :DTSDKName' -c 'Print :DTXcode' \ MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist
Em um runner macos-26 do GitHub, isso mostrou iphoneos26.5 e 2660, o que quer dizer Xcode 26.6. Os Macs da MacRun têm o Xcode 27.1 como padrão e também o Xcode 26.6. Os dois passam na regra.
Um detalhe: a Apple diz que apps no SDK do iOS 27.1 vão precisar de screenshots do iPhone Duo a partir de abril de 2027. Nosso guia do iPhone Duo mostra como tirá-los.
2. Privacy manifest e APIs com motivo obrigatório
Algumas APIs precisam de um motivo declarado, como UserDefaults e as datas de arquivos. Os motivos ficam em um arquivo chamado PrivacyInfo.xcprivacy. Desde 1 de maio de 2024, o App Store Connect não aceita apps que ignoram isso. A Apple também rejeita manifests com chaves inesperadas. O e-mail dela indica o caminho de cada arquivo com problema.
Aqui está um manifest mínimo para um app que lê os próprios UserDefaults. CA92.1 é o código de motivo da Apple para esse uso:
<?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>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>Adicione o arquivo ao target do seu app. Depois confira se ele é válido. Rodamos estes comandos em um arquivo bom e em um quebrado:
$ plutil -lint MyApp/PrivacyInfo.xcprivacy MyApp/PrivacyInfo.xcprivacy: OK $ plutil -lint bad.xcprivacy bad.xcprivacy: (Value missing for key inside <dict> at line 1)
Depois do archive, o arquivo deve ficar na raiz do .app. O nosso ficou. Se o e-mail cita um SDK de terceiros, atualize esse SDK. O manifest dele precisa cobrir o próprio uso de APIs.
3. Textos de descrição de uso faltando
Se o seu app usa a câmera, as fotos ou a localização, o Info.plist precisa de um texto de finalidade para isso. A Apple diz que o acesso falha sem ele, e o app pode travar. A diretriz 5.1.1(ii) da App Review também pede que o texto descreva com clareza o uso dos dados.
<key>NSCameraUsageDescription</key> <string>Scan receipts to add them to your expenses.</string>
Confira o app gerado, não só o arquivo de código:
plutil -extract NSCameraUsageDescription raw \ MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist
4. Export compliance
Um build sem resposta sobre criptografia aparece como Missing Compliance no TestFlight. Você não precisa de um novo build para isso. Abra o build no App Store Connect, clique em Manage e responda às perguntas. Para pular as perguntas da próxima vez, adicione esta chave ao Info.plist. Use false só se a sua criptografia for isenta, como HTTPS simples:
<key>ITSAppUsesNonExemptEncryption</key> <false/>
5. Screenshots errados ou faltando
Screenshots não pedem um novo build, mas você precisa do tamanho certo. A Apple exige pelo menos um screenshot de iPhone no tamanho médio com Dynamic Island. Isso dá 1179 x 2556 ou 1206 x 2622 pixels na vertical. Sem um iPhone por perto, o Simulador gera os screenshots:
xcrun simctl boot "iPhone 17 Pro" xcrun simctl install "iPhone 17 Pro" MyApp.app xcrun simctl launch "iPhone 17 Pro" com.example.myapp xcrun simctl io "iPhone 17 Pro" screenshot shot.png sips -g pixelWidth -g pixelHeight shot.png
Nosso screenshot do iPhone 17 Pro saiu com 1206 x 2622, o tamanho exigido. O iPhone 17 Pro Max deu 1320 x 2868, que serve para o conjunto grande. Rode xcrun simctl list devices available para ver o que está instalado.
Refaça o build e envie
Aumente o número de build e depois arquive. No nosso runner de teste, esta etapa levou 12 segundos para um pequeno app em SwiftUI:
xcodebuild archive -project MyApp.xcodeproj -scheme MyApp \ -destination 'generic/platform=iOS' \ -archivePath build/MyApp.xcarchive \ MARKETING_VERSION=1.0.1 CURRENT_PROJECT_VERSION=3
Em seguida, exporte um .ipa assinado. Coloque isto no ExportOptions.plist, com o seu próprio Team ID. As chaves vêm do xcodebuild -help:
<?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>teamID</key> <string>ABCDE12345</string> <key>signingStyle</key> <string>automatic</string> </dict> </plist>
xcodebuild -exportArchive -archivePath build/MyApp.xcarchive \ -exportOptionsPlist ExportOptions.plist -exportPath build/export \ -allowProvisioningUpdates
Antes, entre no Xcode com a sua Apple Account. Nosso archive de teste sem assinatura não tinha time, e a exportação parou com "error: exportArchive No Team Found in Archive".
A página de upload da Apple lista o Xcode, o Transporter e o altool. Com o altool, salve uma senha específica de app no keychain uma vez. Depois valide e envie:
xcrun altool --store-password-in-keychain-item altool -u you@example.com -p xxxx-xxxx-xxxx-xxxx xcrun altool --validate-app -f build/export/MyApp.ipa -t ios -u you@example.com -p @keychain:altool xcrun altool --upload-app -f build/export/MyApp.ipa -t ios -u you@example.com -p @keychain:altool
Ou defina destination como upload no ExportOptions.plist. Assim o próprio -exportArchive envia o build para o App Store Connect. Nosso guia de publicação explica as chaves de API e o TestFlight.
Corrija em um dia
Um passe diário da MacRun custa $15, em um único pagamento, sem renovação. É um Mac mini M6 dedicado, pronto em menos de 5 minutos. O Xcode 27.1 e o Xcode 26.6 estão instalados, com o simulador do iOS 27.1. Você acessa pelo Tailscale com SSH ou um visualizador VNC. Se a revisão devolver de novo, uma semana custa $59. O Mac é apagado no final, então envie seu código antes.
Quem não deve alugar um Mac para isso
- Se a correção é de screenshots, textos ou respostas de exportação, use o App Store Connect no navegador.
- Apps Expo podem refazer o build com o EAS Build nas máquinas macOS da Expo. Veja fazer build de apps iOS no Windows.
- Se você já faz o build no Codemagic ou no GitHub Actions, envie a correção e deixe o CI refazer o build.
Perguntas frequentes
Posso corrigir uma rejeição da App Store sem Mac?
+
Às vezes. Screenshots, textos e respostas de export compliance são corrigidos no App Store Connect, em qualquer navegador. Um Xcode novo, um privacy manifest ou uma mudança no Info.plist pedem um novo build, e isso precisa do macOS.
Qual versão do Xcode o App Store Connect exige em 2026?
+
Desde 28 de abril de 2026, a Apple exige uploads feitos com o Xcode 26 ou mais novo, usando um SDK do iOS 26. Os Macs da MacRun têm o Xcode 27.1 como padrão e o Xcode 26.6 instalado.
Como adiciono um privacy manifest ao meu app iOS?
+
Adicione um arquivo chamado PrivacyInfo.xcprivacy ao target do seu app. Liste cada categoria de API com motivo obrigatório junto com o código de motivo da Apple, como CA92.1 para os UserDefaults do próprio app. Confira com plutil -lint e depois refaça o build.
Meu build no TestFlight diz Missing Compliance. Preciso refazer o build?
+
Não. Abra o build no App Store Connect, clique em Manage e responda às perguntas sobre criptografia. Adicione ITSAppUsesNonExemptEncryption ao Info.plist no próximo build para pular as perguntas.
Qual tamanho de screenshot a App Store exige para iPhone?
+
A Apple exige pelo menos um screenshot para iPhone com Dynamic Island, tela média: 1179 x 2556 ou 1206 x 2622 pixels na vertical. Nosso screenshot do simulador do iPhone 17 Pro saiu com 1206 x 2622.
Como envio o novo build sem a janela do Xcode?
+
Exporte um .ipa com xcodebuild -exportArchive e depois rode xcrun altool --upload-app. O Transporter também funciona. A Apple lista os dois na página de upload.