La tua build iOS è stata rifiutata. Correggila e caricala di nuovo senza Mac
Apple ti ha mandato un’email, oppure il tuo upload è fallito, e non hai un Mac. Prima controlla se la correzione richiede davvero una nuova build. Alcune no. Per quelle che la richiedono, questa pagina dà la correzione e i comandi per archiviare, esportare e caricare di nuovo in un giorno.
Serve una nuova build?
Non ogni problema significa ricompilare. Queste correzioni si fanno in App Store Connect, da qualsiasi browser:
- Screenshot, descrizione e altri testi della pagina prodotto.
- Le risposte sulla conformità all’esportazione per una build segnata Missing Compliance.
- Le tue risposte App Privacy in App Store Connect.
Altre correzioni richiedono una nuova build, quindi richiedono Xcode su un Mac. Questo vale per uno Xcode o un SDK vecchio, un privacy manifest, stringhe in Info.plist e modifiche al codice o agli SDK. Ogni nuovo upload richiede anche un numero di build più alto.
1. Compilata con uno Xcode troppo vecchio
Dal 28 aprile 2026, Apple accetta solo upload compilati con Xcode 26 o successivo, con un SDK iOS 26. Una build da Xcode 16 non rispetta questa regola. Per vedere con cosa è stato compilato un archivio, leggi due chiavi dalla sua app:
/usr/libexec/PlistBuddy -c 'Print :DTSDKName' -c 'Print :DTXcode' \ MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist
Su un runner macos-26 di GitHub ha stampato iphoneos26.5 e 2660, cioè Xcode 26.6. I Mac MacRun hanno Xcode 27.1 come default e anche Xcode 26.6. Entrambi rispettano la regola.
Un dettaglio: Apple dice che le app sull’SDK iOS 27.1 avranno bisogno di screenshot per iPhone Duo da aprile 2027. La nostra guida a iPhone Duo mostra come farli.
2. Privacy manifest e required reason API
Alcune API richiedono un motivo dichiarato, come UserDefaults e i timestamp dei file. I motivi vanno in un file chiamato PrivacyInfo.xcprivacy. Dal 1 maggio 2024, App Store Connect non accetta app che lo saltano. Apple rifiuta anche i manifest con chiavi inattese. La sua email indica il percorso di ogni file sbagliato.
Ecco un manifest minimo per un’app che legge i propri UserDefaults. CA92.1 è il codice motivo di Apple per quell’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>Aggiungilo al target della tua app. Poi controlla che sia valido. Abbiamo eseguito questi comandi su un file corretto e su uno rotto:
$ plutil -lint MyApp/PrivacyInfo.xcprivacy MyApp/PrivacyInfo.xcprivacy: OK $ plutil -lint bad.xcprivacy bad.xcprivacy: (Value missing for key inside <dict> at line 1)
Dopo l’archivio, il file dovrebbe trovarsi nella radice del .app. Il nostro c’era. Se l’email indica un SDK di terze parti, aggiorna quell’SDK. Il suo manifest deve coprire il suo uso delle API.
3. Stringhe di descrizione d’uso mancanti
Se la tua app usa fotocamera, foto o posizione, Info.plist ha bisogno di una stringa di scopo per ciascuna. Apple dice che senza l’accesso fallisce, e l’app potrebbe andare in crash. Anche la linea guida 5.1.1(ii) di App Review chiede che la stringa descriva chiaramente il tuo uso dei dati.
<key>NSCameraUsageDescription</key> <string>Scan receipts to add them to your expenses.</string>
Controlla l’app compilata, non solo il file sorgente:
plutil -extract NSCameraUsageDescription raw \ MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist
4. Conformità all’esportazione
Una build senza risposta sulla crittografia mostra Missing Compliance in TestFlight. Per questo non serve ricompilare. Apri la build in App Store Connect, clicca Manage e rispondi alle domande. Per saltarle la prossima volta, aggiungi questa chiave a Info.plist. Usa false solo se la tua crittografia è esente, come il semplice HTTPS:
<key>ITSAppUsesNonExemptEncryption</key> <false/>
5. Screenshot sbagliati o mancanti
Gli screenshot non richiedono una nuova build, ma ti serve la dimensione giusta. Apple richiede almeno uno screenshot iPhone nella dimensione Dynamic Island media. Cioè 1179 x 2556 o 1206 x 2622 pixel in verticale. Senza un iPhone a portata di mano, li crea il simulatore:
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
Il nostro screenshot da iPhone 17 Pro è uscito a 1206 x 2622, la dimensione richiesta. iPhone 17 Pro Max ha dato 1320 x 2868, che va bene per il set grande. Esegui xcrun simctl list devices available per vedere cosa è installato.
Ricompilare e caricare
Alza il numero di build, poi archivia. Sul nostro runner di test questo passaggio ha richiesto 12 secondi per una piccola app 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
Poi esporta un .ipa firmato. Metti questo in ExportOptions.plist, con il tuo Team ID. Le chiavi vengono da 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
Prima accedi a Xcode con il tuo Apple Account. Il nostro archivio di prova senza firma non aveva un team, e l’export si è fermato con "error: exportArchive No Team Found in Archive".
La pagina di Apple sull’upload elenca Xcode, Transporter e altool. Con altool, salva una volta una password specifica per app nel portachiavi. Poi convalida e carica:
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
Oppure imposta destination su upload in ExportOptions.plist. Così -exportArchive invia da solo la build ad App Store Connect. La nostra guida alla pubblicazione copre chiavi API e TestFlight.
Risolvere in un giorno
Un pass giornaliero MacRun costa $15, pagamento unico senza rinnovo. È un Mac mini M6 dedicato, pronto in meno di 5 minuti. Sono installati Xcode 27.1 e Xcode 26.6, con il simulatore iOS 27.1. Lo raggiungi via Tailscale con SSH o un viewer VNC. Se la revisione lo rimanda indietro di nuovo, una settimana costa $59. Alla fine il Mac viene cancellato, quindi prima fai push del codice.
Chi non dovrebbe noleggiare un Mac per questo
- Se la correzione riguarda screenshot, testi o risposte sull’esportazione, usa App Store Connect in un browser.
- Le app Expo possono ricompilare con EAS Build sulle macchine macOS di Expo. Vedi creare app iOS su Windows.
- Se compili già su Codemagic o GitHub Actions, fai push della correzione e lascia ricompilare la CI.
Domande frequenti
Posso risolvere un rifiuto dell’App Store senza Mac?
+
A volte. Screenshot, testi e risposte sulla conformità all’esportazione si correggono in App Store Connect da qualsiasi browser. Un nuovo Xcode, un privacy manifest o una modifica a Info.plist richiedono una nuova build, e questo richiede macOS.
Quale versione di Xcode richiede App Store Connect nel 2026?
+
Dal 28 aprile 2026, Apple richiede upload compilati con Xcode 26 o successivo, con un SDK iOS 26. I Mac MacRun hanno Xcode 27.1 come default ed è installato anche Xcode 26.6.
Come aggiungo un privacy manifest alla mia app iOS?
+
Aggiungi un file chiamato PrivacyInfo.xcprivacy al target della tua app. Elenca ogni categoria di required reason API con il codice motivo di Apple, come CA92.1 per i UserDefaults dell’app stessa. Controllalo con plutil -lint, poi ricompila.
La mia build TestFlight dice Missing Compliance. Devo ricompilare?
+
No. Apri la build in App Store Connect, clicca Manage e rispondi alle domande sulla crittografia. Aggiungi ITSAppUsesNonExemptEncryption a Info.plist nella prossima build per saltarle.
Che dimensione di screenshot richiede l’App Store per iPhone?
+
Apple richiede almeno uno screenshot per iPhone con Dynamic Island, schermo medio: 1179 x 2556 o 1206 x 2622 pixel in verticale. Il nostro screenshot dal simulatore iPhone 17 Pro era 1206 x 2622.
Come carico la nuova build senza la finestra di Xcode?
+
Esporta un .ipa con xcodebuild -exportArchive, poi esegui xcrun altool --upload-app. Funziona anche Transporter. Apple li elenca entrambi nella sua pagina sull’upload.