# Missing Compliance sur TestFlight : la corriger pour de bon

> Missing Compliance veut dire qu'Apple attend ta déclaration de chiffrement. Débloque ce build dans App Store Connect, puis règle la clé pour ne plus la revoir.

Page originale : [Missing Compliance sur TestFlight : la corriger pour de bon](https://devoria.fr/blog/missing-compliance-testflight-chiffrement)
Auteur : [Mehdi Azizi](https://devoria.fr/mehdi-azizi)
Publication : 2026-11-06
Dernière révision du contenu : 2026-11-06


**Missing Compliance n'est pas une erreur : c'est un build qui attend ta réponse sur le chiffrement.** Tant que tu n'as pas répondu, le build reste bloqué pour tes testeurs. Pour ce build, tu réponds aux questions dans l'onglet TestFlight d'App Store Connect. Pour les suivants, tu poses la clé ITSAppUsesNonExemptEncryption dans ton Info.plist, ou `ios.config.usesNonExemptEncryption` dans ton app.json avec Expo, et le statut ne revient plus.

Mes apps iOS sont faites avec Expo. Dans l'app.json de Solys, la clé vaut `false`, posée deux fois : dans `ios.config` et dans `ios.infoPlist`. Ce guide suit les pages d'Apple sur les [statuts de build](https://developer.apple.com/help/app-store-connect/reference/app-uploads/app-build-statuses/) et sur la [conformité export des builds bêta](https://developer.apple.com/help/app-store-connect/test-a-beta-version/provide-export-compliance-information-for-beta-builds/), relues le 6 novembre 2026.

## Ce que veut dire Missing Compliance

La liste des statuts de build d'Apple le définit en une phrase : la documentation de conformité export manque, et une action est attendue de ta part. Apple l'affiche en jaune, la couleur d'un processus en cours qui dépend de toi ou d'Apple, et sa description précise qu'une action est attendue de ta part.

Pourquoi Apple pose la question ? La [page sur les règles d'export du chiffrement](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations) l'explique : quand tu envoies un build vers TestFlight ou l'App Store, tu l'envoies sur un serveur aux États-Unis. Si ton app est distribuée hors des États-Unis et du Canada, elle relève du droit américain de l'exportation, quel que soit le pays de ton entreprise. Et dès qu'une app utilise, contient ou intègre du chiffrement, Apple considère qu'il s'agit d'une exportation de logiciel de chiffrement.

**Résultat : à chaque nouvelle version, App Store Connect te pose les questions de conformité, sauf si ton Info.plist y répond déjà.** C'est pour ça qu'un premier build Expo arrive presque toujours en Missing Compliance.

## Débloquer le build qui attend

Les étapes viennent de la page d'Apple sur la conformité export des builds bêta. Il te faut le rôle Account Holder, Admin ou App Manager.

1. Dans Apps, ouvre ton app, puis l'onglet TestFlight.
2. Dans la barre latérale, sous Builds, choisis la plateforme.
3. Dans la colonne Build, clique sur l'icône ou le numéro du build concerné.
4. Clique sur Provide Export Compliance Information, puis réponds aux questions.
5. Si Apple te demande une documentation, clique sur Go to App Encryption Page pour l'envoyer. Sinon, clique sur Save.

Apple décrit aussi le raccourci : à côté du build, le lien Manage ouvre les mêmes questions, et Choose File permet de joindre une documentation déjà approuvée. Une fois enregistré, le build passe à Ready to Submit, ou directement à Testing s'il part à un groupe interne. Ready to Test n'arrive qu'après la revue bêta des testeurs externes.

**Le lien Manage n'est pas cliquable ?** Vérifie d'abord ton rôle dans l'équipe : Apple réserve la réponse aux rôles Account Holder, Admin et App Manager, un compte Developer ou Marketing ne peut pas répondre. Apple ne documente pas d'autre cause. Si le build vient d'être envoyé, attends l'e-mail de fin de traitement, détaillé dans le guide sur le [numéro de build et la version](https://devoria.fr/blog/numero-de-build-version-app-store-connect), puis recharge la page.

## Ne plus jamais répondre : la clé dans ton projet

Apple le dit sur la page des builds bêta : tu peux indiquer que ton app n'utilise pas de chiffrement, ou qu'elle en est exemptée, dans l'Info.plist, et tu n'as plus à répondre à chaque soumission. La clé s'appelle [ITSAppUsesNonExemptEncryption](https://developer.apple.com/documentation/bundleresources/information-property-list/itsappusesnonexemptencryption). Xcode l'affiche sous le nom App Uses Non-Exempt Encryption.

| Ton outil        | Fichier      | Où                             | Valeur |
| ---------------- | ------------ | ------------------------------ | ------ |
| Expo (EAS Build) | `app.json`   | `expo.ios.config`              | false  |
| Expo, autre voie | `app.json`   | `expo.ios.infoPlist`           | false  |
| React Native nu  | `Info.plist` | App Uses Non-Exempt Encryption | NO     |
| Xcode, Swift     | `Info.plist` | App Uses Non-Exempt Encryption | NO     |

Avec Expo, la clé s'appelle `usesNonExemptEncryption`, et la [référence de configuration](https://docs.expo.dev/versions/latest/config/app/) précise qu'elle écrit la clé Apple dans l'Info.plist du build, et que `ios.config` sert uniquement au build : il n'apparaît pas dans le manifeste de production.

```json
{
  "expo": {
    "ios": {
      "config": {
        "usesNonExemptEncryption": false
      }
    }
  }
}
```

Avec Expo, `ios.infoPlist` accepte aussi la clé sous son nom Apple, avec la même valeur : c'est la seconde ligne de l'app.json de Solys. Dans un projet natif, la même déclaration tient en une ligne de l'Info.plist : la clé App Uses Non-Exempt Encryption, c'est le nom que Xcode affiche, avec la valeur NO. La valeur est un booléen, pas une chaîne.

**La clé prend effet au prochain build.** Le build déjà envoyé reste en Missing Compliance tant que tu n'as pas répondu dans App Store Connect : les deux actions ne se remplacent pas, elles se complètent.

## false ou true : comment décider

Apple définit la valeur NO ainsi : ton app, bibliothèques tierces comprises, n'utilise aucun chiffrement, ou seulement un chiffrement exempté des obligations de documentation. Sinon, c'est YES.

Ce qui est en général exempté, d'après la page sur les règles d'export : le chiffrement intégré au système, comme les connexions HTTPS par URLSession. Ce qui ne l'est pas : un chiffrement propriétaire, que tu as écrit ou embarqué. La [vue d'ensemble de la conformité export](https://developer.apple.com/help/app-store-connect/manage-app-information/overview-of-export-compliance/) ajoute un rappel qui compte : c'est toi qui es responsable de l'interprétation, et de ses conséquences, si tu revendiques une exemption à tort.

Pour une app Expo qui appelle une API en HTTPS, stocke des préférences et vend un abonnement, `false` est la réponse habituelle. Pour une app qui chiffre elle-même des messages, des fichiers ou un coffre, la réponse est `true`, et Apple attend une documentation.

> Ne mets pas `false` par réflexe. Relis tes dépendances : une bibliothèque de chiffrement de bout en bout ou un stockage chiffré maison te fait basculer du côté de la documentation.

## Si ton app utilise un chiffrement non exempté

La [page sur la documentation de chiffrement](https://developer.apple.com/help/app-store-connect/manage-app-information/determine-and-upload-app-encryption-documentation/) décrit le circuit. Dans App Information, à côté d'App Encryption Documentation, le bouton d'ajout ouvre les questions, puis Choose File pour le document, puis Save. Apple demande d'avoir rempli la description de l'app et réglé sa disponibilité avant, pour juger si la documentation suffit. Il vise environ deux jours ouvrés quand le dossier est complet.

Une fois la documentation approuvée, Apple fournit une valeur à poser dans la clé `ITSEncryptionExportComplianceCode` de ton Info.plist. Avec elle, plus de questions à chaque envoi. Pendant l'examen, ton build affiche Waiting for Export Compliance Review ou In Compliance Review : aucune action n'est attendue de toi.

Deux points signalés par Apple, l'un sur la page des règles d'export, l'autre dans la vue d'ensemble de la conformité :

- **Même avec un chiffrement exempté, un rapport annuel d'auto-classification auprès du gouvernement américain peut être exigé.** Il ne l'est pas si tu utilises un chiffrement non exempté et que tu as fourni la documentation à Apple.
- **La France contrôle aussi l'import et l'export des apps de chiffrement.** La vue d'ensemble d'Apple cite le stockage sécurisé, les communications sécurisées et les antivirus comme domaines concernés, avec des exemptions pour les apps bancaires et médicales, et renvoie vers l'ANSSI.

## Ce qui se passe ensuite dans TestFlight

Le build débloqué suit la vie normale d'un build TestFlight, décrite dans le guide [TestFlight pour tester son app iPhone](https://devoria.fr/blog/testflight-tester-son-app-iphone) : testeurs internes tout de suite, testeurs externes après la revue bêta, et expiration au bout de 90 jours, d'après la liste des statuts de build. Les autres arrêts possibles d'un envoi Expo, comme un numéro de build déjà utilisé ou un fichier refusé, sont dans [les erreurs d'envoi EAS vers App Store Connect](https://devoria.fr/blog/expo-envoi-app-store-connect-erreurs), et la chaîne complète dans [publier une app Expo sur l'App Store avec EAS](https://devoria.fr/blog/publier-app-expo-app-store-eas).

Le [Kit iOS](https://devoria.fr/kits/ios) contient mon code de départ Expo, avec cette clé déjà posée, et le parcours qui mène du premier build à la fiche App Store. Si tu veux savoir ce qui bloque encore ta publication, le [diagnostic gratuit](https://devoria.fr/diagnostic) te répond en quelques questions et t'envoie ma checklist anti-refus Apple. Les étapes complètes sont dans [publier une application sur l'App Store](https://devoria.fr/expertise/publier-une-application-sur-app-store).

## Questions fréquentes

### Que veut dire Missing Compliance sur TestFlight ?

Le build attend ta déclaration de conformité export, c'est-à-dire ta réponse sur l'usage du chiffrement. Apple le classe parmi les statuts qui demandent une action de ta part. Le build ne part pas aux testeurs tant que tu n'as pas répondu.

### Pourquoi le lien Manage de Missing Compliance n'est-il pas cliquable ?

Vérifie ton rôle : Apple réserve la réponse aux rôles Account Holder, Admin et App Manager. Apple ne documente pas d'autre cause. Si le build vient d'arriver, recharge la page après l'e-mail de fin de traitement.

### Mon app utilise seulement HTTPS, dois-je répondre oui au chiffrement ?

Apple indique que le chiffrement intégré au système, comme les connexions HTTPS par URLSession, est en général exempté des obligations de documentation. Dans ce cas, la clé ITSAppUsesNonExemptEncryption vaut NO, à condition qu'aucune bibliothèque tierce n'ajoute un chiffrement propriétaire.

### Faut-il répondre aux questions de chiffrement à chaque build ?

Oui, tant que ton Info.plist ne contient pas la clé ITSAppUsesNonExemptEncryption. Avec elle, App Store Connect ne pose plus les questions. Avec Expo, elle se règle dans app.json par `ios.config.usesNonExemptEncryption`.

### Où déclarer le chiffrement dans app.json avec Expo ?

Dans app.json, sous `expo.ios.config`, avec `"usesNonExemptEncryption": false` si ton app n'utilise aucun chiffrement non exempté. EAS Build écrit la clé dans l'Info.plist du build. Elle prend effet au prochain build, pas sur celui déjà envoyé.

### Missing Compliance bloque-t-il aussi la soumission à l'App Store ?

Les questions de conformité export se posent pour toute nouvelle version, bêta ou App Store. Un build qui n'y a pas répondu ne peut pas être distribué. La clé dans l'Info.plist règle les deux cas à la fois.

### Dois-je faire un rapport annuel d'auto-classification ?

Apple signale que l'usage d'un chiffrement exempté peut quand même imposer un rapport annuel d'auto-classification auprès du gouvernement américain, et renvoie vers la procédure officielle. Si ton app utilise un chiffrement non exempté et que tu as fourni la documentation à Apple, ce rapport n'est pas nécessaire.


## Ton projet

[Kit Review](https://devoria.fr/kits/review-apple) : Tout ce que je vérifie avant d'envoyer une app à Apple, la même vérification pour Google Play, et trois skills qui font la relecture avec Claude Code. 49 €, paiement unique. Inclus : La checklist avant l'envoi ; Les refus que j'ai pris, et ce que j'ai corrigé ; Les notes pour le testeur ; Les skills de vérification. Prérequis : une app iPhone ou Android presque prête, et Claude Code ou Cursor. Téléchargement immédiat après le paiement.

[Kit iOS & Android Devoria](https://devoria.fr/kits/ios) : Le code de départ de mes apps, le parcours jusqu'à l'App Store et Google Play avec les messages à donner à Claude, et tous les kits. Claude part d'une app qui tourne déjà. 99 €, paiement unique. Inclus : Le code de départ de ton app ; Les styles visuels ; Le parcours pas à pas ; Kit Review ; Kit Captures ; Kit ASO ; Mises à jour à vie ; Bonus : la séance 1:1 à moitié prix. Prérequis : pour l'iPhone, un Mac avec Xcode 26 ou plus et un compte Apple Developer (99 $ par an) pour publier. Pour Android, Android Studio sur un Mac, un PC Windows ou Linux, et un compte Google Play Console (25 $, une fois). Et Claude Code (abonnement payant) ou Cursor. Téléchargement immédiat après le paiement.

[Diagnostic gratuit](https://devoria.fr/diagnostic) : quelques questions sur ton projet. Il dit ce qui te bloque vraiment, l'ordre des quatre étapes et le kit qui correspond. En laissant ton e-mail, tu reçois la checklist anti-refus Apple : les points vérifiés avant chaque envoi, tirés des refus reçus par les apps du studio.

[Une heure avec moi](https://devoria.fr/coaching) : On regarde ton app ou ton projet Claude, écran partagé : ce qui bloque, ce que je change en premier, et dans quel ordre. 100 € la séance d'une heure, en visio, paiement en une fois. Sujets : L'audit de ton app ; Ton travail avec Claude ; Ta fiche et ton paywall ; Un refus d'Apple.
