--- name: export-compliance description: Answer App Store export compliance (encryption) for a mobile game correctly - ITSAppUsesNonExemptEncryption in Info.plist, the per-build usesNonExemptEncryption answer and encryption declarations through the App Store Connect API (storebound apple encryption), French declaration, and what counts as exempt. Use when a build shows "Missing Compliance", App Store Connect asks about encryption, or before the first TestFlight / App Store upload. --- # Export compliance (App Store) Every build needs an answer to "does the app use non-exempt encryption". Without it the build waits in "Missing Compliance" and cannot go to TestFlight testers or review. The answer is a legal statement under US export rules: **never declare exempt to get past the question**. When the code does not prove the answer, ask the owner. ## Decide Usually exempt (answer `false`), when the game only uses encryption through the OS or standard protocols: - HTTPS / TLS through URLSession, WKWebView, the engine's HTTP client using the system TLS - Apple frameworks (Keychain, CryptoKit used only for authentication / integrity), StoreKit, Game Center - Ad, analytics, crash SDKs that talk HTTPS Not exempt or needs a closer look (answer `true`, then a declaration / documents): - Your own or a bundled crypto library used for something beyond authentication (e.g. encrypting user content, custom VPN, end-to-end chat encryption) - Proprietary or non-standard algorithms Apple's "Complying with Encryption Export Regulations" page and the questions in App Store Connect are the reference. ## Set it once 1. Put the answer in the config: `apple.usesNonExemptEncryption: false` (or `true`) in `storebound.config.ts`. storebound refuses to answer while it is unset. 2. Put the same answer in Info.plist so every new build arrives answered: `ITSAppUsesNonExemptEncryption` = `NO` (Boolean). For `true` also `ITSEncryptionExportComplianceCode` once you have an approved declaration's code. 3. Builds already uploaded without the key: `storebound apple encryption --dry`, then `storebound apple encryption` (sets the answer on every unanswered build, or `--build N`). 4. `true`: create the encryption declaration in App Store Connect > App Information > App Encryption Documentation (upload the documents it asks for, including the French declaration when distributing in France). After it is APPROVED, `storebound apple encryption` links it to the builds. storebound never creates a declaration or claims an exemption on its own. 5. Check: `storebound validate --apple` shows "export compliance answered". ## Gotchas - Answering once in the UI only covers that build; the Info.plist key covers all future builds. - Changing an SDK (e.g. adding an end-to-end encrypted chat) can change the answer: re-check on every new SDK. - Play has no equivalent question; this is App Store only.