# ITMS-90683 javítása: „Missing purpose string” Expóval

> ITMS-90683 Missing purpose string: miért utasítja el az Apple a buildet, melyik kulcsot add az app.json-hoz Expóval, és hogyan szűrd ki előre a hiányzókat.

Eredeti oldal: [ITMS-90683 javítása: „Missing purpose string” Expóval](https://devoria.fr/hu/blog/itms-90683-missing-purpose-string-expo)
Szerző: [Mehdi Azizi](https://devoria.fr/hu/mehdi-azizi)
Megjelenés: 2026-10-09
A tartalom utolsó frissítése: 2026-10-09


ITMS-90683 az Apple automatikus elutasítása: e-mailben érkezik nem sokkal azután, hogy feltöltötted a buildet, még mielőtt bármilyen emberi ellenőrzés történne. Azt jelenti, hogy az Info.plist fájlodból hiányzik az a mondat, amely elmagyarázza, miért fér hozzá az app egy érzékeny adathoz. **A javítás két lépés: add hozzá az üzenetben említett kulcsot az `ios.infoPlist`-hez, aztán készíts új buildet.**

Én a Solysnál, a minijátékos ébresztőórámnál kaptam meg, egy olyan adat miatt, amit az app nem is használ. Megmutatom, mit jelent az üzenet, miért jön, és hogyan kerülheted el.

## Mit jelent az ITMS-90683 hiba?

A teljes üzenet címe: „ITMS-90683: Missing purpose string in Info.plist”. Azt mondja, hogy az appod kódja olyan API-ra hivatkozik, amely érzékeny adatokhoz nyúl (fotók, kamera, mikrofon, helyadatok, névjegyek), és az Info.plist nem tartalmazza a hozzá tartozó leíró kulcsot. Az üzenet meg is nevezi ezt a kulcsot, például `NSPhotoLibraryUsageDescription`.

Ezt a leíró mondatot „purpose stringnek” hívják. Ezt a szöveget mutatja az iOS az engedélykérő ablakban. Az Apple a [védett erőforrások eléréséről](https://developer.apple.com/documentation/uikit/requesting-access-to-protected-resources) szóló dokumentációjában le is írja: az App Review elutasítja azokat az appokat, amelyek kódja purpose string nélkül fér hozzá ezekhez az erőforrásokhoz.

Ez nem egy reviewer elutasítása. Az ellenőrzés automatikus, és a build beküldésekor fut le, még a review előtt, ahogy az adatvédelmi manifesztnél az [ITMS-91053](https://devoria.fr/hu/blog/itms-91053-missing-api-declaration-expo). A buildet kidobják, és újat kell küldened.

## Miért utasít el az Apple, ha az appod nem is használja ezt az adatot?

Ez a meglepő rész. **Az Apple a buildben lévő kódot elemzi, nem azt, amit az appod ténylegesen csinál.** Ha egy beépített könyvtár hivatkozik a fotókönyvtárra, a kulcs kötelező, akkor is, ha egyetlen képernyő sem kér soha hozzáférést a fotókhoz. Az Apple üzenete maga is jelzi: egy külső könyvtár vagy SDK is hivatkozhat ezekre az API-kra, és a purpose string ilyenkor is kötelező.

Az én esetem, 2026. szeptember 26. A Solys konfigurációjának takarításakor kivettem a `NSPhotoLibraryUsageDescription` kulcsot, hiszen az app egyetlen fotóhoz sem nyúl. A következő buildet ITMS-90683-mal elutasították. Az ok: az app két Expo-könyvtára, az `expo-image` és az `expo-file-system` olyan kódot tartalmaz, amely a fotókönyvtárra hivatkozik. Az előző build átment, mert ott még megvolt a kulcs.

**A tanulság**: egy leíró kulcsot nem veszel ki csak azért, mert „nem használod”. Csak akkor veheted ki, ha a buildben már egyetlen könyvtár sem hivatkozik az API-ra.

## A leggyakoribb kulcsok

- `NSPhotoLibraryUsageDescription`: fotók olvasása vagy írása.
- `NSPhotoLibraryAddUsageDescription`: fotók hozzáadása, olvasás nélkül.
- `NSCameraUsageDescription`: kamera.
- `NSMicrophoneUsageDescription`: mikrofon.
- `NSLocationWhenInUseUsageDescription`: helyadat használat közben.
- `NSContactsUsageDescription`: névjegyek.
- `NSUserTrackingUsageDescription`: hirdetési követés ([App Tracking Transparency](https://devoria.fr/hu/blog/guideline-5-1-2-kulso-mi-att-adatmegosztas)).

Az Apple minden kulcsot leír a dokumentációjában, például a [NSPhotoLibraryUsageDescription](https://developer.apple.com/documentation/bundleresources/information-property-list/nsphotolibraryusagedescription) oldalán: ez a kulcs kötelező, amint az app olyan API-t használ, amely olvas a fotókönyvtárból vagy ír bele.

## ITMS-90683 javítása Expo appban

1. **Írd ki az Apple e-mailjében szereplő kulcsot.** Az üzenet megadja a pontos nevét.
2. **Add hozzá a konfigurációdhoz** az `ios.infoPlist` alá, ahogy az [Expo engedélyekről szóló dokumentációja](https://docs.expo.dev/guides/permissions/) mutatja:

```json
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSPhotoLibraryUsageDescription": "A Solys nem fér hozzá a fotóidhoz. Ezt az engedélyt soha nem kéri."
      }
    }
  }
}
```

3. **Készíts új buildet.** Az Expo is kiemeli: az Info.plist módosítása nem megy át távoli frissítéssel, új binárist igényel.
4. **Küldd be újra a buildet** az Apple-nek, aztán válaszd ki a verziódnál.

Egy csapda, ha az appod le van fordítva: a nyelvi fájlok lefordítják a kulcsot, de nem deklarálják. A kulcsnak előbb léteznie kell az `ios.infoPlist`-ben (vagy az adott plugin konfigurációjában). Különben az app összeomolhat az első hívásnál.

## Milyen mondatot írj, ha az appod nem használja az adatot?

Az Apple pontos, hasznos és konkrét leírást kér. Ha az appod tényleg használja az adatot, mondd meg egy mondatban, mire: „Az app a kamerát a jegyed vonalkódjának beolvasására használja.”

Ha a kulcs csak egy könyvtár miatt van ott, az Apple két megoldást ad: megírni a mondatot, vagy eltávolítani az adathoz hozzáférő kódot. Ha ez a kód egy könyvtárból jön, nem tudod egyszerűen eltávolítani. A Solysnál ezért az igazat írtam: „A Solys nem fér hozzá a fotóidhoz. Ezt az engedélyt soha nem kéri.” Ez pragmatikus döntés: a következő build átment a beküldésen, de nem ígérhetem, hogy az Apple mindig elfogadja ezt a mondatot.

## Hiányzó kulcsok kiszűrése beküldés előtt

A projekted gyökeréből ez a parancs kilistázza azokat a könyvtárfájlokat, amelyek iOS-kódja a leginkább figyelt API-kra hivatkozik:

```bash
grep -rlE "PHPhotoLibrary|AVCaptureDevice|CLLocationManager|CNContactStore|EKEventStore|ATTrackingManager" \
  node_modules/*/ios node_modules/@*/*/ios
```

Minden név egy adattípusnak felel meg: `PHPhotoLibrary` a fotóknak, `AVCaptureDevice` a kamerának és a mikrofonnak, `CLLocationManager` a helyadatnak, `CNContactStore` a névjegyeknek, `EKEventStore` a naptárnak, `ATTrackingManager` a követésnek. Minden találatnál ellenőrizd, hogy a megfelelő leíró kulcs szerepel a konfigurációdban.

Ez a háló elkapja azokat az eseteket, amikkel én találkoztam. Az Apple e-mailjének elolvasását nem helyettesíti, mert az marad az egyetlen biztos lista, ahogy a nem nyilvános API-knál az ITMS-90338 esetében is. Ennél az elutasításnál óta minden build előtt lefuttatom ezt az ellenőrzést: pár másodperc, míg egy ITMS-90683 elutasítás egy buildbe és az újraépítés idejébe kerül.

## Küldd be a buildet kellemetlen meglepetések nélkül

Az ITMS-90683 gyorsan javítható, ha tudod, hogyan olvasd, akárcsak az ITMS-90725, ami az Xcode verziójára vonatkozik. Az ezután jövő elutasítások, vagyis a reviewereké, több rálátást igényelnek: a teendőket az [Apple által elutasított app](https://devoria.fr/hu/expertise/apple-altal-elutasitott-alkalmazas) oldalon találod, a leggyakoribb okokat pedig a [miért utasítja el az Apple az appot](https://devoria.fr/hu/blog/apple-elutasitas-miert-utasitottak-el-az-appodat) cikkben.

Ha beküldés előtt át akarod nézni a csomagodat, az [Apple Review Kit](https://devoria.fr/hu/kits/review-apple) tartalmazza a checklistemet és Claude Code skilleket, amelyek átnézik a projektedet. Ha elakadt a beküldésed, és emberi szemre van szükséged, [foglalj velem egy órát](https://devoria.fr/hu/coaching): videóhívásban, a te képernyődön nézzük át a projektedet. Ha pedig az első megjelenésedre készülsz, [töltsd ki az ingyenes diagnosztikát](https://devoria.fr/hu/diagnostic): sorba rakja a lépéseket, és elküldi az Apple-elutasítás elleni checklistemet.

## Gyakori kérdések

### Az ITMS-90683 App Review elutasítás?

Nem abban az értelemben, hogy egy emberi reviewer döntött. Ez automatikus ellenőrzés, amely a buildet a beküldéskor vizsgálja, még a review előtt, ahogy az ikonnál az ITMS-90717. Senki nem nyitotta meg az appodat. A buildet kidobták: javítanod kell az Info.plist-et, és újat kell küldened.

### Miért kér az Apple kulcsot egy olyan adathoz, amit az appom nem használ?

Mert az Apple a buildben lévő kódot elemzi, nem az app viselkedését. Ha egy beépített könyvtár hivatkozik a fotókönyvtárra vagy a kamerára, a leíró kulcs kötelező, akkor is, ha egyetlen képernyő sem kér soha ilyen hozzáférést.

### Javítható az ITMS-90683 távoli frissítéssel?

Nem. A hiányzó kulcs az Info.plist-ben van, ami a bináris része. Egy távoli frissítés nem módosítja ezt a fájlt: új buildet kell készítened, és újra be kell küldened az Apple-nek.

### Hová kell tenni a NSPhotoLibraryUsageDescription kulcsot egy Expo projektben?

Az app konfigurációjába, az `ios.infoPlist` alá, egy mondattal, amely leírja a használatot. Egyes könyvtárak a pluginjukban külön beállítást is kínálnak, ami további kulcsokat is hozzáadhat, például egy háttérmódot. A kulcsnak mindkét esetben szerepelnie kell az alapkonfigurációban, nem csak a fordítási fájlokban.

### Ki kell venni a nem használt leíró kulcsokat?

Csak akkor, ha a buildben már egyetlen könyvtár sem hivatkozik az adott API-ra. Különben a következő beküldést ITMS-90683-mal elutasítják. Mielőtt kiveszel egy kulcsot, keresd meg az API nevét a függőségeid iOS-kódjában.


## A projekted

[Apple Review Kit](https://devoria.fr/hu/kits/review-apple): Az App Store review ellenőrzőlista, amit használok, az Apple kijavított elutasításai, megjegyzések a tesztelőnek és két Claude Code skill, amely átnézi az appod. 29 €.

[iOS Kit](https://devoria.fr/hu/kits/ios): Készítsd el az iPhone-appodat Claude Code-dal: az appjaim kiinduló kódja, a munkáját ellenőrző skillek, valamint az Apple Review Kit, az App Store Screenshots Kit és az ASO Kit. 129,99 €.
