ITMS-90683: oprava „Missing purpose string“ v Expo
Autor: Mehdi Azizi
Publikováno , 6 min
ITMS-90683 Missing purpose string: proč Apple odmítne tvůj build, jaký klíč přidat do app.json v Expo a jak chybějící klíče najít ještě před odesláním.
ITMS-90683 je automatické odmítnutí od Applu: přijde e-mailem krátce po odeslání buildu, ještě před jakoukoli lidskou kontrolou. Znamená, že v tvém souboru Info.plist chybí věta, která vysvětluje, proč aplikace přistupuje k citlivým datům. Oprava jsou dva kroky: přidat klíč uvedený ve zprávě do ios.infoPlist a udělat nový build.
Mně se to stalo u Solys, mého budíku s minihrami, kvůli datům, která aplikace vůbec nepoužívá. Tady je, co zpráva znamená, proč přijde a jak se jí vyhnout.
Co znamená chyba ITMS-90683?
Celá zpráva se jmenuje „ITMS-90683: Missing purpose string in Info.plist“. Říká, že kód tvé aplikace odkazuje na API, které pracuje s citlivými daty (fotky, kamera, mikrofon, poloha, kontakty), a že tvůj Info.plist neobsahuje odpovídající klíč s popisem. Zpráva ten klíč jmenuje, například NSPhotoLibraryUsageDescription.
Tahle popisná věta se jmenuje „purpose string“. Je to text, který iOS zobrazí v okně se žádostí o povolení. Apple to píše ve své dokumentaci o přístupu k chráněným zdrojům: App Review odmítá aplikace, jejichž kód k těmto zdrojům přistupuje bez purpose stringu.
Nejde o odmítnutí od revieweru. Kontrola je automatická a proběhne při doručení buildu, ještě před zařazením do review, stejně jako ITMS-91053 u privacy manifestu. Build je vyřazen a musíš poslat nový.
Proč Apple odmítá, i když tvoje aplikace ta data nepoužívá
Tohle překvapí nejvíc. Apple analyzuje kód obsažený v buildu, ne to, co aplikace doopravdy dělá. Pokud knihovna, kterou máš v aplikaci, obsahuje odkaz na knihovnu fotek, klíč je povinný, i když žádná obrazovka o přístup k fotkám nikdy nežádá. Sama zpráva od Applu to uvádí: na tato API může odkazovat externí knihovna nebo SDK a purpose string je i tak povinný.
Můj případ, 26. září 2026. Při úklidu konfigurace Solys jsem odstranil klíč NSPhotoLibraryUsageDescription, protože aplikace na žádné fotky nesahá. Další build byl odmítnut s ITMS-90683. Příčina: dvě knihovny Expo, které aplikace používá, expo-image a expo-file-system, obsahují kód odkazující na knihovnu fotek. Předchozí build prošel, protože tam klíč ještě byl.
Ponaučení: popisný klíč se neodstraňuje „protože ho nepoužívám“. Odstraňuje se, až když na dané API už neodkazuje žádná knihovna v buildu.
Nejčastější klíče
NSPhotoLibraryUsageDescription: čtení nebo zápis fotek.NSPhotoLibraryAddUsageDescription: přidávání fotek bez čtení.NSCameraUsageDescription: kamera.NSMicrophoneUsageDescription: mikrofon.NSLocationWhenInUseUsageDescription: poloha během používání.NSContactsUsageDescription: kontakty.NSUserTrackingUsageDescription: reklamní sledování (App Tracking Transparency).
Apple popisuje každý klíč ve své dokumentaci, například NSPhotoLibraryUsageDescription: je povinný, jakmile aplikace používá API, které čte nebo zapisuje do knihovny fotek.
Oprava ITMS-90683 v aplikaci Expo
- Zjisti klíč uvedený v e-mailu od Applu. Zpráva uvádí jeho přesný název.
- Přidej ho do konfigurace pod
ios.infoPlist, jak uvádí dokumentace Expo k oprávněním:
{
"expo": {
"ios": {
"infoPlist": {
"NSPhotoLibraryUsageDescription": "Solys nepřistupuje k tvým fotkám. O toto oprávnění nikdy nežádá."
}
}
}
}
- Udělej nový build. Expo to říká jasně: změna Info.plist se nedá dostat ven vzdálenou aktualizací, potřebuje nový binární soubor.
- Pošli build znovu Applu a pak ho vyber ve své verzi.
Past, pokud máš aplikaci přeloženou: jazykové soubory klíč překládají, ale nedeklarují. Klíč musí nejdřív existovat v ios.infoPlist (nebo v konfiguraci příslušného pluginu). Jinak může aplikace spadnout při prvním volání.
Jakou větu napsat, když aplikace ta data nepoužívá?
Apple chce přesný, užitečný a konkrétní popis. Pokud aplikace data opravdu používá, řekni jednou větou, k čemu: „Aplikace používá kameru ke skenování čárového kódu tvé vstupenky.“
Pokud tam klíč je jen kvůli knihovně, Apple nabízí dvě řešení: napsat větu, nebo odstranit kód, který k datům přistupuje. Když ten kód pochází z knihovny, jednoduše ho odstranit nemůžeš. U Solys jsem tedy napsal pravdu: „Solys nepřistupuje k tvým fotkám. O toto oprávnění nikdy nežádá.“ Je to pragmatická volba: další build při doručení prošel, ale nemůžu ti slíbit, že Apple tuhle větu přijme vždycky.
Jak najít chybějící klíče před odesláním
Z kořene projektu tenhle příkaz vypíše soubory knihoven, jejichž iOS kód odkazuje na nejsledovanější API:
grep -rlE "PHPhotoLibrary|AVCaptureDevice|CLLocationManager|CNContactStore|EKEventStore|ATTrackingManager" \
node_modules/*/ios node_modules/@*/*/ios
Každý název odpovídá jednomu typu dat: PHPhotoLibrary fotkám, AVCaptureDevice kameře a mikrofonu, CLLocationManager poloze, CNContactStore kontaktům, EKEventStore kalendáři, ATTrackingManager sledování. U každého výsledku ověř, že odpovídající popisný klíč v konfiguraci máš.
Tahle síť zachytí případy, na které jsem narazil. Nenahrazuje ale přečtení e-mailu od Applu, který zůstává jediným spolehlivým seznamem, stejně jako u neveřejných API v ITMS-90338. Od toho odmítnutí tuhle kontrolu dělám před každým buildem: zabere pár sekund, kdežto odmítnutí ITMS-90683 stojí jeden build a čas na jeho zopakování.
Jak poslat build bez nepříjemných překvapení
ITMS-90683 opravíš rychle, když víš, jak ho číst, stejně jako ITMS-90725, který se týká verze Xcode. Odmítnutí, která přijdou potom, ta od revieweru, chtějí víc nadhledu: postup najdeš na stránce aplikace odmítnutá Applem a nejčastější důvody v článku proč Apple odmítá aplikace.
Na kontrolu podkladů před odesláním je tu Apple Review Kit: obsahuje můj checklist a skills pro Claude Code, které projdou tvůj projekt. Pokud se ti odeslání zaseklo a chceš lidský pohled, rezervuj si se mnou hodinu: projdeme tvůj projekt přes videohovor, na tvé obrazovce. A pokud chystáš své první vydání, udělej si bezplatnou diagnostiku: seřadí ti kroky a pošle ti můj checklist proti odmítnutí od Applu.
Časté dotazy
Je ITMS-90683 odmítnutí od App Review?
Ne ve smyslu lidského revieweru. Je to automatická kontrola buildu při doručení, ještě před zařazením do review, stejně jako ITMS-90717 u ikony. Nikdo tvou aplikaci neotevřel. Build je vyřazen: musíš opravit Info.plist a poslat nový.
Proč Apple chce klíč pro data, která moje aplikace nepoužívá?
Protože Apple analyzuje kód v buildu, ne chování aplikace. Pokud přibalená knihovna odkazuje na knihovnu fotek nebo kameru, popisný klíč je povinný, i když žádná obrazovka o ten přístup nikdy nežádá.
Dá se ITMS-90683 opravit vzdálenou aktualizací?
Ne. Chybějící klíč patří do Info.plist, který je součástí binárního souboru. Vzdálená aktualizace tento soubor nemění: musíš udělat nový build a poslat ho Applu.
Kam přidat NSPhotoLibraryUsageDescription v projektu Expo?
Do konfigurace aplikace pod ios.infoPlist, s větou, která popisuje použití. Některé knihovny nabízejí i vlastní nastavení ve svém pluginu, které může přidat další klíče, třeba režim na pozadí. V obou případech musí klíč existovat v základní konfiguraci, nejen v souborech s překlady.
Mám odstranit nepoužívané popisné klíče?
Jen pokud na dané API už neodkazuje žádná knihovna v buildu. Jinak bude další odeslání odmítnuto s ITMS-90683. Než klíč odstraníš, vyhledej název API v iOS kódu svých závislostí.