Privacy Manifest (PrivacyInfo.xcprivacy) è un file che tutte le applicazioni e gli SDK di terze parti devono includere nella compilazione iOS a partire dalla primavera 2024. Apple richiede di dichiarare i motivi dell'utilizzo delle API protette (Required Reason API) e i tipi di dati raccolti. Secondo la Documentazione sviluppatore Apple, ogni binario all'interno dell'applicazione — target principale, framework, dipendenze Swift Package Manager — deve contenere il proprio Privacy Manifest.
Punti chiave
Privacy Manifest è un file PrivacyInfo.xcprivacy in formato property list (XML) che dichiara quali tipi di dati l'applicazione raccoglie e perché utilizza determinate API. Apple ha introdotto i manifesti come parte di un'iniziativa per aumentare la trasparenza della privacy, simile a Privacy Nutrition Label, ma a livello di codice e binario.
Lo scopo principale del manifesto è documentare l'uso delle cosiddette Required Reason API. Queste sono categorie di API che possono essere utilizzate per la rilevazione delle impronte digitali del dispositivo (fingerprinting), quindi ogni utilizzo deve essere accompagnato da una dichiarazione di un motivo specifico dall'elenco approvato da Apple.
Dal 1° maggio 2024, Apple rifiuta le compilazioni che non contengono Privacy Manifest. Questo vale sia per i target principali dell'applicazione che per tutti gli SDK e le dipendenze integrati. Secondo la WWDC 2023, il manifesto è obbligatorio per tutte le applicazioni distribuite tramite l'App Store.
Il manifesto deve essere presente in ogni binario — non solo nell'applicazione principale, ma anche in ogni framework e libreria statica. Se un SDK di terze parti non ha fornito un manifesto, lo sviluppatore deve aggiungerlo manualmente o contattare il fornitore dell'SDK per un aggiornamento.
Prima dei manifesti, gli sviluppatori potevano utilizzare vaste API di sistema (accesso al filesystem, data/ora, log di sistema) senza una spiegazione trasparente dello scopo di utilizzo. Ciò creava un rischio di perdita di dati attraverso SDK di terze parti che potevano raccogliere informazioni all'insaputa dello sviluppatore.
Secondo Mysk Inc. (2023), molti SDK popolari utilizzavano API per la rilevazione delle impronte digitali del dispositivo senza necessità esplicita — ad esempio, leggendo il tempo di attività per determinare il fuso orario o scandendo directory per raccogliere metadati. Privacy Manifest obbliga a dichiarare ciascuna di queste azioni.
Oltre a Required Reason API, il manifesto include la sezione NSPrivacyTracking — un indicatore che segnala se l'app utilizza il tracciamento (richiede ATT), e NSPrivacyCollectedDataTypes — un elenco dei tipi di dati raccolti in formato Privacy Nutrition Label.
Privacy Nutrition Label è una rappresentazione rivolta all'utente nella pagina dell'applicazione sull'App Store, che mostra quali dati l'app raccoglie. Privacy Manifest è un file tecnico all'interno del binario che Apple verifica automaticamente. Se i dati nel manifesto non corrispondono alle etichette in App Store Connect, Apple rifiuta la compilazione.
Pertanto, il manifesto è la fonte di verità per il sistema di verifica di Apple. Le etichette sulla privacy vengono generate automaticamente da esso, ma lo sviluppatore deve mantenere aggiornate entrambe le rappresentazioni. Modificare il manifesto dopo la pubblicazione richiede l'invio di una nuova compilazione per la revisione.
Il file PrivacyInfo.xcprivacy utilizza il formato property list con un tipo radice Dictionary. Le principali chiavi di livello superiore sono: NSPrivacyTracking (Boolean), NSPrivacyTrackingDomains (Array), NSPrivacyCollectedDataTypes (Array), NSPrivacyAccessedAPITypes (Array).
La chiave NSPrivacyTracking — un valore booleano che indica se l'app applica il tracciamento (richiede ATT). Se è true, è necessario specificare anche NSUserTrackingUsageDescription in Info.plist. La chiave NSPrivacyTrackingDomains — un array di domini su cui viene applicato il tracciamento.
La chiave NSPrivacyCollectedDataTypes — un array di dizionari, ciascuno descrive un tipo di dato raccolto: categoria (NSPrivacyCollectedDataType), collegamento (NSPrivacyCollectedDataLinked), scopo (NSPrivacyCollectedDataTypePurposes). Gli scopi includono: pubblicità di terze parti, analisi, sviluppo del prodotto e personalizzazione dei contenuti.
La chiave NSPrivacyAccessedAPITypes — un array di dizionari per ogni categoria di Required Reason API: categoria (NSPrivacyAccessedAPITypeReasons) — un motivo specifico dall'elenco approvato da Apple, e NSPrivacyAccessedAPIType — l'identificatore della categoria API.
<!-- PrivacyInfo.xcprivacy -->
<?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>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>
I tipi di dati sono suddivisi in diverse categorie: informazioni di contatto (nome, email, telefono), finanze (dati di pagamento), identificatori (IDFA, ID utente), dati di utilizzo (log, clic), diagnostica (log di crash) e contenuto utente (foto, video, file). Ogni categoria è inoltre contrassegnata come "collegata all'utente" o "non collegata".
Collegata significa che i dati sono associati all'account dell'utente; non collegata significa che i dati sono aggregati o anonimizzati. Questa marcatura influisce sul modo in cui Apple visualizza l'etichetta sulla privacy: i dati collegati vengono contrassegnati in giallo, quelli non collegati in verde.
Apple ha identificato diverse categorie di API, il cui utilizzo deve essere accompagnato da un motivo specifico dall'elenco approvato. Un motivo è un codice univoco, ad esempio C617.1 o 35F9.1, che corrisponde a uno scopo specifico consentito da Apple.
La categoria NSPrivacyAccessedAPICategoryFileTimestamp include API per accedere ai timestamp dei file (creationDate, modificationDate). Motivi: C617.1 (sincronizzazione file), 3B52.1 (backup), 0A2A.1 (antifrode).
La categoria NSPrivacyAccessedAPICategoryDiskSpace include API per verificare lo spazio libero su disco (NSFileManager. Verifiche (NSFileManager). Motivi: E174.1 (gestione cache), 85F4.1 (download contenuti), B728.1 (diagnostica).
La categoria NSPrivacyAccessedAPICategorySystemBootTime include API di accesso al tempo di avvio del sistema (uptime). Un solo motivo: 35F9.1 (misurazione del tempo di sessione per analisi). Qualsiasi altro utilizzo è considerato fingerprinting.
Ogni categoria ha da 1 a 5 motivi approvati. Lo sviluppatore deve scegliere il motivo che corrisponde più precisamente all'utilizzo effettivo dell'API. Fornire un motivo inaccurato può portare al rifiuto della compilazione o alla sospensione dell'account.
Dal 1° maggio 2024, tutti gli SDK di terze parti — sia binari che open source — devono includere un Privacy Manifest nel loro pacchetto. Apple verifica i manifesti di tutte le dipendenze e se almeno un SDK non ha un manifesto, la compilazione verrà rifiutata.
I principali SDK (Firebase, Adjust, AppsFlyer, Facebook SDK) hanno già aggiornato i loro pacchetti. Se il tuo progetto utilizza un SDK poco conosciuto, verifica la sua versione e, se necessario, aggiornalo o contatta lo sviluppatore. Una soluzione temporanea è aggiungere manualmente un manifesto per l'SDK nel progetto, ma non è consigliata a causa di discrepanze durante gli aggiornamenti.
Puoi creare PrivacyInfo.xcprivacy tramite il modello integrato in Xcode 15+ o manualmente. Consideriamo entrambe le opzioni.
Xcode 15 include un modello Privacy Manifest: File → New → File → Resource → Privacy Manifest. Xcode crea un file con struttura di base e compila NSPrivacyTracking e array vuoti per API e dati. Dopo la creazione, devi specificare manualmente i motivi per ogni Required Reason API utilizzata.
Il modello aggiunge automaticamente il file al target principale. Se il progetto ha più target (Extensions, Watch app), devi aggiungere il manifesto a ciascuno. Xcode non verifica la presenza del manifesto nelle dipendenze in fase di compilazione — solo in fase di archiviazione.
// AppDelegate: verifica del manifesto in fase di sviluppo
import Foundation
func validatePrivacyManifest() {
guard let path = Bundle.main.path(
forResource: "PrivacyInfo", ofType: "xcprivacy"
) else {
print("PrivacyInfo.xcprivacy non trovato")
return
}
guard let dict = NSDictionary(contentsOfFile: path)
else { return }
print("Privacy manifest loaded: \(dict.count) keys")
}
Puoi creare PrivacyInfo.xcprivacy manualmente come un normale file XML property list. Per farlo, crea un file con nome PrivacyInfo.xcprivacy, scrivi l'intestazione plist standard e aggiungi un dizionario radice con le chiavi necessarie. Assicurati che il file sia aggiunto al target (Target Membership).
Il metodo manuale è utile quando devi aggiungere un manifesto a una libreria statica o a una dipendenza di Package Manager senza utilizzare l'interfaccia di Xcode. Dopo la compilazione, verifica che il file sia incluso nel binario utilizzando il comando nm o l'archiviazione.
Prima di inviare la compilazione all'App Store, devi verificare che Privacy Manifest sia corretto e completo. Apple fornisce diversi strumenti di validazione.
Durante l'archiviazione di un progetto (Product → Archive), Xcode esegue la validazione del manifesto. Se viene trovato un errore — manifesto mancante, motivo errato, categoria vuota — l'archiviazione fallisce con un errore. Il log degli errori viene visualizzato nel Issue navigator, indicando l'SDK problematico e la categoria API.
Una validazione aggiuntiva viene eseguita sul lato di App Store Connect durante il caricamento della compilazione. Se la validazione fallisce, la compilazione viene rifiutata con un'email automatica contenente l'identificatore dell'API problematica e la correzione consigliata.
Per automatizzare la validazione, utilizza script che analizzano il binario alla ricerca dell'utilizzo di Required Reason API. Apple fornisce lo strumento libtool e script di verifica dei simboli, ma la comunità ha sviluppato utility più convenienti.
# Ricerca dell'utilizzo dell'API FileTimestamp nel binario
nm MyApp.app/MyApp | grep "NSFileCreationDate"
# Verifica della presenza di PrivacyInfo.xcprivacy nell'applicazione
find MyApp.app -name "*.xcprivacy"
L'errore più comune è l'assenza di un manifesto in uno degli SDK. Anche se il target principale contiene un manifesto, Apple verifica ogni binario individualmente. Il secondo errore più comune è un codice motivo errato: utilizzare un motivo per una categoria API con un'API di un'altra categoria.
Il terzo errore è la dichiarazione eccessiva di API che non vengono effettivamente utilizzate. Gli sviluppatori aggiungono tutti i motivi possibili "per sicurezza", il che insospettisce i revisori Apple. Aggiungi solo le categorie effettivamente utilizzate. Utilizza l'analizzatore statico di Xcode per verificare.
Domande frequenti
Dal 1° maggio 2024, Apple rifiuta qualsiasi compilazione senza manifesto. L'errore si verifica nella fase di caricamento su App Store Connect. Le vecchie applicazioni non vengono bloccate, ma gli aggiornamenti richiedono l'inclusione obbligatoria del manifesto.
Sì, il manifesto è obbligatorio per tutte le piattaforme Apple: iOS, iPadOS, macOS, tvOS, watchOS e visionOS. I requisiti per Required Reason API sono uniformi su tutte le piattaforme, sebbene gli insiemi di API possano differire leggermente.
Se l'SDK non ha fornito un manifesto, crea un file PrivacyInfo.xcprivacy separato e aggiungilo al gruppo dell'SDK nel progetto. Specifica i motivi per le API utilizzate da questo SDK in base alla documentazione dell'SDK.
Sì. Durante la verifica automatica, Apple confronta i motivi dichiarati con le effettive chiamate API. La discrepanza porta al rifiuto. Durante la revisione manuale, il revisore può richiedere chiarimenti.
Sì, Apple verifica i manifesti per tutte le dipendenze, incluso SPM. I fornitori di pacchetti devono includere PrivacyInfo.xcprivacy nei loro repository. Xcode avverte sui manifesti mancanti durante l'archiviazione.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche