ITSAppUsesNonExemptEncryption: czy jest Ci potrzebny i co wpisać?
Każda kompilacja iOS trafia na jedno pytanie o amerykańską kontrolę eksportu, a nic w Xcode nie ostrzega, że ono nadchodzi. Pojawia się jako status „Missing Compliance”, który blokuje TestFlight i zatrzymuje Twoje zgłoszenie. Ta strona odpowiada na jedyne dwa pytania, które mają znaczenie: czy w ogóle tego potrzebujesz i jaka wartość sprawi, że pytanie nie wróci przy każdej kompilacji.
Ostatnia weryfikacja: 24 lipca 2026.
O co naprawdę pyta App Store Connect
Aplikacje rozprowadzane przez App Store są prawnie „eksportowane” ze Stanów Zjednoczonych, więc podlegają przepisom Export Administration Regulations (EAR). Gdy Twoja kompilacja używa szyfrowania, App Store Connect musi wiedzieć, czy jest to rodzaj zwyczajny (zwolniony), czy taki, który wymaga formalności (niezwolniony). Na tym kończy się sens tego pytania.
Haczyk: dziś praktycznie każda aplikacja używa szyfrowania, bo robi to każde wywołanie HTTPS. Odpowiedź na „czy aplikacja używa szyfrowania?” prawie zawsze brzmi więc tak — ale odpowiedź, która Cię odblokowuje, dotyczy tego, czy to szyfrowanie jest zwolnione, a dla zdecydowanej większości aplikacji jest.
Drzewo decyzyjne: czy używasz szyfrowania niezwolnionego?
Przejdź je po kolei. Pierwszy pasujący punkt rozstrzyga Twoją odpowiedź.
- Czy aplikacja nie używa żadnego szyfrowania albo niczego poza tym, co daje sam iOS? → Zwolniona. Odpowiedz NIE (ITSAppUsesNonExemptEncryption = false).
- Czy całe Twoje szyfrowanie ogranicza się do HTTPS/TLS albo standardowych API kryptograficznych dostarczanych przez Apple w iOS/macOS (CryptoKit, Keychain, Secure Enclave itd.)? → Zwolniona. Odpowiedz NIE. To obejmuje przytłaczającą większość aplikacji.
- Czy używasz szyfrowania wyłącznie do uwierzytelniania — haszowania haseł, podpisywania tokenów — a nie do szyfrowania treści użytkownika? → Zwolniona. Odpowiedz NIE.
- Czy dostarczasz WŁASNY algorytm szyfrujący albo używasz kryptografii do ochrony danych użytkownika poza powyższym (na przykład własny schemat end-to-end, autorski szyfr, pliki szyfrowane własnym zarządzaniem kluczami)? → Potencjalnie niezwolniona. Odpowiedz TAK i przeprowadź samoklasyfikację (patrz niżej).
Ponowne użycie standardowej kryptografii przez własną nakładkę nie czyni jej niezwolnioną — liczy się algorytm bazowy, a nie opakowanie. Dopiero wymyślenie albo osadzenie niestandardowego algorytmu przesuwa Cię do kategorii niezwolnionej.
Dwa sposoby odpowiedzi — i dlaczego wygrywa plist
Są dokładnie dwa miejsca, w których można odpowiedzieć. Nie są równoważne: jedno pyta przy każdym wydaniu, drugie odpowiada raz i pozostaje odpowiedziane.
| Gdzie | Jak często pyta | Najlepsze dla |
|---|---|---|
| Pytanie w App Store Connect | Przy każdej kompilacji. Każde wgranie do TestFlight albo App Store pokazuje „Missing Compliance”, dopóki ponownie nie przeklikasz pytań. | Przypadków jednorazowych albo sytuacji, gdy nie możesz teraz wydać nowego pliku binarnego. |
| ITSAppUsesNonExemptEncryption w Info.plist | Nigdy więcej. Wartość podróżuje w pliku binarnym; App Store Connect ją odczytuje i pomija pytanie dla tej kompilacji oraz wszystkich kolejnych zawierających ten klucz. | Każdej aplikacji, która nie dostarcza własnego szyfrowania — ustaw raz i zapomnij. |
Dokładny fragment pliku plist
Dodaj to do Info.plist celu swojej aplikacji (albo przez kartę Info / plik xcconfig). To wartość logiczna:
<key>ITSAppUsesNonExemptEncryption</key> <false/>
Potem Clean Build Folder (⇧⌘K), ponowna archiwizacja i wgranie. Ustawienie false jest poprawne tylko wtedy, gdy aplikacja jest zwolniona zgodnie z drzewem powyżej — to deklaracja prawna, a nie przycisk wyciszenia. Jeden niuans: kompilacja, która już leży w App Store Connect, nie podchwyci klucza wstecznie. Odpowiedz ręcznie na pytanie dla tej jednej kompilacji, żeby ją teraz odblokować, i wyślij klucz w kolejnym archiwum, by pytanie już nie wracało.
Kiedy naprawdę potrzebujesz zwolnienia / samoklasyfikacji
Jeśli pasował punkt 4 drzewa — dostarczasz szyfrowanie niestandardowe albo własne — odpowiedź TAK to nie koniec. Bierzesz na siebie realne obowiązki wynikające z EAR:
- Samoklasyfikacja: ustal ECCN swojej aplikacji (zwykle 5D002) i potwierdź, że kwalifikuje się do License Exception ENC zgodnie z EAR §740.17.
- Roczny raport samoklasyfikacji: dla większości masowych aplikacji szyfrujących trzeba raz w roku wysłać mailem raport do BIS oraz do koordynatora zgłoszeń szyfrowania ENC/NSA (raport roczny).
- CCATS: niektóre produkty wymagają formalnej klasyfikacji (CCATS) z Bureau of Industry and Security, zanim się zakwalifikują — App Store Connect poprosi wtedy o to zezwolenie.
- Dokumentacja w App Store Connect: w sekcji szyfrowania podajesz podstawę zwolnienia albo dane CCATS/ERN, dla każdego wydania, chyba że dostarczyłeś kod zgodności.
W aplikacjach konsumenckich to naprawdę rzadkość. Jeśli używasz CryptoKit, Keychain, TLS i niczego egzotycznego, jesteś zwolniony i nic z tego Cię nie dotyczy — odpowiedz NIE i jedź dalej.
Nie masz pewności, czy Twoja kryptografia jest zwolniona? Apple odsyła do amerykańskiego Bureau of Industry and Security; praktyczny test brzmi: „czy zaimplementowałem algorytm szyfrujący, czy tylko wywołuję ten od Apple / używam HTTPS?”. To drugie jest zwolnione.
Typowa wpadka: klucza w ogóle nie ma
Najczęściej boli nie zła wartość, tylko brak wartości. Gdy klucza nie ma:
- Każda kompilacja TestFlight ląduje w „Missing Compliance”, a testerzy nie mogą jej zainstalować, dopóki nie odpowiesz na pytanie w App Store Connect — zaproszenia po prostu nie docierają.
- Kompilacja zgłoszona do App Store nie przechodzi do weryfikacji, dopóki zgodność nie zostanie rozstrzygnięta, więc stoi w miejscu, gdy Ty sądzisz, że czeka w kolejce.
- Ponieważ pytanie wraca przy każdym wgraniu, potok CI/CD automatycznie zgłaszający kompilacje blokuje się przy każdym uruchomieniu — klasyczne „dlaczego TestFlight stoi”.
Rozwiązanie jest takie samo jak wyżej: ustaw ITSAppUsesNonExemptEncryption raz w Info.plist (jeśli jesteś zwolniony), by żadna kompilacja nigdy więcej nie wpadła w stan Missing Compliance.
Najczęstsze pytania
Moja aplikacja wykonuje tylko wywołania HTTPS. Czy jest zwolniona?
Tak. HTTPS/TLS i standardowa kryptografia wbudowana w iOS to szyfrowanie zwolnione. Ustaw ITSAppUsesNonExemptEncryption na NO. Dotyczy to zdecydowanej większości aplikacji.
Czy ustawienie klucza na NO załatwia i TestFlight, i App Store?
Tak — ta sama wartość w Info.plist spełnia pytanie o zgodność eksportową dla dystrybucji przez TestFlight i przez App Store naraz, więc decydujesz raz, a nie kanał po kanale.
Ustawiłem klucz, a App Store Connect nadal pokazuje Missing Compliance. Dlaczego?
Kompilacja wgrana przed dodaniem klucza nie podchwyci go wstecznie. Odpowiedz ręcznie na pytanie tej kompilacji w App Store Connect, by ją odblokować, a klucz wyślij w kolejnym archiwum — przyszłe kompilacje już nie zapytają.
Czy odpowiedź NIE bywa złym wyborem?
Tak, jeśli faktycznie dostarczasz szyfrowanie niezwolnione: własny algorytm albo kryptografię chroniącą dane użytkownika poza HTTPS i kryptografią systemu. Wtedy musisz odpowiedzieć TAK i przeprowadzić samoklasyfikację (ECCN, License Exception ENC, ewentualnie raport roczny albo CCATS). To deklaracja prawna, więc odpowiadaj zgodnie z prawdą.
Czym jest roczny raport o szyfrowaniu?
Dla aplikacji masowych używających szyfrowania niezwolnionego w ramach License Exception ENC przepisy amerykańskie wymagają rocznego raportu samoklasyfikacji wysyłanego mailem do BIS i koordynatora ENC. Aplikacje zwolnione (tylko HTTPS) go nie składają.
Zobacz też: Manifest prywatności Apple (PrivacyInfo.xcprivacy) · Lista kontrolna wysyłki do App Store
Źródła
Sprawdź swoją kompilację przed przesłaniem
Przepuść plik .ipa lub .apk przez App Review Checker i wychwyć te problemy w kilka sekund.
Sprawdź aplikację