ITMS-90683 javítása: „Missing purpose string” Expóval
Írta: Mehdi Azizi
Megjelent: , 6 p
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.
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 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. 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).
Az Apple minden kulcsot leír a dokumentációjában, például a 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
- Írd ki az Apple e-mailjében szereplő kulcsot. Az üzenet megadja a pontos nevét.
- Add hozzá a konfigurációdhoz az
ios.infoPlistalá, ahogy az Expo engedélyekről szóló dokumentációja mutatja:
{
"expo": {
"ios": {
"infoPlist": {
"NSPhotoLibraryUsageDescription": "A Solys nem fér hozzá a fotóidhoz. Ezt az engedélyt soha nem kéri."
}
}
}
}
- 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.
- 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:
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 oldalon találod, a leggyakoribb okokat pedig a miért utasítja el az Apple az appot cikkben.
Ha beküldés előtt át akarod nézni a csomagodat, az Apple Review Kit 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: 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: 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.