Missing Compliance: the export encryption question, answered once
Your build finished processing, you went to submit, and App Store Connect shows this next to it:
Missing Compliance — Manage
The build can't be attached to a version or submitted until you answer. Every new upload asks again. Here's what the question is, how to answer it, and how to stop being asked.
What the question is
This isn't an Apple policy — it's US export law. Software that contains encryption is a regulated export, and Apple distributes your binary worldwide, so Apple has to know which category yours falls into before it ships.
The answer lives on the build as usesNonExemptEncryption. Until it's set, the build sits in Missing Compliance and cannot be submitted.
Answering it
The question is whether your app uses non-exempt encryption. Most apps don't, but "most" is not "all", and the distinction matters.
You are exempt — answer No — if the only encryption in your app is:
- HTTPS / TLS for network calls
- Apple's own frameworks: Keychain, CryptoKit, Data Protection,
URLSession - Encryption already built into iOS that you're merely calling
That covers the large majority of apps, including anything that just talks to an API over HTTPS.
You are not exempt — answer Yes — if your app:
- Implements its own proprietary encryption algorithm
- Ships a third-party crypto library beyond standard TLS
- Provides encryption as a feature to the user (an encrypted messenger, a password vault with its own crypto, a VPN client)
Answering Yes isn't a dead end, but it carries real obligations: depending on the case you may need a CCATS classification from the US Bureau of Industry and Security, an ERN, or an annual self-classification report. If you land here, read Apple's export compliance overview and get it right — this is a legal declaration, not a form field.
WARNING
Don't answer No because it's the faster path. You are certifying something to a US regulator. If your app ships its own crypto, answer honestly.
Stop being asked on every build
If you answer through the App Store Connect UI, the question returns on the next upload, and the one after. Two ways to make it permanent.
Declare it in the Info.plist (recommended)
Add the key to your target's Info.plist:
xml
<key>ITSAppUsesNonExemptEncryption</key>
<false/>Every build carrying this key skips the question entirely — it uploads and goes straight to ready. Set <true/> instead if you're in the non-exempt case above.
This is the fix worth doing once. It costs one line and removes a recurring 30-second interruption from every release you'll ever ship.
File a reusable declaration
In App Store Connect, an App Encryption Declaration can be created once and reused across builds. It works, but it's per-app and lives server-side — the Info.plist key travels with your project and works for every app you build from it.
You can do both. The Info.plist key wins.
If you're already stuck
For a build sitting in Missing Compliance right now:
- App Store Connect → your app → TestFlight or the version's Build section
- Click Manage next to the build
- Answer the encryption question
- The build becomes selectable
Then add the Info.plist key so the next build doesn't repeat it.
Catching it before you upload
Two separate things can bite you here, and they're checked in different places:
- The local side — is
ITSAppUsesNonExemptEncryptionin your Info.plist? If not, this upload will ask again. - The server side — is
usesNonExemptEncryptionset on the build that's already up? If it'snull, the build is blocked.
AuditStore checks both: encryption-key reads your Info.plist locally, and export-compliance reads the live build state from the App Store Connect API and reports a null answer as Blocking.
Related
- Build & Compliance checks — attached build, processing state, export compliance
- Xcode Project checks — the local Info.plist and source analysis
- ITMS-90683: Missing purpose string