# ITMS-90683: oprava „Missing purpose string“ v Expo

> 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.

Pôvodná stránka: [ITMS-90683: oprava „Missing purpose string“ v Expo](https://devoria.fr/sk/blog/itms-90683-missing-purpose-string-expo)
Autor: [Mehdi Azizi](https://devoria.fr/sk/mehdi-azizi)
Zverejnenie: 2026-10-09
Posledná revízia obsahu: 2026-10-09


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](https://developer.apple.com/documentation/uikit/requesting-access-to-protected-resources): 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](https://devoria.fr/sk/blog/itms-91053-missing-api-declaration-expo) 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](https://devoria.fr/sk/blog/guideline-5-1-2-ai-tretich-stran-att-zdielanie-dat)).

Apple popisuje každý kľúč vo svojej dokumentácii, napríklad [NSPhotoLibraryUsageDescription](https://developer.apple.com/documentation/bundleresources/information-property-list/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

1. **Zisti kľúč uvedený v e-maile od Apple.** Správa uvádza jeho presný názov.
2. **Pridaj ho do konfigurácie** pod `ios.infoPlist`, ako uvádza [dokumentácia Expo k povoleniam](https://docs.expo.dev/guides/permissions/):

```json
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSPhotoLibraryUsageDescription": "Solys nepristupuje k tvojim fotkám. O toto povolenie nikdy nežiada."
      }
    }
  }
}
```

3. **Sprav nový build.** Expo to spresňuje: zmena Info.plist sa nedá doručiť vzdialenou aktualizáciou, vyžaduje nový binárny súbor.
4. **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:

```bash
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](https://devoria.fr/sk/expertise/aplikacia-zamietnuta-apple) a najčastejšie dôvody v článku [prečo Apple odmieta appky](https://devoria.fr/sk/blog/zamietnutie-aplikacie-apple-pricina).

Na kontrolu podkladov pred odoslaním je tu [Apple Review Kit](https://devoria.fr/sk/kits/review-apple), 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](https://devoria.fr/sk/coaching): prejdeme tvoj projekt cez videohovor, na tvojej obrazovke. A ak chystáš svoje prvé vydanie, [sprav si bezplatnú diagnostiku](https://devoria.fr/sk/diagnostic): 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í.


## Tvoj projekt

[Apple Review Kit](https://devoria.fr/sk/kits/review-apple): Checklist na App Store review, ktorý používam, moje opravené zamietnutia od Apple, poznámky pre testera a dva skills pre Claude Code, ktoré skontrolujú tvoju appku. 29 €.

[iOS Kit](https://devoria.fr/sk/kits/ios): Vytvor iPhone appku s Claude Code: štartovací kód mojich appiek, skills, ktoré kontrolujú jeho prácu, a Apple Review Kit, App Store Screenshots Kit a ASO Kit. 129,99 €.
