Missing Compliance su TestFlight: risolverla per sempre
Di Mehdi Azizi
Pubblicato il , 9 min
Missing Compliance significa che Apple aspetta la tua dichiarazione sulla crittografia. Sblocca il build in App Store Connect e imposta la chiave.
Missing Compliance non è un errore: è un build che aspetta la tua risposta sulla crittografia. Finché non rispondi, il build resta bloccato per i tuoi tester. Per questo build, rispondi alle domande nella scheda TestFlight di App Store Connect. Per i successivi, imposti la chiave ITSAppUsesNonExemptEncryption nel tuo Info.plist, oppure ios.config.usesNonExemptEncryption nel tuo app.json con Expo, e lo stato non torna più.
Le mie app iOS sono fatte con Expo. Nell'app.json di Solys, la chiave vale false, impostata due volte: in ios.config e in ios.infoPlist. Questa guida segue le pagine di Apple sugli stati dei build e sulla conformità all'esportazione dei build beta, rilette il 6 novembre 2026.
Cosa significa Missing Compliance
L'elenco degli stati dei build di Apple lo definisce in una frase: manca la documentazione di conformità all'esportazione, ed è richiesta un'azione da parte tua. Apple lo mostra in giallo, il colore di un processo in corso che dipende da te o da Apple, e la sua descrizione precisa che è richiesta un'azione da parte tua.
Perché Apple fa questa domanda? La pagina sulle norme di esportazione della crittografia lo spiega: quando invii un build a TestFlight o all'App Store, lo invii a un server negli Stati Uniti. Se la tua app è distribuita fuori da Stati Uniti e Canada, ricade sotto la legge americana sull'esportazione, qualunque sia il paese della tua azienda. E appena un'app usa, contiene o integra crittografia, Apple la considera un'esportazione di software di crittografia.
Risultato: a ogni nuova versione, App Store Connect ti fa le domande di conformità, a meno che il tuo Info.plist non risponda già. Ecco perché un primo build Expo arriva quasi sempre in Missing Compliance.
Sbloccare il build in attesa
I passaggi vengono dalla pagina di Apple sulla conformità all'esportazione dei build beta. Ti serve il ruolo Account Holder, Admin o App Manager.
- In Apps, apri la tua app, poi la scheda TestFlight.
- Nella barra laterale, sotto Builds, scegli la piattaforma.
- Nella colonna Build, clicca sull'icona o sul numero del build interessato.
- Clicca su Provide Export Compliance Information, poi rispondi alle domande.
- Se Apple ti chiede una documentazione, clicca su Go to App Encryption Page per inviarla. Altrimenti, clicca su Save.
Apple descrive anche la scorciatoia: accanto al build, il link Manage apre le stesse domande, e Choose File permette di allegare una documentazione già approvata. Una volta salvato, il build passa a Ready to Submit, o direttamente a Testing se va a un gruppo interno. Ready to Test arriva solo dopo la revisione beta per i tester esterni.
Il link Manage non è cliccabile? Controlla prima il tuo ruolo nel team: Apple riserva la risposta ai ruoli Account Holder, Admin e App Manager, un account Developer o Marketing non può rispondere. Apple non documenta altre cause. Se il build è appena stato inviato, aspetta l'e-mail di fine elaborazione, spiegata nella guida su numero di build e versione, poi ricarica la pagina.
Non rispondere mai più: la chiave nel tuo progetto
Apple lo dice nella pagina dei build beta: puoi indicare nell'Info.plist che la tua app non usa crittografia, o che ne è esente, e non devi più rispondere a ogni invio. La chiave si chiama ITSAppUsesNonExemptEncryption. Xcode la mostra con il nome App Uses Non-Exempt Encryption.
| Il tuo strumento | File | Dove | Valore |
|---|---|---|---|
| Expo (EAS Build) | app.json | expo.ios.config | false |
| Expo, altra strada | app.json | expo.ios.infoPlist | false |
| React Native puro | Info.plist | App Uses Non-Exempt Encryption | NO |
| Xcode, Swift | Info.plist | App Uses Non-Exempt Encryption | NO |
Con Expo, la chiave si chiama usesNonExemptEncryption, e il riferimento di configurazione precisa che scrive la chiave Apple nell'Info.plist del build, e che ios.config serve solo al build: non compare nel manifest di produzione.
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Con Expo, ios.infoPlist accetta anche la chiave con il suo nome Apple, con lo stesso valore: è la seconda riga dell'app.json di Solys. In un progetto nativo, la stessa dichiarazione sta in una riga dell'Info.plist: la chiave App Uses Non-Exempt Encryption, il nome che mostra Xcode, con valore NO. Il valore è un booleano, non una stringa.
La chiave ha effetto dal build successivo. Il build già inviato resta in Missing Compliance finché non rispondi in App Store Connect: le due azioni non si sostituiscono, si completano.
false o true: come decidere
Apple definisce il valore NO così: la tua app, librerie di terze parti comprese, non usa nessuna crittografia, oppure solo una crittografia esente dagli obblighi di documentazione. Altrimenti, è YES.
Cosa di solito è esente, secondo la pagina sulle norme di esportazione: la crittografia integrata nel sistema, come le connessioni HTTPS tramite URLSession. Cosa non lo è: una crittografia proprietaria, che hai scritto o incluso tu. La panoramica sulla conformità all'esportazione aggiunge un promemoria importante: sei tu il responsabile dell'interpretazione, e delle sue conseguenze, se rivendichi un'esenzione a torto.
Per un'app Expo che chiama un'API in HTTPS, salva preferenze e vende un abbonamento, false è la risposta abituale. Per un'app che cifra da sé messaggi, file o una cassaforte, la risposta è true, e Apple si aspetta una documentazione.
Non mettere
falseper riflesso. Ricontrolla le tue dipendenze: una libreria di crittografia end-to-end o uno storage cifrato fatto in casa ti fa passare dalla parte della documentazione.
Se la tua app usa una crittografia non esente
La pagina sulla documentazione di crittografia descrive il percorso. In App Information, accanto ad App Encryption Documentation, il pulsante di aggiunta apre le domande, poi Choose File per il documento, poi Save. Apple chiede di aver compilato prima la descrizione dell'app e impostato la sua disponibilità, per valutare se la documentazione basta. Punta a circa due giorni lavorativi quando la pratica è completa.
Una volta approvata la documentazione, Apple fornisce un valore da inserire nella chiave ITSEncryptionExportComplianceCode del tuo Info.plist. Con quello, niente più domande a ogni invio. Durante l'esame, il tuo build mostra Waiting for Export Compliance Review o In Compliance Review: non è richiesta nessuna azione da parte tua.
Due punti segnalati da Apple, uno nella pagina sulle norme di esportazione, l'altro nella panoramica sulla conformità:
- Anche con una crittografia esente, può essere richiesto un rapporto annuale di autoclassificazione al governo americano. Non lo è se usi una crittografia non esente e hai fornito la documentazione ad Apple.
- Anche la Francia controlla l'importazione e l'esportazione delle app di crittografia. La panoramica di Apple cita lo storage sicuro, le comunicazioni sicure e gli antivirus come ambiti interessati, con esenzioni per le app bancarie e mediche, e rimanda all'ANSSI.
Cosa succede dopo in TestFlight
Il build sbloccato segue la vita normale di un build TestFlight, descritta nella guida TestFlight per testare la tua app iPhone: tester interni subito, tester esterni dopo la revisione beta, e scadenza dopo 90 giorni, secondo l'elenco degli stati dei build. Gli altri possibili blocchi di un invio Expo, come un numero di build già usato o un file rifiutato, sono in gli errori di invio EAS verso App Store Connect, e la catena completa in pubblicare un'app Expo sull'App Store con EAS.
L'iOS & Android Kit contiene il mio codice di partenza Expo, con questa chiave già impostata, e il percorso che porta dal primo build alla scheda App Store. Se vuoi sapere cosa blocca ancora la tua pubblicazione, il diagnostico gratuito ti risponde in poche domande e ti invia la mia checklist anti-rifiuto Apple. I passaggi completi sono in pubblicare un'applicazione sull'App Store.
Domande frequenti
Cosa significa Missing Compliance su TestFlight?
Il build aspetta la tua dichiarazione di conformità all'esportazione, cioè la tua risposta sull'uso della crittografia. Apple lo classifica tra gli stati che richiedono un'azione da parte tua. Il build non arriva ai tester finché non hai risposto.
Perché il link Manage di Missing Compliance non è cliccabile?
Controlla il tuo ruolo: Apple riserva la risposta ai ruoli Account Holder, Admin e App Manager. Apple non documenta altre cause. Se il build è appena arrivato, ricarica la pagina dopo l'e-mail di fine elaborazione.
La mia app usa solo HTTPS, devo rispondere sì sulla crittografia?
Apple indica che la crittografia integrata nel sistema, come le connessioni HTTPS tramite URLSession, è in genere esente dagli obblighi di documentazione. In quel caso, la chiave ITSAppUsesNonExemptEncryption vale NO, a condizione che nessuna libreria di terze parti aggiunga una crittografia proprietaria.
Bisogna rispondere alle domande sulla crittografia a ogni build?
Sì, finché il tuo Info.plist non contiene la chiave ITSAppUsesNonExemptEncryption. Con quella, App Store Connect non fa più le domande. Con Expo, si imposta in app.json tramite ios.config.usesNonExemptEncryption.
Dove dichiarare la crittografia in app.json con Expo?
In app.json, sotto expo.ios.config, con "usesNonExemptEncryption": false se la tua app non usa nessuna crittografia non esente. EAS Build scrive la chiave nell'Info.plist del build. Ha effetto dal build successivo, non su quello già inviato.
Missing Compliance blocca anche l'invio all'App Store?
Le domande di conformità all'esportazione si pongono per ogni nuova versione, beta o App Store. Un build che non ha risposto non può essere distribuito. La chiave nell'Info.plist risolve entrambi i casi insieme.
Devo fare un rapporto annuale di autoclassificazione?
Apple segnala che l'uso di una crittografia esente può comunque richiedere un rapporto annuale di autoclassificazione al governo americano, e rimanda alla procedura ufficiale. Se la tua app usa una crittografia non esente e hai fornito la documentazione ad Apple, questo rapporto non è necessario.

