Comment implémenter PrivacyInfo.xcprivacy pour les applications et SDKs iOS

opoinstall
2026-08-21
5 min read

Comment implémenter PrivacyInfo.xcprivacy pour les applications iOS ? L'implémentation de PrivacyInfo.xcprivacy nécessite d'ajouter un manifeste de confidentialité valide à votre application ou à votre cible SDK, de déclarer les codes de motifs approuvés pour toutes les API soumises à des motifs requis utilisées (telles que User Defaults ou System Boot Time), et de vérifier que les dépendances tierces satisfont aux exigences de manifeste de confidentialité et de signature applicables à leur forme de distribution.

Un manifeste de confidentialité (PrivacyInfo.xcprivacy) est un fichier de liste de propriétés standardisé intégré aux applications iOS et aux SDKs tiers qui déclare les catégories de collecte de données, les configurations de domaines de suivi et les justificatifs approuvés pour l'accès aux API à motifs requis désignées par Apple. Depuis le 1er mai 2024, les applications soumises à App Store Connect doivent inclure des motifs approuvés pour les API à motifs requis utilisées par le code de l'application, y compris le code des SDKs tiers applicables.

Terme Définition
PrivacyInfo.xcprivacy Le format de liste de propriétés standardisé d'Apple pour déclarer les pratiques de confidentialité des applications et des SDKs.
Required Reason APIs Des API de plateforme spécifiques (telles que User Defaults ou Disk Space) qui nécessitent des codes de justification explicites.
Resource Bundle Signing Le comportement de signature de code du système de build appliqué aux cibles de bundles de ressources générées, qui peut nécessiter un dépannage dans certaines configurations Xcode et CocoaPods.
Privacy Report Un résumé PDF agrégé généré par Xcode 15+ combinant les déclarations de manifestes de confidentialité découvertes dans l'application archivée et les SDKs liés.

Comprendre les exigences d'Apple en matière de manifeste de confidentialité pour les SDKs iOS

L'architecture des manifestes de confidentialité : manifeste de l'application principale vs manifestes de SDKs intégrés

Le framework de manifeste de confidentialité d'Apple établit un modèle de transparence modulaire dans l'ensemble de la chaîne d'approvisionnement logicielle iOS. Plutôt que d'exiger de l'application hôte qu'elle audite et déclare manuellement les détails d'implémentation internes de chaque bibliothèque importée, Apple divise la gouvernance de la confidentialité en couches distinctes :

  • Manifeste de l'application principale : couvre la collecte de données de première partie, les domaines de suivi au niveau de l'application et les API à motifs requis invoquées directement par le code de la cible de l'application principale.
  • Manifestes de SDKs intégrés : les déclarations d'API à motifs requis doivent appartenir à l'application ou au code du SDK tiers qui utilise ces API. Pour les exécutables et les bibliothèques dynamiques, le bundle contenant cet exécutable ou cette bibliothèque doit inclure le manifeste de confidentialité pertinent ; un SDK tiers ne peut pas s'appuyer sur le manifeste de l'application hôte pour signaler l'utilisation par le SDK d'une API à motifs requis.
  • Agrégation automatisée des dépendances : lorsqu'une application est archivée dans Xcode 15 ou version ultérieure, le système de build parcourt le graphique des dépendances, découvre tous les fichiers PrivacyInfo.xcprivacy regroupés et les agrège en un rapport de confidentialité unique et unifié.

Architecture des manifestes d'application et de SDK PrivacyInfo xcprivacy

Les quatre clés de configuration racine

Chaque fichier PrivacyInfo.xcprivacy est structuré sous la forme d'un dictionnaire de liste de propriétés XML contenant jusqu'à quatre clés de niveau racine :

  • NSPrivacyTracking (Booléen) : déclare si l'application ou le SDK utilise des données collectées à partir de l'application à des fins de suivi selon les définitions de la transparence du suivi des applications (ATT) d'Apple.
  • NSPrivacyTrackingDomains (Tableau de chaînes) : répertorie les domaines Internet connectés par l'application ou le SDK qui effectuent un suivi. Si un utilisateur n'accorde pas l'autorisation ATT, iOS bloque les connexions réseau vers les domaines déclarés dans ce tableau. Si une application ou un SDK ne se connecte pas à des domaines de suivi, cette clé peut être omise.
  • NSPrivacyCollectedDataTypes (Tableau de dictionnaires) : rapporte les catégories de données définies par Apple que l'application ou le SDK collecte sur les personnes utilisant l'application, ainsi que le fait de savoir si les données sont liées à l'identité de l'utilisateur, si elles sont utilisées pour le suivi et les finalités opérationnelles pour lesquelles elles sont collectées.
  • NSPrivacyAccessedAPITypes (Tableau de dictionnaires) : déclare les API à motifs requis désignées par Apple invoquées par le binaire, accompagnées de codes de motifs textuels approuvés.

