Smetti di rispondere al questionario sulla cifratura: la chiave segreta di Info.plist

Se hai mai caricato una build su TestFlight, la conosci benissimo: la build termina il processing e poi resta bloccata con l’etichetta gialla “Missing Compliance”. Finché non apri App Store Connect e rispondi al questionario sulla cifratura, i tester non possono installarla. E la domanda ricompare a ogni nuova build, come un ritornello infinito.

La buona notizia è che Apple offre un modo per rispondere una volta sola, direttamente nel progetto: la chiave ITSAppUsesNonExemptEncryption in Info.plist.

Come funziona

Quando non trova questa chiave, App Store Connect ti fa compilare il questionario di export compliance a ogni caricamento: la build va su server negli Stati Uniti, e le leggi statunitensi sull’esportazione di software criptato richiedono una dichiarazione. Aggiungendo la chiave al Info.plist, la dichiarazione viaggia dentro il binario stesso, e il prompt sparisce sia per TestFlight che per la pubblicazione sull’App Store.

Il valore giusto per la stragrande maggioranza delle app:

<key>ITSAppUsesNonExemptEncryption</key>
<false/>

Un attenzione al dettaglio tecnico: deve essere un Booleano vero, non la stringa "NO" o "false" tra virgolette. Xcode lo scrive correttamente se aggiungi la chiave dall’interfaccia.

Aggiungerla da Xcode

  1. Seleziona il progetto nel navigatore, poi il target dell’app
  2. Apri il tab Info
  3. Aggiungi una nuova proprietà: App Uses Non-Exempt Encryption
  4. Tipo: Boolean, valore: NO

In alternativa, modifica direttamente il file Info.plist in vista sorgente.

Dopo averla aggiunta: Clean Build Folder (⇧⌘K), archivia di nuovo e carica. La build già presente su App Store Connect non la rileverà retroattivamente, quindi sblocca quella vecchia a mano — ma dalla prossima in poi non te lo chiederà più.

Quando è corretto usare false

Il nome della chiave si presta a confusione: non chiede se la tua app “usa la cifratura”, ma se usa cifratura non esente (non-exempt). Puoi impostare false quando l’app — comprese tutte le librerie di terze parti linkate — non usa cifratura, oppure usa solo cifratura esente dalle documentazioni di export compliance.

Copre praticamente tutte le app “normali”:

  • chiamate HTTPS a un backend tramite URLSession o URLSessionWebSocketTask — l’HTTPS tramite le API di sistema è esente
  • salvataggio di credenziali nel Keychain
  • uso di framework Apple (CryptoKit, Security, CloudKit, StoreKit, Sign in with Apple, push notification)

Se usi SDK di terze parti che implementano la propria crittografia (un proprio motore crittografico, non le API di sistema), vale la pena verificare prima di dichiarare false.

Quando invece serve true

Impota true solo se la tua app usa cifratura non esente: algoritmi proprietari o non standard, protocolli crittografici custom (es. E2E messaging fatto in casa), librerie crittografiche bundled come OpenSSL o libsodium usate per la cifratura come funzionalità principale. In quel caso non basta la chiave: dovrai caricare la documentazione di export compliance su App Store Connect e, una volta approvata, Apple ti fornirà un codice da inserire in ITSEncryptionExportComplianceCode.

Perché conviene anche in CI/CD

Se usi Xcode Cloud o una pipeline CI per archiviare e caricare build, questo blocco diventa un vero ostacolo: i processi automatizzati si fermano in attesa di un’azione manuale su App Store Connect. Con la chiave nel Info.plist, l’intero flusso — build, archive, upload, distribuzione ai tester — scorre senza interruzioni.

Il risvolto legale, per onestà

Questa dichiarazione è una dichiarazione legale: la responsabilità di un’eventuale classificazione errata ricade sullo sviluppatore, non su Apple. Per la tipica app consumer che comunica con un backend via HTTPS è un’esenzione tranquilla e consolidata, ma se la tua app ha componenti crittografiche non banali, vale la pena leggere la documentazione Apple sull’export compliance e, se necessario, consultare un esperto.

Riepilogo

SituazioneValoreConseguenza
Solo HTTPS + API di sistema ApplefalseNiente più prompt, nessuna documentazione
Cifratura proprietaria / customtrueDocumentazione + ITSEncryptionExportComplianceCode
Chiave assente—Questionario a ogni upload

Una riga di Info.plist e addio al questionario. Il tempo risparmiato, build dopo build, si accumula più di quanto sembri.

enjoy!

Ti interessa acquistare un dominio a prezzi ultraconvenienti? clicca qui

Se hai trovato utili le informazioni su questo blog,
Fai una donazione!
Clicca sul bottone qui sotto o almeno clicca sul banner pubblicitario 🙂



Commenta