Aller au contenu
Narvy

ITMS-91053 : déclaration d'API manquante dans le manifeste de confidentialité

Un binaire de votre application appelle une API qu'Apple classe parmi les API à justification (par exemple UserDefaults, stat, mach_absolute_time, clés d'espace disque), et le manifeste de confidentialité du bundle qui le contient ne déclare pas cette catégorie. Ajoutez la catégorie avec un code de justification approuvé dans PrivacyInfo.xcprivacy, dans le bon bundle.

E-mail App Store ConnectITMS-91053
ITMS-91053: Missing API declaration - Your app's code in the "<file>" file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryUserDefaults.

Ce que cela signifie

Starting May 1, 2024, apps that don't describe their use of required reason API in their privacy manifest file aren't accepted by App Store Connect.

Apple, Describing use of required reason API

Selon Apple, depuis le 1er mai 2024, les applications qui ne décrivent pas leur usage des API à justification dans leur manifeste de confidentialité ne sont pas acceptées par App Store Connect. Cinq catégories existent : dates des fichiers, temps de démarrage du système, espace disque, claviers actifs et préférences utilisateur. Chaque catégorie déclarée exige au moins un code de justification de la liste d'Apple (pour les préférences utilisateur, CA92.1 désigne un accès par l'application elle-même). Apple exige la déclaration pour chaque exécutable ou bibliothèque dynamique : le bundle qui le contient doit avoir son propre manifeste, un framework ne peut donc pas s'appuyer sur celui de l'application.

Échéance

En vigueur depuis le 1er mai 2024 pour les nouvelles applications et les mises à jour.

Corriger

1. Trouver la catégorie et le binaire

L'e-mail nomme le fichier et les catégories. Le contrôle lit les symboles importés de chaque exécutable de l'IPA et liste, par binaire, la catégorie non déclarée et les symboles qui l'exigent.

2. La déclarer avec une justification approuvée

PrivacyInfo.xcprivacy (dans la cible de l'application, ou dans le framework qui utilise l'API)
<key>NSPrivacyAccessedAPITypes</key>
<array>
  <dict>
    <key>NSPrivacyAccessedAPIType</key>
    <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
    <key>NSPrivacyAccessedAPITypeReasons</key>
    <array>
      <string>CA92.1</string>
    </array>
  </dict>
</array>

Dans Xcode : File, New, File, App Privacy. Choisissez dans la liste d'Apple le code qui correspond à l'usage réel ; la justification est un code, pas un texte libre.

3. Corriger les frameworks tiers à la source

Si la catégorie manque dans le bundle d'un framework, passez à une version du SDK qui embarque un manifeste de confidentialité. La déclarer dans le manifeste de l'application ne couvre pas un framework dynamique distinct.

Vérifier avant de soumettre

Déposez l'IPA sur la page de contrôle des stores. Elle exécute APPSTORE-REQUIRED-REASON-API avec les dates de cette page, puis supprime le fichier : rien de l'application n'est conservé. Le même moteur tourne hors ligne dans la CLI Narvy et renvoie le code 1 quand un point bloquant est trouvé, ce qui permet de bloquer un job de CI.

Hors ligne, depuis un terminal (narvy-cli 1.2.0 ou plus)
narvy store-check MyApp.ipa --lang fr

Contrôler un build dans le navigateur

Questions fréquentes

Pourquoi le contrôle signale-t-il un avertissement et non un point bloquant ?

L'outil d'analyse d'Apple n'est pas public, et des applications publiées contiennent des imports non déclarés : un refus ne peut donc pas être prédit avec certitude. La documentation d'Apple est claire sur le fait que la déclaration est exigée.

Que signifie "non déterminé" pour ce contrôle ?

Certaines API (systemUptime, activeInputModes, fileModificationDate) sont appelées par nom de message Objective-C. Le binaire prouve que le message est envoyé, pas à quelle classe : le contrôle le liste pour vérification au lieu de conclure à un échec.