Missing Compliance v TestFlightu: jak to opravit natrvalo
Autor: Mehdi Azizi
Publikováno , 9 min
Missing Compliance znamená, že Apple čeká na tvé prohlášení o šifrování. Odblokuj build v App Store Connect a nastav klíč, ať se to už neopakuje.
Missing Compliance není chyba: je to build, který čeká na tvou odpověď ohledně šifrování. Dokud neodpovíš, zůstane build pro tvé testery zablokovaný. U tohoto buildu odpovíš na otázky v záložce TestFlight v App Store Connect. U dalších buildů nastavíš klíč ITSAppUsesNonExemptEncryption ve svém Info.plist, nebo ios.config.usesNonExemptEncryption v app.json, pokud používáš Expo, a stav se už nevrátí.
Svoje iOS appky dělám v Expo. V app.json appky Solys má klíč hodnotu false a je tam dvakrát: v ios.config a v ios.infoPlist. Tenhle návod vychází ze stránek Applu o stavech buildů a o exportní shodě beta buildů, které jsem znovu prošel 6. listopadu 2026.
Co znamená Missing Compliance
Seznam stavů buildů od Applu to definuje jednou větou: chybí dokumentace exportní shody a čeká se na akci od tebe. Apple ho zobrazuje žlutě, tedy barvou probíhajícího procesu, který závisí na tobě nebo na Applu, a v popisu stojí, že se čeká na tvou akci.
Proč se Apple ptá? Vysvětluje to stránka o pravidlech pro export šifrování: když posíláš build do TestFlightu nebo na App Store, posíláš ho na server v USA. Pokud se tvoje appka distribuuje mimo USA a Kanadu, spadá pod americké exportní právo, bez ohledu na to, v jaké zemi sídlí tvoje firma. A jakmile appka šifrování používá, obsahuje nebo integruje, Apple to považuje za export šifrovacího softwaru.
Výsledek: u každé nové verze se tě App Store Connect zeptá na otázky ke shodě, pokud na ně tvůj Info.plist už neodpovídá. Proto skoro každý první build z Expo skončí v Missing Compliance.
Jak odblokovat čekající build
Postup je ze stránky Applu o exportní shodě beta buildů. Potřebuješ roli Account Holder, Admin nebo App Manager.
- V Apps otevři svou appku a pak záložku TestFlight.
- V postranním panelu pod Builds vyber platformu.
- Ve sloupci Build klikni na ikonu nebo číslo daného buildu.
- Klikni na Provide Export Compliance Information a odpověz na otázky.
- Pokud po tobě Apple chce dokumentaci, klikni na Go to App Encryption Page a pošli ji. Jinak klikni na Save.
Apple popisuje i zkratku: vedle buildu otevře odkaz Manage stejné otázky a přes Choose File můžeš přiložit už schválenou dokumentaci. Po uložení přejde build do stavu Ready to Submit, nebo rovnou do Testing, pokud jde interní skupině. Ready to Test přijde až po beta review pro externí testery.
Odkaz Manage nejde rozkliknout? Nejdřív si ověř svou roli v týmu: Apple nechává odpovídat jen role Account Holder, Admin a App Manager, účet Developer nebo Marketing odpovědět nemůže. Jinou příčinu Apple nedokumentuje. Pokud jsi build právě nahrál, počkej na e-mail o dokončení zpracování, popsaný v návodu o čísle buildu a verzi, a stránku obnov.
Už nikdy neodpovídat: klíč v projektu
Apple to píše na stránce o beta buildech: v Info.plist můžeš uvést, že tvoje appka šifrování nepoužívá nebo je z něj vyjmutá, a pak už nemusíš odpovídat při každém odeslání. Klíč se jmenuje ITSAppUsesNonExemptEncryption. Xcode ho zobrazuje pod názvem App Uses Non-Exempt Encryption.
| Tvůj nástroj | Soubor | Kde | Hodnota |
|---|---|---|---|
| Expo (EAS Build) | app.json | expo.ios.config | false |
| Expo, jiná cesta | app.json | expo.ios.infoPlist | false |
| Čistý React Native | Info.plist | App Uses Non-Exempt Encryption | NO |
| Xcode, Swift | Info.plist | App Uses Non-Exempt Encryption | NO |
V Expo se klíč jmenuje usesNonExemptEncryption a konfigurační reference uvádí, že zapíše klíč Applu do Info.plist buildu a že ios.config slouží jen pro build: v produkčním manifestu se neobjeví.
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
V Expo přijímá ios.infoPlist klíč i pod jeho názvem od Applu, se stejnou hodnotou: to je ten druhý řádek v app.json appky Solys. V nativním projektu se stejné prohlášení vejde na jeden řádek Info.plist: klíč App Uses Non-Exempt Encryption, jak ho ukazuje Xcode, s hodnotou NO. Hodnota je boolean, ne řetězec.
Klíč začne platit od příštího buildu. Už odeslaný build zůstane v Missing Compliance, dokud neodpovíš v App Store Connect: tyhle dva kroky se nenahrazují, doplňují se.
false, nebo true: jak se rozhodnout
Apple definuje hodnotu NO takhle: tvoje appka, včetně knihoven třetích stran, nepoužívá žádné šifrování, nebo jen šifrování vyjmuté z povinnosti dokumentace. Jinak je to YES.
Co je obvykle vyjmuté, podle stránky o exportních pravidlech: šifrování zabudované v systému, třeba HTTPS spojení přes URLSession. Co vyjmuté není: proprietární šifrování, které sis napsal nebo přibalil. Přehled exportní shody přidává důležitou připomínku: za výklad odpovídáš ty, a taky za důsledky, pokud si výjimku nárokuješ neprávem.
Pro Expo appku, která volá API přes HTTPS, ukládá nastavení a prodává předplatné, je false obvyklá odpověď. Pro appku, která sama šifruje zprávy, soubory nebo trezor, je odpověď true a Apple čeká dokumentaci.
Nedávej
falseautomaticky. Projdi si závislosti: knihovna pro end-to-end šifrování nebo vlastní šifrované úložiště tě posune na stranu dokumentace.
Pokud tvoje appka používá nevyjmuté šifrování
Stránka o dokumentaci šifrování popisuje postup. V App Information vedle App Encryption Documentation otevře tlačítko pro přidání otázky, pak přes Choose File nahraješ dokument a dáš Save. Apple chce, abys předtím vyplnil popis appky a nastavil její dostupnost, aby mohl posoudit, jestli dokumentace stačí. Cílí na zhruba dva pracovní dny, když je podklad kompletní.
Po schválení dokumentace ti Apple dá hodnotu, kterou vložíš do klíče ITSEncryptionExportComplianceCode ve svém Info.plist. S ní už otázky při každém odeslání nebudou. Během posuzování ukazuje build Waiting for Export Compliance Review nebo In Compliance Review: od tebe se nečeká žádná akce.
Dvě věci, na které Apple upozorňuje, jedna na stránce o exportních pravidlech, druhá v přehledu shody:
- I při vyjmutém šifrování může být vyžadována roční zpráva o sebeklasifikaci pro americkou vládu. Není potřeba, pokud používáš nevyjmuté šifrování a dokumentaci jsi Applu poskytl.
- Francie taky kontroluje import a export appek se šifrováním. Přehled od Applu uvádí jako dotčené oblasti zabezpečené úložiště, zabezpečenou komunikaci a antiviry, s výjimkami pro bankovní a zdravotnické appky, a odkazuje na ANSSI.
Co se pak děje v TestFlightu
Odblokovaný build pak žije normálním životem TestFlight buildu, jak to popisuje návod TestFlight pro testování iPhone appky: interní testeři hned, externí testeři po beta review a expirace po 90 dnech, podle seznamu stavů buildů. Další možné zádrhele při odesílání z Expo, třeba už použité číslo buildu nebo odmítnutý soubor, najdeš v chybách při odesílání z EAS do App Store Connect a celý proces v článku jak publikovat Expo appku na App Store přes EAS.
iOS & Android Kit obsahuje můj startovací kód v Expo, s tímhle klíčem už nastaveným, a cestu od prvního buildu až po stránku v App Storu. Jestli chceš vědět, co ti ještě brání v publikaci, bezplatná diagnostika ti odpoví po pár otázkách a pošle ti můj checklist proti odmítnutí od Applu. Kompletní kroky jsou v článku jak publikovat aplikaci na App Store.
Časté dotazy
Co znamená Missing Compliance v TestFlightu?
Build čeká na tvé prohlášení o exportní shodě, tedy na odpověď, jestli používáš šifrování. Apple ho řadí mezi stavy, které vyžadují akci od tebe. Dokud neodpovíš, build se k testerům nedostane.
Proč nejde rozkliknout odkaz Manage u Missing Compliance?
Ověř si roli: Apple nechává odpovídat jen role Account Holder, Admin a App Manager. Jinou příčinu Apple nedokumentuje. Pokud build právě dorazil, obnov stránku po e-mailu o dokončení zpracování.
Moje appka používá jen HTTPS, mám u šifrování odpovědět ano?
Apple uvádí, že šifrování zabudované v systému, třeba HTTPS spojení přes URLSession, je obvykle vyjmuté z povinnosti dokumentace. V tom případě má klíč ITSAppUsesNonExemptEncryption hodnotu NO, pokud žádná knihovna třetí strany nepřidává proprietární šifrování.
Musím na otázky o šifrování odpovídat u každého buildu?
Ano, dokud tvůj Info.plist neobsahuje klíč ITSAppUsesNonExemptEncryption. S ním se tě App Store Connect už ptát nebude. V Expo ho nastavíš v app.json přes ios.config.usesNonExemptEncryption.
Kde v app.json v Expo deklarovat šifrování?
V app.json pod expo.ios.config, s "usesNonExemptEncryption": false, pokud tvoje appka nepoužívá žádné nevyjmuté šifrování. EAS Build zapíše klíč do Info.plist buildu. Platí od příštího buildu, ne pro ten už odeslaný.
Blokuje Missing Compliance i odeslání na App Store?
Otázky k exportní shodě se kladou u každé nové verze, beta i pro App Store. Build, který na ně neodpověděl, nejde distribuovat. Klíč v Info.plist vyřeší oba případy najednou.
Musím podávat roční zprávu o sebeklasifikaci?
Apple upozorňuje, že i použití vyjmutého šifrování může vyžadovat roční zprávu o sebeklasifikaci pro americkou vládu, a odkazuje na oficiální postup. Pokud tvoje appka používá nevyjmuté šifrování a dokumentaci jsi Applu poskytl, tahle zpráva potřeba není.