Quatre clés de configuration racine PrivacyInfo xcprivacy

Application par App Store Connect et diagnostics d'erreurs

App Store Connect applique les manifestes de confidentialité lors de l'ingestion des binaires :

  • Déclaration d'API manquante (ITMS-91053) : déclenchée lorsqu'un binaire compilé ou une bibliothèque liée appelle un symbole d'API à motifs requis, mais que la clé de catégorie correspondante est absente de NSPrivacyAccessedAPITypes.
  • Déclaration de code de motif invalide : se produit lorsqu'un manifeste déclare une chaîne de motif non approuvée, mal formatée ou obsolète pour une catégorie d'API spécifique.
  • Manifeste de SDK tiers requis manquant : appliqué dans les scénarios de soumission définis par les exigences actuelles d'Apple en matière de SDK tiers pour les SDKs répertoriés, exigeant à la fois des manifestes de confidentialité et des signatures numériques valides pour les distributions binaires.

Les développeurs intégrant l'attribution client et le deep linking peuvent consulter la documentation d'intégration du SDK iOS pour connaître les spécifications techniques concernant les déclarations de manifestes.

Voir aussi : SDK iOS ──> Architecture d'attribution mobile

Catégories d'API à motifs requis et codes de motifs approuvés

Les cinq catégories d'API à motifs requis

Selon la note technique TN3183 d'Apple Developer, Apple définit cinq catégories d'API spécifiques qui nécessitent des codes de justification explicites dans NSPrivacyAccessedAPITypes. Les SDKs mobiles et les applications iOS interagissent généralement avec quatre catégories principales :

  • NSPrivacyAccessedAPICategoryUserDefaults : accès aux paramètres locaux de l'application via UserDefaults ou NSUserDefaults.
  • NSPrivacyAccessedAPICategorySystemBootTime : mesure du temps écoulé ou des horodatages à l'aide d'API de démarrage du système telles que sysctl(KERN_BOOTTIME) ou systemUptime.
  • NSPrivacyAccessedAPICategoryDiskSpace : inspection de la capacité du système de fichiers via statfs, statvfs ou volumeAvailableCapacityKey.
  • NSPrivacyAccessedAPICategoryFileTimestamp : vérification des dates de création ou de modification de fichiers via stat, getattrlist ou contentModificationDateKey.
  • NSPrivacyAccessedAPICategoryActiveKeyboards : inspection des extensions de claviers personnalisés actifs (principalement utilisées par des utilitaires de clavier spécialisés).

Mappages de codes de motifs approuvés sélectionnés pour les cas d'utilisation courants des SDKs

Le tableau ci-dessous se concentre sur les catégories couramment rencontrées dans les SDKs mobiles polyvalents ; consultez la documentation actuelle d'Apple pour obtenir la liste complète des motifs, y compris les claviers actifs. Pour se conformer aux directives d'Apple, les développeurs doivent sélectionner des codes de motifs qui correspondent strictement à leur utilisation réelle des données au moment de l'exécution :

