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

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

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


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

Apple popisuje každý klíč ve své dokumentaci, například [NSPhotoLibraryUsageDescription](https://developer.apple.com/documentation/bundleresources/information-property-list/nsphotolibraryusagedescription): je povinný, jakmile aplikace používá API, které čte nebo zapisuje do knihovny fotek.

## Oprava ITMS-90683 v aplikaci Expo

1. **Zjisti klíč uvedený v e-mailu od Applu.** Zpráva uvádí jeho přesný název.
2. **Přidej ho do konfigurace** pod `ios.infoPlist`, jak uvádí [dokumentace Expo k oprávněním](https://docs.expo.dev/guides/permissions/):

```json
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSPhotoLibraryUsageDescription": "Solys nepřistupuje k tvým fotkám. O toto oprávnění nikdy nežádá."
      }
    }
  }
}
```

3. **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.
4. **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:

```bash
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](https://devoria.fr/cs/expertise/aplikace-zamitnuta-applem) a nejčastější důvody v článku [proč Apple odmítá aplikace](https://devoria.fr/cs/blog/apple-zamitl-aplikaci-duvody).

Na kontrolu podkladů před odesláním je tu [Apple Review Kit](https://devoria.fr/cs/kits/review-apple): 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](https://devoria.fr/cs/coaching): projdeme tvůj projekt přes videohovor, na tvé obrazovce. A pokud chystáš své první vydání, [udělej si bezplatnou diagnostiku](https://devoria.fr/cs/diagnostic): 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í.


## Tvůj projekt

[Apple Review Kit](https://devoria.fr/cs/kits/review-apple): Checklist pro App Store review, který používám, moje opravená zamítnutí od Applu, poznámky pro testera a dva skills pro Claude Code, které zkontrolují tvou aplikaci. 29 €.

[iOS Kit](https://devoria.fr/cs/kits/ios): Vytvoř svou iPhone aplikaci s Claude Code: startovní kód mých aplikací, skills, které kontrolují jeho práci, a Apple Review Kit, App Store Screenshots Kit a ASO Kit. 129,99 €.
