ITMS-90683: popravi „Missing purpose string” u Expou
Autor: Mehdi Azizi
Objavljeno , 6 min
ITMS-90683 Missing purpose string: zašto Apple odbija tvoj build, koji ključ dodati u app.json u Expou i kako uočiti ključeve koji nedostaju prije slanja.
ITMS-90683 je automatsko odbijanje od Applea: stiže e-mailom nedugo nakon slanja builda, prije bilo kakvog ljudskog pregleda. Znači da u tvojoj datoteci Info.plist nedostaje rečenica koja objašnjava zašto aplikacija pristupa osjetljivom podatku. Popravak su dva koraka: dodaj ključ naveden u poruci u ios.infoPlist, pa napravi novi build.
Dobio sam ga na Solysu, mojoj budilici s mini-igrama, za podatak koji aplikacija uopće ne koristi. Evo što poruka znači, zašto stiže i kako je izbjeći.
Što znači greška ITMS-90683?
Puna poruka nosi naslov „ITMS-90683: Missing purpose string in Info.plist”. Kaže da kod tvoje aplikacije referencira API koji dira osjetljive podatke (fotografije, kameru, mikrofon, lokaciju, kontakte), a tvoj Info.plist ne sadrži odgovarajući ključ s opisom. Poruka imenuje taj ključ, na primjer NSPhotoLibraryUsageDescription.
Ta se rečenica s opisom zove „purpose string”. To je tekst koji iOS prikazuje u prozoru za traženje dopuštenja. Apple to piše u svojoj dokumentaciji o pristupu zaštićenim resursima: App Review odbija aplikacije čiji kod pristupa tim resursima bez purpose stringa.
Ovo nije odbijanje od reviewera. Provjera je automatska i događa se pri isporuci builda, prije stavljanja na pregled, kao ITMS-91053 za privacy manifest. Build se odbacuje i moraš poslati novi.
Zašto Apple odbija iako tvoja aplikacija ne koristi taj podatak
To je ono što iznenadi. Apple analizira kod koji se nalazi u tvom buildu, a ne ono što tvoja aplikacija stvarno radi. Ako biblioteka koju uključuješ sadrži referencu na foto biblioteku, ključ je obavezan, čak i ako nijedan ekran nikad ne traži pristup fotografijama. Appleova poruka to i sama kaže: vanjska biblioteka ili SDK može referencirati te API-je, a purpose string ostaje obavezan.
Moj slučaj, 26. rujna 2026. Dok sam čistio konfiguraciju Solysa, maknuo sam ključ NSPhotoLibraryUsageDescription, jer aplikacija ne dira nijednu fotografiju. Sljedeći build odbijen je s ITMS-90683. Uzrok: dvije Expo biblioteke koje aplikacija koristi, expo-image i expo-file-system, sadrže kod koji referencira foto biblioteku. Prethodni build je prolazio jer je ključ još bio tu.
Lekcija: ključ s opisom ne mičeš „zato što ga ne koristiš”. Mičeš ga tek kad nijedna biblioteka u buildu više ne referencira taj API.
Najčešći ključevi
NSPhotoLibraryUsageDescription: čitanje ili pisanje fotografija.NSPhotoLibraryAddUsageDescription: dodavanje fotografija, bez čitanja.NSCameraUsageDescription: kamera.NSMicrophoneUsageDescription: mikrofon.NSLocationWhenInUseUsageDescription: lokacija tijekom korištenja.NSContactsUsageDescription: kontakti.NSUserTrackingUsageDescription: praćenje za oglase (App Tracking Transparency).
Apple opisuje svaki ključ u dokumentaciji, na primjer NSPhotoLibraryUsageDescription: obavezan je čim aplikacija koristi API koji čita ili piše u foto biblioteku.
Popravak ITMS-90683 u Expo aplikaciji
- Zapiši ključ naveden u Appleovom e-mailu. Poruka daje njegov točan naziv.
- Dodaj ga u svoju konfiguraciju, pod
ios.infoPlist, kako navodi Expo dokumentacija o dopuštenjima:
{
"expo": {
"ios": {
"infoPlist": {
"NSPhotoLibraryUsageDescription": "Solys ne pristupa tvojim fotografijama. Ovo dopuštenje se nikad ne traži."
}
}
}
}
- Napravi novi build. Expo to naglašava: izmjena Info.plista ne ide kroz ažuriranje na daljinu, traži novi binarni paket.
- Ponovno pošalji build Appleu, pa ga odaberi u svojoj verziji.
Zamka ako je tvoja aplikacija prevedena: jezične datoteke prevode ključ, ali ga ne deklariraju. Ključ prvo mora postojati u ios.infoPlist (ili u konfiguraciji odgovarajućeg plugina). Inače se aplikacija može srušiti pri prvom pozivu.
Koju rečenicu napisati ako tvoja aplikacija ne koristi podatak?
Apple traži točan, koristan i precizan opis. Ako tvoja aplikacija stvarno koristi podatak, reci čemu služi, u jednoj rečenici: „Aplikacija koristi kameru za skeniranje barkoda s tvoje karte.”
Ako je ključ tu samo zbog biblioteke, Apple nudi dva rješenja: napisati rečenicu ili maknuti kod koji pristupa podatku. Kad taj kod dolazi iz biblioteke, ne možeš ga jednostavno maknuti. Na Solysu sam zato napisao istinu: „Solys ne pristupa tvojim fotografijama. Ovo dopuštenje se nikad ne traži.” To je pragmatičan izbor: sljedeći build je prošao isporuku, ali ne mogu ti reći da će Apple tu rečenicu uvijek prihvatiti.
Uoči ključeve koji nedostaju prije slanja
Iz korijena projekta ova naredba izlistava datoteke biblioteka čiji iOS kod referencira najnadziranije API-je:
grep -rlE "PHPhotoLibrary|AVCaptureDevice|CLLocationManager|CNContactStore|EKEventStore|ATTrackingManager" \
node_modules/*/ios node_modules/@*/*/ios
Svaki naziv odgovara jednom podatku: PHPhotoLibrary za fotografije, AVCaptureDevice za kameru i mikrofon, CLLocationManager za lokaciju, CNContactStore za kontakte, EKEventStore za kalendar, ATTrackingManager za praćenje. Za svaki rezultat provjeri postoji li odgovarajući ključ s opisom u tvojoj konfiguraciji.
Ova mreža hvata slučajeve na koje sam ja naletio. Ne zamjenjuje čitanje Appleovog e-maila, koji ostaje jedini siguran popis, kao i za nejavne API-je kod ITMS-90338. Od tog odbijanja ovu provjeru radim prije svakog builda: traje nekoliko sekundi, a odbijanje ITMS-90683 košta jedan build i vrijeme da ga ponoviš.
Pošalji build bez neugodnih iznenađenja
ITMS-90683 se brzo popravi kad ga znaš pročitati, baš kao ITMS-90725, koji se tiče verzije Xcodea. Odbijanja koja dolaze poslije, ona od reviewera, traže više odmaka: postupak je na stranici aplikacija odbijena od Applea, a najčešći razlozi su u članku zašto Apple odbija aplikaciju.
Da provjeriš sve prije slanja, Apple Review Kit okuplja moju checklistu i Claude Code skillove koji pregledavaju tvoj projekt. Ako ti slanje zapne i želiš ljudski pogled, rezerviraj sat vremena sa mnom: prolazimo tvoj projekt na videopozivu, na tvom ekranu. A ako pripremaš svoje prvo izdanje, napravi besplatnu dijagnostiku: posložit će ti korake po redu i poslati ti moju checklistu protiv Appleovih odbijanja.
Česta pitanja
Je li ITMS-90683 odbijanje od App Reviewa?
Ne u smislu ljudskog reviewera. To je automatska provjera builda pri isporuci, prije stavljanja na pregled, kao ITMS-90717 za ikonu. Nitko nije otvorio tvoju aplikaciju. Build je odbačen: moraš popraviti Info.plist i poslati novi.
Zašto Apple traži ključ za podatak koji moja aplikacija ne koristi?
Zato što Apple analizira kod prisutan u buildu, a ne ponašanje aplikacije. Ako uključena biblioteka referencira foto biblioteku ili kameru, ključ s opisom je obavezan, čak i ako nijedan ekran nikad ne traži taj pristup.
Može li se ITMS-90683 popraviti ažuriranjem na daljinu?
Ne. Ključ koji nedostaje nalazi se u Info.plistu, koji je dio binarnog paketa. Ažuriranje na daljinu ne mijenja tu datoteku: moraš napraviti novi build i ponovno ga poslati Appleu.
Gdje dodati NSPhotoLibraryUsageDescription u Expo projektu?
U konfiguraciji aplikacije, pod ios.infoPlist, s rečenicom koja opisuje korištenje. Neke biblioteke nude i posebnu postavku u svom pluginu, koja može dodati i druge ključeve, poput pozadinskog načina rada. U oba slučaja ključ mora postojati u osnovnoj konfiguraciji, ne samo u datotekama prijevoda.
Treba li maknuti nekorištene ključeve s opisom?
Samo ako nijedna biblioteka u buildu više ne referencira dotični API. Inače će sljedeće slanje biti odbijeno s ITMS-90683. Prije nego što makneš ključ, potraži naziv API-ja u iOS kodu svojih ovisnosti.