Clé de catégorie d'API Code approuvé Finalité officielle alignée sur Apple
NSPrivacyAccessedAPICategoryUserDefaults CA92.1 Lire et écrire des données accessibles uniquement à l'application elle-même
NSPrivacyAccessedAPICategoryUserDefaults 1C8F.1 Lire et écrire des données partagées uniquement au sein du même App Group
NSPrivacyAccessedAPICategoryUserDefaults C56D.1 Wrapper de SDK tiers fournissant une fonctionnalité clé-valeur à l'application hôte
NSPrivacyAccessedAPICategorySystemBootTime 35F9.1 Mesurer le temps écoulé entre des événements se produisant dans l'application ou gérer des minuteurs
NSPrivacyAccessedAPICategorySystemBootTime 8FFB.1 Calculer des horodatages absolus pour des événements survenus dans l'application
NSPrivacyAccessedAPICategoryDiskSpace E174.1 Vérifier l'espace disque avant d'écrire des fichiers et modifier le comportement de l'application si l'espace est insuffisant
NSPrivacyAccessedAPICategoryDiskSpace 85F4.1 Accéder aux informations d'espace disque pour afficher la capacité disponible à l'utilisateur
NSPrivacyAccessedAPICategoryFileTimestamp C617.1 Accéder aux métadonnées de fichiers dans le conteneur de l'application, l'App Group ou le conteneur CloudKit
NSPrivacyAccessedAPICategoryFileTimestamp 3B52.1 Accéder aux métadonnées de fichiers ou de répertoires explicitement sélectionnés par l'utilisateur
NSPrivacyAccessedAPICategoryFileTimestamp 0A2A.1 Wrapper de SDK tiers accédant aux horodatages de fichiers uniquement pour le compte de l'application hôte

Catégories d'API à motifs requis et codes de motifs approuvés

Construction d'un exemple de liste de propriétés PrivacyInfo.xcprivacy

Configuration des types de collecte de données

Le tableau NSPrivacyCollectedDataTypes rapporte les catégories de données définies par Apple que l'application ou le SDK collecte sur les personnes utilisant l'application, ainsi que le fait de savoir si les données sont liées à l'identité de l'utilisateur, si elles sont utilisées pour le suivi et les finalités opérationnelles pour lesquelles elles sont collectées :

  • NSPrivacyCollectedDataType : l'identifiant textuel standard d'Apple (par ex., NSPrivacyCollectedDataTypeDeviceID).
  • NSPrivacyCollectedDataTypeLinked : un booléen indiquant si les données sont liées à l'identité d'un utilisateur individuel.
  • NSPrivacyCollectedDataTypeTracking : un booléen indiquant si les données sont utilisées pour le suivi inter-applications.
  • NSPrivacyCollectedDataTypePurposes : un tableau de chaînes de finalités standard (par ex., NSPrivacyCollectedDataTypePurposeAnalytics).

Déclaration des domaines de suivi

Si un SDK ou une application effectue un suivi selon les définitions de l'ATT, tous les domaines de suivi correspondants doivent être déclarés sous NSPrivacyTrackingDomains. Si l'autorisation de suivi n'est pas accordée par l'utilisateur, iOS bloque les connexions réseau vers les domaines déclarés. Si l'application ou le SDK n'effectue pas de suivi, NSPrivacyTracking doit être défini sur false et NSPrivacyTrackingDomains peut être omis.

La configuration de liste de propriétés ci-dessous illustre un exemple de schéma PrivacyInfo.xcprivacy. N'incluez que les catégories et les motifs qui reflètent l'implémentation réelle de votre application :

