# ITMS-90683: popravi »Missing purpose string« v Expu

> ITMS-90683 Missing purpose string: zakaj Apple zavrne tvoj build, kateri ključ dodaš v app.json z Expom in kako manjkajoče ključe najdeš pred oddajo.

Izvirna stran: [ITMS-90683: popravi »Missing purpose string« v Expu](https://devoria.fr/sl/blog/itms-90683-missing-purpose-string-expo)
Avtor: [Mehdi Azizi](https://devoria.fr/sl/mehdi-azizi)
Objava: 2026-10-09
Zadnja revizija vsebine: 2026-10-09


ITMS-90683 je samodejna zavrnitev Appla: po e-pošti pride kmalu po oddaji builda, še preden ga pogleda človek. Pomeni, da v datoteki Info.plist manjka stavek, ki pojasni, zakaj aplikacija dostopa do občutljivih podatkov. **Popravek sta dva koraka: ključ, ki je naveden v sporočilu, dodaš v `ios.infoPlist`, nato narediš nov build.**

Dobil sem jo pri Solysu, svoji budilki z mini igrami, in to zaradi podatka, ki ga aplikacija sploh ne uporablja. Tukaj je razlaga, kaj sporočilo pomeni, zakaj pride in kako se mu izogneš.

## Kaj pomeni napaka ITMS-90683?

Celotno sporočilo ima naslov »ITMS-90683: Missing purpose string in Info.plist«. Pove, da se koda tvoje aplikacije sklicuje na API, ki dostopa do občutljivih podatkov (fotografije, kamera, mikrofon, lokacija, stiki), tvoj Info.plist pa ne vsebuje ustreznega ključa z opisom. Sporočilo ta ključ poimenuje, na primer `NSPhotoLibraryUsageDescription`.

Temu opisnemu stavku se reče »purpose string«. To je besedilo, ki ga iOS prikaže v oknu z zahtevo za dovoljenje. Apple to piše v svoji dokumentaciji o [dostopu do zaščitenih virov](https://developer.apple.com/documentation/uikit/requesting-access-to-protected-resources): App Review zavrne aplikacije, katerih koda dostopa do teh virov brez purpose stringa.

To ni zavrnitev reviewerja. Preverjanje je samodejno in se zgodi ob dostavi builda, pred pregledom, tako kot [ITMS-91053](https://devoria.fr/sl/blog/itms-91053-missing-api-declaration-expo) za privacy manifest. Build je izločen in moraš poslati novega.

## Zakaj Apple zavrne, čeprav tvoja aplikacija tega podatka ne uporablja

To je tisto, kar preseneti. **Apple analizira kodo v tvojem buildu, ne tega, kar aplikacija dejansko počne.** Če knjižnica, ki jo vključiš, vsebuje sklic na fototeko, je ključ obvezen, tudi če noben zaslon nikoli ne zahteva dostopa do fotografij. Applovo sporočilo to samo pove: na te API-je se lahko sklicuje tudi zunanja knjižnica ali SDK, purpose string pa ostane obvezen.

Moj primer, 26. septembra 2026. Ko sem čistil konfiguracijo Solysa, sem odstranil ključ `NSPhotoLibraryUsageDescription`, saj se aplikacija fotografij sploh ne dotika. Naslednji build je bil zavrnjen z ITMS-90683. Vzrok: dve Expovi knjižnici, ki ju aplikacija uporablja, `expo-image` in `expo-file-system`, vsebujeta kodo, ki se sklicuje na fototeko. Prejšnji build je šel skozi, ker je bil ključ še tam.

**Nauk**: ključa z opisom ne odstraniš »zato, ker ga ne uporabljaš«. Odstraniš ga šele, ko se nobena knjižnica v buildu ne sklicuje več na ta API.

## Najpogostejši ključi

- `NSPhotoLibraryUsageDescription`: branje ali pisanje fotografij.
- `NSPhotoLibraryAddUsageDescription`: dodajanje fotografij, brez branja.
- `NSCameraUsageDescription`: kamera.
- `NSMicrophoneUsageDescription`: mikrofon.
- `NSLocationWhenInUseUsageDescription`: lokacija med uporabo.
- `NSContactsUsageDescription`: stiki.
- `NSUserTrackingUsageDescription`: oglaševalsko sledenje ([App Tracking Transparency](https://devoria.fr/sl/blog/guideline-5-1-2-ai-tretjih-oseb-att-deljenje-podatkov)).

Apple vsak ključ opiše v dokumentaciji, na primer [NSPhotoLibraryUsageDescription](https://developer.apple.com/documentation/bundleresources/information-property-list/nsphotolibraryusagedescription): obvezen je, takoj ko aplikacija uporablja API, ki bere iz fototeke ali vanjo piše.

## Kako popraviti ITMS-90683 v aplikaciji Expo

1. **Zapiši si ključ, naveden v Applovem e-sporočilu.** Sporočilo navede njegovo točno ime.
2. **Dodaj ga v svojo konfiguracijo**, pod `ios.infoPlist`, kot piše v [Expovi dokumentaciji o dovoljenjih](https://docs.expo.dev/guides/permissions/):

```json
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSPhotoLibraryUsageDescription": "Solys ne dostopa do tvojih fotografij. To dovoljenje se nikoli ne zahteva."
      }
    }
  }
}
```

3. **Naredi nov build.** Expo to pove jasno: sprememba Info.plista ne gre skozi posodobitev na daljavo, potrebuješ nov binarni paket.
4. **Build znova pošlji** Applu, nato ga izberi v svoji verziji.

Past, če je tvoja aplikacija prevedena: jezikovne datoteke ključ prevedejo, ne pa deklarirajo. Ključ mora najprej obstajati v `ios.infoPlist` (ali v konfiguraciji ustreznega plugina). Sicer se lahko aplikacija ob prvem klicu sesuje.

## Kakšen stavek napisati, če tvoja aplikacija podatka ne uporablja?

Apple zahteva točen, uporaben in natančen opis. Če aplikacija podatek res uporablja, v enem stavku povej, čemu služi: »Aplikacija uporablja kamero za skeniranje črtne kode tvoje vstopnice.«

Če je ključ tam samo zaradi knjižnice, Apple ponuja dve rešitvi: napišeš stavek ali odstraniš kodo, ki dostopa do podatka. Ko ta koda pride iz knjižnice, je ne moreš kar odstraniti. Pri Solysu sem zato napisal resnico: »Solys ne dostopa do tvojih fotografij. To dovoljenje se nikoli ne zahteva.« To je pragmatična izbira: naslednji build je šel skozi ob dostavi, ne morem pa ti obljubiti, da bo Apple ta stavek vedno sprejel.

## Kako najti manjkajoče ključe pred oddajo

V korenu projekta ta ukaz izpiše datoteke knjižnic, katerih iOS koda se sklicuje na najbolj nadzorovane API-je:

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

Vsako ime ustreza enemu podatku: `PHPhotoLibrary` fotografijam, `AVCaptureDevice` kameri in mikrofonu, `CLLocationManager` lokaciji, `CNContactStore` stikom, `EKEventStore` koledarju, `ATTrackingManager` sledenju. Za vsak zadetek preveri, ali ustrezen ključ z opisom obstaja v tvoji konfiguraciji.

Ta varovalka ujame primere, na katere sem naletel. Ne nadomesti pa branja Applovega e-sporočila, ki ostaja edini zanesljiv seznam, tako kot pri nejavnih API-jih iz ITMS-90338. Od te zavrnitve to preverjanje naredim pred vsakim buildom: vzame nekaj sekund, zavrnitev ITMS-90683 pa te stane build in čas, da ga narediš znova.

## Pošlji build brez neprijetnih presenečenj

ITMS-90683 popraviš hitro, ko ga znaš prebrati, enako kot ITMS-90725, ki se nanaša na verzijo Xcode. Zavrnitve, ki pridejo pozneje, tiste od reviewerja, zahtevajo več premisleka: postopek je na strani [aplikacija, ki jo je Apple zavrnil](https://devoria.fr/sl/expertise/apple-zavrnil-aplikacijo), najpogostejši razlogi pa so v članku [zakaj Apple zavrne aplikacijo](https://devoria.fr/sl/blog/apple-zavrnil-aplikacijo-razlogi).

Če želiš preveriti svojo oddajo pred pošiljanjem, [Apple Review Kit](https://devoria.fr/sl/kits/review-apple) združuje moj kontrolni seznam in skille za Claude Code, ki pregledajo tvoj projekt. Če se ti oddaja zatakne in želiš človeški pogled, [rezerviraj uro z mano](https://devoria.fr/sl/coaching): tvoj projekt pregledava prek videoklica, na tvojem zaslonu. In če pripravljaš svojo prvo objavo, [naredi brezplačno diagnostiko](https://devoria.fr/sl/diagnostic): korake postavi v pravi vrstni red in ti pošlje moj kontrolni seznam proti Applovim zavrnitvam.

## Pogosta vprašanja

### Je ITMS-90683 zavrnitev App Review?

Ne v smislu človeškega reviewerja. Gre za samodejno preverjanje builda ob dostavi, pred pregledom, tako kot ITMS-90717 za ikono. Nihče ni odprl tvoje aplikacije. Build je izločen: popraviti moraš Info.plist in poslati novega.

### Zakaj Apple zahteva ključ za podatek, ki ga moja aplikacija ne uporablja?

Ker Apple analizira kodo v buildu, ne obnašanja aplikacije. Če se vključena knjižnica sklicuje na fototeko ali kamero, je ključ z opisom obvezen, tudi če noben zaslon nikoli ne zahteva tega dostopa.

### Ali lahko ITMS-90683 popravim s posodobitvijo na daljavo?

Ne. Manjkajoči ključ je v Info.plistu, ki je del binarnega paketa. Posodobitev na daljavo te datoteke ne spremeni: narediti moraš nov build in ga znova poslati Applu.

### Kam dodati NSPhotoLibraryUsageDescription v projektu Expo?

V konfiguracijo aplikacije, pod `ios.infoPlist`, s stavkom, ki opiše uporabo. Nekatere knjižnice imajo v svojem pluginu tudi posebno nastavitev, ki lahko doda še druge ključe, na primer način delovanja v ozadju. V obeh primerih mora ključ obstajati v osnovni konfiguraciji, ne samo v prevodnih datotekah.

### Ali moram odstraniti neuporabljene ključe z opisom?

Samo če se nobena knjižnica v buildu ne sklicuje več na zadevni API. Sicer bo naslednja oddaja zavrnjena z ITMS-90683. Preden odstraniš ključ, poišči ime API-ja v iOS kodi svojih odvisnosti.


## Tvoj projekt

[Apple Review Kit](https://devoria.fr/sl/kits/review-apple): Kontrolni seznam za App Store review, ki ga uporabljam, moje popravljene zavrnitve, opombe za preizkuševalca in dva skilla Claude Code, ki pregledata tvojo aplikacijo. 29 €.

[iOS Kit](https://devoria.fr/sl/kits/ios): Ustvari aplikacijo za iPhone s Claude Code: začetna koda mojih aplikacij, skilli, ki preverjajo njegovo delo, ter Apple Review Kit, App Store Screenshots Kit in ASO Kit. 129,99 €.
