ITMS-90683: oprava „Missing purpose string“ v Expo
Autor: Mehdi Azizi
Zverejnené , 6 min
ITMS-90683 Missing purpose string: prečo Apple odmietne tvoj build, aký kľúč pridať do app.json v Expo a ako odhaliť chýbajúce kľúče pred odoslaním.
ITMS-90683 je automatické odmietnutie od Apple: príde e-mailom krátko po odoslaní buildu, ešte pred akoukoľvek ľudskou kontrolou. Znamená, že v tvojom súbore Info.plist chýba veta, ktorá vysvetľuje, prečo appka pristupuje k citlivým údajom. Oprava sú dva kroky: pridať kľúč uvedený v správe do ios.infoPlist a potom spraviť nový build.
Mne sa to stalo pri Solys, mojom budíku s minihrami, kvôli údajom, ktoré appka vôbec nepoužíva. Tu je, čo správa znamená, prečo prichádza a ako sa jej vyhnúť.
Čo znamená chyba ITMS-90683?
Celá správa má názov „ITMS-90683: Missing purpose string in Info.plist“. Hovorí, že kód tvojej appky odkazuje na API, ktoré pracuje s citlivými údajmi (fotky, kamera, mikrofón, poloha, kontakty), a že tvoj Info.plist neobsahuje zodpovedajúci popisný kľúč. Správa tento kľúč menuje, napríklad NSPhotoLibraryUsageDescription.
Tejto popisnej vete sa hovorí „purpose string“. Je to text, ktorý iOS zobrazí v okne so žiadosťou o povolenie. Apple to píše vo svojej dokumentácii o prístupe k chráneným zdrojom: App Review odmieta appky, ktorých kód k týmto zdrojom pristupuje bez purpose string.
Nie je to odmietnutie od reviewera. Kontrola je automatická a prebehne pri doručení buildu, ešte pred zaradením do revízie, rovnako ako ITMS-91053 pri privacy manifeste. Build je vyradený a musíš poslať nový.
Prečo Apple odmieta, aj keď tvoja appka tieto údaje nepoužíva
Toto ľudí prekvapí. Apple analyzuje kód obsiahnutý v tvojom builde, nie to, čo tvoja appka reálne robí. Ak knižnica, ktorú pribaľuješ, obsahuje odkaz na knižnicu fotiek, kľúč je povinný, aj keď žiadna obrazovka nikdy o prístup k fotkám nežiada. Sama správa od Apple to spresňuje: na tieto API môže odkazovať aj externá knižnica alebo SDK a purpose string zostáva povinný.
Môj prípad, 26. septembra 2026. Pri upratovaní konfigurácie Solys som odstránil kľúč NSPhotoLibraryUsageDescription, keďže appka na žiadne fotky nesiaha. Ďalší build bol odmietnutý s ITMS-90683. Príčina: dve knižnice Expo, ktoré appka používa, expo-image a expo-file-system, obsahujú kód odkazujúci na knižnicu fotiek. Predchádzajúci build prešiel, lebo kľúč tam ešte bol.
Ponaučenie: popisný kľúč neodstraňuješ „lebo ho nepoužívam“. Odstrániš ho, až keď na dané API neodkazuje už žiadna knižnica v builde.
Najčastejšie kľúče
NSPhotoLibraryUsageDescription: čítanie alebo zápis fotiek.NSPhotoLibraryAddUsageDescription: pridávanie fotiek bez čítania.NSCameraUsageDescription: kamera.NSMicrophoneUsageDescription: mikrofón.NSLocationWhenInUseUsageDescription: poloha počas používania.NSContactsUsageDescription: kontakty.NSUserTrackingUsageDescription: reklamné sledovanie (App Tracking Transparency).
Apple popisuje každý kľúč vo svojej dokumentácii, napríklad NSPhotoLibraryUsageDescription: je povinný, hneď ako appka používa API, ktoré číta z knižnice fotiek alebo do nej zapisuje.
Oprava ITMS-90683 v Expo appke
- Zisti kľúč uvedený v e-maile od Apple. Správa uvádza jeho presný názov.
- Pridaj ho do konfigurácie pod
ios.infoPlist, ako uvádza dokumentácia Expo k povoleniam:
{
"expo": {
"ios": {
"infoPlist": {
"NSPhotoLibraryUsageDescription": "Solys nepristupuje k tvojim fotkám. O toto povolenie nikdy nežiada."
}
}
}
}
- Sprav nový build. Expo to spresňuje: zmena Info.plist sa nedá doručiť vzdialenou aktualizáciou, vyžaduje nový binárny súbor.
- Pošli build znova do Apple a potom ho vyber vo svojej verzii.
Pasca, ak je tvoja appka preložená: jazykové súbory kľúč prekladajú, nedeklarujú ho. Kľúč musí najprv existovať v ios.infoPlist (alebo v konfigurácii príslušného pluginu). Inak môže appka spadnúť pri prvom volaní.
Akú vetu napísať, ak tvoja appka tieto údaje nepoužíva?
Apple žiada presný, užitočný a konkrétny popis. Ak appka údaje naozaj používa, povedz jednou vetou, na čo: „Appka používa kameru na naskenovanie čiarového kódu tvojej vstupenky.“
Ak je kľúč tam len kvôli knižnici, Apple ponúka dve riešenia: napísať vetu, alebo odstrániť kód, ktorý k údajom pristupuje. Keď ten kód pochádza z knižnice, jednoducho ho odstrániť nemôžeš. Pri Solys som teda napísal pravdu: „Solys nepristupuje k tvojim fotkám. O toto povolenie nikdy nežiada.“ Je to pragmatická voľba: ďalší build pri doručení prešiel, ale nemôžem ti sľúbiť, že Apple túto vetu prijme vždy.
Ako odhaliť chýbajúce kľúče pred odoslaním
Z koreňa projektu tento príkaz vypíše súbory knižníc, ktorých iOS kód odkazuje na najsledovanejšie API:
grep -rlE "PHPhotoLibrary|AVCaptureDevice|CLLocationManager|CNContactStore|EKEventStore|ATTrackingManager" \
node_modules/*/ios node_modules/@*/*/ios
Každý názov zodpovedá jednému typu údajov: PHPhotoLibrary fotkám, AVCaptureDevice kamere a mikrofónu, CLLocationManager polohe, CNContactStore kontaktom, EKEventStore kalendáru, ATTrackingManager sledovaniu. Pri každom výsledku over, že príslušný popisný kľúč v konfigurácii existuje.
Táto poistka zachytí prípady, na ktoré som narazil. Nenahrádza však prečítanie e-mailu od Apple, ktorý zostáva jediným spoľahlivým zoznamom, podobne ako pri neverejných API v ITMS-90338. Od toho odmietnutia robím túto kontrolu pred každým buildom: trvá pár sekúnd, kým odmietnutie ITMS-90683 stojí jeden build a čas na jeho zopakovanie.
Pošli build bez nepríjemných prekvapení
ITMS-90683 sa opraví rýchlo, keď ho vieš čítať, rovnako ako ITMS-90725, ktorý sa týka verzie Xcode. Odmietnutia, ktoré prídu potom, tie od reviewera, si vyžadujú viac nadhľadu: postup nájdeš na stránke appka odmietnutá od Apple a najčastejšie dôvody v článku prečo Apple odmieta appky.
Na kontrolu podkladov pred odoslaním je tu Apple Review Kit, ktorý obsahuje môj checklist a skills pre Claude Code, ktoré prejdú tvoj projekt. Ak sa ti odoslanie zasekne a chceš ľudský pohľad, rezervuj si so mnou hodinu: prejdeme tvoj projekt cez videohovor, na tvojej obrazovke. A ak chystáš svoje prvé vydanie, sprav si bezplatnú diagnostiku: zoradí kroky v správnom poradí a pošle ti môj checklist proti odmietnutiu od Apple.
Často kladené otázky
Je ITMS-90683 odmietnutie od App Review?
Nie v zmysle ľudského reviewera. Je to automatická kontrola buildu pri doručení, ešte pred revíziou, ako ITMS-90717 pri ikone. Nikto tvoju appku neotvoril. Build je vyradený: musíš opraviť Info.plist a poslať nový.
Prečo Apple žiada kľúč pre údaje, ktoré moja appka nepoužíva?
Pretože Apple analyzuje kód v builde, nie správanie appky. Ak pribalená knižnica odkazuje na knižnicu fotiek alebo kameru, popisný kľúč je povinný, aj keď o tento prístup nikdy nežiada žiadna obrazovka.
Dá sa ITMS-90683 opraviť vzdialenou aktualizáciou?
Nie. Chýbajúci kľúč je v Info.plist, ktorý je súčasťou binárneho súboru. Vzdialená aktualizácia tento súbor nemení: musíš spraviť nový build a poslať ho do Apple.
Kam pridať NSPhotoLibraryUsageDescription v Expo projekte?
Do konfigurácie appky pod ios.infoPlist, s vetou, ktorá popisuje použitie. Niektoré knižnice ponúkajú aj vlastné nastavenie vo svojom plugine, ktoré môže pridať ďalšie kľúče, napríklad režim na pozadí. V oboch prípadoch musí kľúč existovať v základnej konfigurácii, nielen v súboroch s prekladmi.
Treba odstrániť nepoužívané popisné kľúče?
Len ak na dané API už neodkazuje žiadna knižnica v builde. Inak bude ďalšie odoslanie odmietnuté s ITMS-90683. Skôr než kľúč odstrániš, vyhľadaj názov API v iOS kóde svojich závislostí.