```xml
<?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>NSPrivacyCollectedDataTypes</key>
    <array>
        <dict>
            <key>NSPrivacyCollectedDataType</key>
            <string>NSPrivacyCollectedDataTypeDeviceID</string>
            <key>NSPrivacyCollectedDataTypeLinked</key>
            <false/>
            <key>NSPrivacyCollectedDataTypeTracking</key>
            <false/>
            <key>NSPrivacyCollectedDataTypePurposes</key>
            <array>
                <string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
                <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
            </array>
        </dict>
    </array>
    <key>NSPrivacyAccessedAPITypes</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>CA92.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategorySystemBootTime</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>35F9.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>E174.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>C617.1</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

Résolution des erreurs de signature de code de bundles de ressources CocoaPods

La cause racine : échecs de signature de bundles de ressources dans Xcode 15 et 16

Lors de l'intégration de dépendances via CocoaPods dans Xcode 15 ou 16, les développeurs rencontrent fréquemment des arrêts de compilation :

Signing for "libOpoInstallSDK-OPPrivacy" requires a development team. Select a development team in the Signing & Capabilities editor.

Cet échec de build est un problème d'intégration entre Xcode et CocoaPods :

  • Une bibliothèque statique .a traditionnelle ne peut pas contenir directement des ressources telles que PrivacyInfo.xcprivacy. Apple recommande de regrouper le code et les ressources d'un SDK statique au sein d'un framework statique.
  • Certaines intégrations CocoaPods génèrent à la place des cibles de bundles de ressources distinctes pour distribuer les ressources aux côtés des bibliothèques statiques.
  • Certaines cibles de bundles de ressources générées par CocoaPods peuvent hériter de configurations de signature qui provoquent l'arrêt des builds Xcode en demandant une équipe de développement. Il s'agit d'un problème d'intégration du système de build plutôt que d'une exigence du schéma PrivacyInfo.xcprivacy.

Application de contournements ciblés du système de build dans le Podfile

Pour résoudre cette erreur dans les builds automatisés, les développeurs peuvent utiliser un hook post_install ciblé dans le fichier Podfile de leur projet. Comme il s'agit d'un contournement du système de build pour les bundles de ressources non exécutables, les équipes doivent le limiter à des cibles de bundles spécifiques affectées ou valider les dépendances concernées avant d'appliquer les modifications de manière globale.

Le script Ruby ci-dessous montre comment parcourir les cibles CocoaPods et désactiver la signature sur des cibles de bundles de ressources désignées :

post_install do |installer|
  # Specify non-executable resource bundle targets that encounter signing errors without a development team
  target_bundle_names = [
    'libOpoInstallSDK-OPPrivacy'
  ]

  installer.pods_project.targets.each do |target|
    if target.respond_to?(:product_type) &&
       target.product_type == "com.apple.product-type.bundle" &&
       target_bundle_names.include?(target.name)
      target.build_configurations.each do |config|
        # Strip code signing requirement from designated non-executable resource bundles
        config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
        config.build_settings['CODE_SIGN_IDENTITY'] = ''
      end
    end
  end
end

Audit et génération du rapport de confidentialité agrégé dans Xcode

Génération du rapport de confidentialité unifié via l'organisateur d'archives de Xcode

Pour vérifier que toutes les cibles de première partie et les dépendances tierces sont correctement déclarées avant de soumettre un binaire :

  1. Ouvrez votre projet dans Xcode 15 ou version ultérieure.
  2. Sélectionnez Product > Archive pour créer une archive de publication.
  3. Dans l'organisateur Xcode, faites un clic droit (ou Control-clic) sur l'archive et sélectionnez Generate Privacy Report.
  4. Enregistrez et inspectez le rapport PDF généré pour confirmer que toutes les API à motifs requis, catégories de données et manifestes de SDKs tiers apparaissent correctement.

Analyse statique en ligne de commande : scans heuristiques pré-soumission

Les équipes de développement peuvent implémenter des audits heuristiques pré-soumission dans les pipelines d'intégration continue (CI/CD) en scannant les binaires compilés à la recherche de symboles restreints à l'aide de nm et otool :

# Scan unpacked application binary for candidate Required Reason API symbols
nm -u /path/to/Payload/YourApp.app/YourApp | grep -E 'sysctl|statfs|statvfs|getattrlist|NSUserDefaults'

# Check embedded frameworks and bundles for PrivacyInfo.xcprivacy manifests
find /path/to/Payload/YourApp.app -name "PrivacyInfo.xcprivacy"

La présence d'un symbole n'établit pas à elle seule quel motif approuvé s'applique ; examinez le chemin d'appel réel et le cas d'utilisation avant de modifier le manifeste. Les équipes doivent utiliser la fonction Generate Privacy Report de Xcode et les vérifications préalables d'App Store Connect pour une vérification officielle.

Flux de travail d'audit pré-soumission du manifeste de confidentialité iOS

Matrice de diagnostic : causes racines des rejets de manifestes de confidentialité sur l'App Store

Mode de défaillance / Code d'erreur Cause racine sous-jacente Comportement système observé Correction recommandée
Missing API Declaration (ITMS-91053) Le binaire appelle une API restreinte mais le manifeste omet la catégorie Avertissement ou rejet lors du téléversement sur App Store Connect Déclarer la catégorie d'API correspondante et un code de motif valide
Invalid Reason Code Le code de motif spécifié n'est pas approuvé par Apple pour cette catégorie App Store Connect rejette la soumission Mettre à jour le fichier XML pour utiliser une chaîne de motif approuvée selon les spécifications d'Apple
Missing Third-Party SDK Manifest Une dépendance de SDK tiers répertoriée n'a pas de manifeste intégré App Store Connect signale un manifeste de SDK manquant Mettre à niveau la dépendance vers une version fournissant PrivacyInfo.xcprivacy
Resource Bundle Code Signing Error CocoaPods génère une cible de bundle de ressources sans équipe de signature La compilation Xcode s'arrête pendant le build Évaluer la cible de bundle en échec et appliquer un contournement de signature Podfile ciblé
Undeclared Tracking Endpoint L'application se connecte à un serveur de suivi non répertorié dans NSPrivacyTrackingDomains La configuration de confidentialité est incomplète pour le comportement de suivi de l'application Répertorier tous les points de terminaison de suivi sous NSPrivacyTrackingDomains

Foire aux questions (FAQ)

Chaque SDK tiers a-t-il besoin de son propre fichier PrivacyInfo.xcprivacy ?
Pas uniquement parce qu'il s'agit d'une bibliothèque tierce. Un SDK qui utilise des API à motifs requis doit signaler ces utilisations dans son propre manifeste de confidentialité, et les SDKs qui collectent des données doivent décrire cette collecte dans leur propre manifeste. De plus, Apple exige des manifestes de confidentialité pour les SDKs répertoriés dans les scénarios de soumission décrits dans ses exigences actuelles en matière de SDKs tiers, avec des signatures en outre requises lorsque ces SDKs répertoriés sont utilisés comme dépendances binaires. Les applications hôtes ne peuvent pas déclarer d'API à motifs requis pour le compte d'un SDK intégré.
Que se passe-t-il si une application utilise UserDefaults sans déclarer de motif approuvé ?
Si un binaire d'application ou un SDK lié invoque des API <code>UserDefaults</code> sans déclarer <code>NSPrivacyAccessedAPICategoryUserDefaults</code> avec un code de motif valide (tel que <code>CA92.1</code> pour les données internes à l'application ou <code>1C8F.1</code> pour les App Groups), App Store Connect signalera le binaire avec une erreur <code>ITMS-91053</code> ou bloquera la soumission. Le code de motif correct dépend de l'utilisation réelle des données au moment de l'exécution.
Une application peut-elle déclarer plusieurs motifs pour une seule catégorie d'API ?
Oui. La clé <code>NSPrivacyAccessedAPITypeReasons</code> accepte un tableau de chaînes. Si une application ou un SDK utilise une API à plusieurs fins approuvées distinctes (par ex., vérifier l'espace disque suffisant pour modifier le comportement de l'application via <code>E174.1</code> et afficher également l'espace disque disponible à l'utilisateur via <code>85F4.1</code>), les deux codes de motifs approuvés peuvent être déclarés dans le tableau.

Résumé et cadre de décision

Le framework de manifeste de confidentialité d'Apple impose la transparence dans l'ensemble de la chaîne d'approvisionnement logicielle iOS. Garantir des soumissions fluides sur l'App Store exige des équipes de développement qu'elles auditent le code de première partie pour l'utilisation d'API à motifs requis, qu'elles vérifient que les dépendances de SDKs tiers satisfont aux exigences de manifeste de confidentialité applicables à leur utilisation d'API et qu'elles gèrent correctement la signature des bundles de ressources CocoaPods.

Pour les déclarations de manifestes de confidentialité spécifiques à votre produit, consultez la documentation OpoInstall et comparez le manifeste fourni avec l'intégration réelle de l'application et les exigences actuelles d'Apple.

Documents associés

  • Concepts : Manifestes de confidentialité, API à motifs requis, Signature de code de bundles de ressources, Rapports de confidentialité, Conformité App Store

  • Technologies : Xcode 15+, Gestionnaire de dépendances CocoaPods, Swift Package Manager, SDK iOS OpoInstall

  • Normes : Spécification du manifeste de confidentialité d'Apple, Directives d'évaluation de l'App Store, Section 5.1.1

  • API et configurations : PrivacyInfo.xcprivacy, NSPrivacyAccessedAPITypes, Hook post_install du Podfile

Documentation officielle

Share this article