# ITMS-90683: popravi „Missing purpose string” u Expou

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

Izvorna stranica: [ITMS-90683: popravi „Missing purpose string” u Expou](https://devoria.fr/hr/blog/itms-90683-missing-purpose-string-expo)
Autor: [Mehdi Azizi](https://devoria.fr/hr/mehdi-azizi)
Objavljeno: 2026-10-09
Zadnja revizija sadržaja: 2026-10-09


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

Apple opisuje svaki ključ u dokumentaciji, na primjer [NSPhotoLibraryUsageDescription](https://developer.apple.com/documentation/bundleresources/information-property-list/nsphotolibraryusagedescription): obavezan je čim aplikacija koristi API koji čita ili piše u foto biblioteku.

## Popravak ITMS-90683 u Expo aplikaciji

1. **Zapiši ključ naveden u Appleovom e-mailu.** Poruka daje njegov točan naziv.
2. **Dodaj ga u svoju konfiguraciju**, pod `ios.infoPlist`, kako navodi [Expo dokumentacija o dopuštenjima](https://docs.expo.dev/guides/permissions/):

```json
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSPhotoLibraryUsageDescription": "Solys ne pristupa tvojim fotografijama. Ovo dopuštenje se nikad ne traži."
      }
    }
  }
}
```

3. **Napravi novi build.** Expo to naglašava: izmjena Info.plista ne ide kroz ažuriranje na daljinu, traži novi binarni paket.
4. **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:

```bash
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](https://devoria.fr/hr/expertise/apple-odbio-aplikaciju), a najčešći razlozi su u članku [zašto Apple odbija aplikaciju](https://devoria.fr/hr/blog/apple-odbio-aplikaciju-razlozi).

Da provjeriš sve prije slanja, [Apple Review Kit](https://devoria.fr/hr/kits/review-apple) okuplja moju checklistu i Claude Code skillove koji pregledavaju tvoj projekt. Ako ti slanje zapne i želiš ljudski pogled, [rezerviraj sat vremena sa mnom](https://devoria.fr/hr/coaching): prolazimo tvoj projekt na videopozivu, na tvom ekranu. A ako pripremaš svoje prvo izdanje, [napravi besplatnu dijagnostiku](https://devoria.fr/hr/diagnostic): 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.


## Tvoj projekt

[Apple Review Kit](https://devoria.fr/hr/kits/review-apple): Checklista za App Store review koju koristim, moja ispravljena odbijanja, bilješke za testera i dva Claude Code skilla koji pregledavaju tvoju aplikaciju. 29 €.

[iOS Kit](https://devoria.fr/hr/kits/ios): Napravi svoju iPhone aplikaciju s Claude Codeom: početni kod mojih aplikacija, skillovi koji provjeravaju njegov rad te Apple Review Kit, App Store Screenshots Kit i ASO Kit. 129,99 €.
