# ITMS-90683: corregir «Missing purpose string» amb Expo

> ITMS-90683 Missing purpose string: per què Apple rebutja el teu build, quina clau afegir a app.json amb Expo i com detectar les claus que falten abans d'enviar-lo.

Pàgina original: [ITMS-90683: corregir «Missing purpose string» amb Expo](https://devoria.fr/ca/blog/itms-90683-missing-purpose-string-expo)
Autor: [Mehdi Azizi](https://devoria.fr/ca/mehdi-azizi)
Publicació: 2026-10-09
Darrera revisió del contingut: 2026-10-09


ITMS-90683 és un rebuig automàtic d'Apple: t'arriba per correu poc després d'enviar el build, abans de cap revisió humana. Vol dir que al teu fitxer Info.plist hi falta la frase que explica per què l'app accedeix a una dada sensible. **La correcció són dos passos: afegir la clau que cita el missatge a `ios.infoPlist` i tornar a fer un build.**

Me'l vaig trobar amb Solys, el meu despertador amb minijocs, per una dada que l'app ni tan sols fa servir. Aquí tens què vol dir el missatge, per què apareix i com evitar-lo.

## Què vol dir l'error ITMS-90683?

El missatge complet es titula «ITMS-90683: Missing purpose string in Info.plist». Diu que el codi de la teva app fa referència a una API que toca dades sensibles (fotos, càmera, micròfon, ubicació, contactes) i que el teu Info.plist no conté la clau de descripció corresponent. El missatge diu el nom d'aquesta clau, per exemple `NSPhotoLibraryUsageDescription`.

Aquesta frase de descripció s'anomena «purpose string». És el text que iOS mostra a la finestra de petició de permís. Apple ho escriu a la seva documentació sobre l'[accés als recursos protegits](https://developer.apple.com/documentation/uikit/requesting-access-to-protected-resources): App Review rebutja les apps el codi de les quals accedeix a aquests recursos sense purpose string.

No és el rebuig d'un revisor. El control és automàtic i salta en lliurar el build, abans de la revisió, com [ITMS-91053](https://devoria.fr/ca/blog/itms-91053-missing-api-declaration-expo) per al manifest de privacitat. El build queda descartat i n'has d'enviar un altre.

## Per què Apple el rebutja si la teva app no fa servir aquesta dada

Aquest és el punt que sorprèn. **Apple analitza el codi que hi ha dins el teu build, no el que fa realment la teva app.** Si una llibreria que inclous conté una referència a la fototeca, la clau és obligatòria, encara que cap pantalla no demani mai accés a les fotos. El mateix missatge d'Apple ho aclareix: una llibreria o un SDK extern pot fer referència a aquestes API, i la purpose string continua sent obligatòria.

El meu cas, el 26 de setembre de 2026. Netejant la configuració de Solys, havia tret la clau `NSPhotoLibraryUsageDescription`, ja que l'app no toca cap foto. El build següent va ser rebutjat amb ITMS-90683. La causa: dues llibreries d'Expo que fa servir l'app, `expo-image` i `expo-file-system`, contenen codi que fa referència a la fototeca. El build anterior passava perquè la clau encara hi era.

**La lliçó**: una clau de descripció no es treu «perquè no la fem servir». Només es treu quan cap llibreria del build ja no fa referència a l'API.

## Les claus més habituals

- `NSPhotoLibraryUsageDescription`: lectura o escriptura de fotos.
- `NSPhotoLibraryAddUsageDescription`: afegir fotos, sense lectura.
- `NSCameraUsageDescription`: càmera.
- `NSMicrophoneUsageDescription`: micròfon.
- `NSLocationWhenInUseUsageDescription`: ubicació mentre s'usa l'app.
- `NSContactsUsageDescription`: contactes.
- `NSUserTrackingUsageDescription`: seguiment publicitari ([App Tracking Transparency](https://devoria.fr/ca/blog/guideline-5-1-2-ia-tercers-att-compartir-dades)).

Apple descriu cada clau a la seva documentació, per exemple la de [NSPhotoLibraryUsageDescription](https://developer.apple.com/documentation/bundleresources/information-property-list/nsphotolibraryusagedescription): és obligatòria tan bon punt l'app fa servir una API que llegeix o escriu a la fototeca.

## Corregir ITMS-90683 en una app Expo

1. **Apunta la clau que cita el correu d'Apple.** El missatge en dona el nom exacte.
2. **Afegeix-la a la teva configuració**, sota `ios.infoPlist`, tal com indica la [documentació d'Expo sobre els permisos](https://docs.expo.dev/guides/permissions/):

```json
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSPhotoLibraryUsageDescription": "Solys no accedeix a les teves fotos. Aquest permís no es demana mai."
      }
    }
  }
}
```

3. **Torna a fer un build.** Expo ho aclareix: un canvi a l'Info.plist no es pot aplicar amb una actualització remota, cal un binari nou.
4. **Torna a enviar el build** a Apple i després selecciona'l a la teva versió.

Un parany si la teva app està traduïda: els fitxers d'idioma tradueixen una clau, no la declaren. Primer la clau ha d'existir a `ios.infoPlist` (o a la configuració del plugin corresponent). Si no, l'app pot petar a la primera crida.

## Quina frase escriure si la teva app no fa servir la dada?

Apple demana una descripció exacta, útil i precisa. Si la teva app fa servir de debò la dada, digues per a què, en una frase: «L'app fa servir la càmera per escanejar el codi de barres del teu bitllet.»

Si la clau només hi és per culpa d'una llibreria, Apple dona dues solucions: escriure la frase o treure el codi que accedeix a la dada. Quan aquest codi ve d'una llibreria, no el pots treure així com així. A Solys, doncs, vaig escriure la veritat: «Solys no accedeix a les teves fotos. Aquest permís no es demana mai.» És una opció pragmàtica: el build següent va passar el lliurament, però no et puc assegurar que Apple sempre acceptarà aquesta frase.

## Detectar les claus que falten abans d'enviar

Des de l'arrel del teu projecte, aquesta comanda llista els fitxers de les llibreries el codi iOS de les quals fa referència a les API més vigilades:

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

Cada nom correspon a una dada: `PHPhotoLibrary` per a les fotos, `AVCaptureDevice` per a la càmera i el micròfon, `CLLocationManager` per a la ubicació, `CNContactStore` per als contactes, `EKEventStore` per al calendari, `ATTrackingManager` per al seguiment. Per a cada resultat, comprova que la clau de descripció corresponent existeix a la teva configuració.

Aquesta xarxa atrapa els casos que m'he trobat. No substitueix la lectura del correu d'Apple, que continua sent l'única llista segura, com passa amb les API no públiques d'ITMS-90338. Des d'aquell rebuig, faig aquesta comprovació abans de cada build: triga uns segons, mentre que un rebuig ITMS-90683 et costa un build i el temps de refer-lo.

## Enviar el teu build sense sorpreses

ITMS-90683 es corregeix ràpid quan saps llegir-lo, igual que ITMS-90725, que afecta la versió de Xcode. Els rebutjos que vénen després, els d'un revisor, demanen més perspectiva: tens el procediment a la pàgina [app rebutjada per Apple](https://devoria.fr/ca/expertise/aplicacio-rebutjada-per-apple), i els motius més freqüents a [per què Apple rebutja una app](https://devoria.fr/ca/blog/rebuig-apple-per-que-rebutgen-app).

Per revisar el teu expedient abans d'enviar-lo, l'[Apple Review Kit](https://devoria.fr/ca/kits/review-apple) reuneix la meva checklist i skills de Claude Code que revisen el teu projecte. Si el teu enviament s'encalla i vols una mirada humana, [reserva una hora amb mi](https://devoria.fr/ca/coaching): repassem el teu projecte per videotrucada, a la teva pantalla. I si prepares el teu primer llançament, [fes el teu diagnòstic gratuït](https://devoria.fr/ca/diagnostic): posa els passos en ordre i t'envia la meva checklist antirebuig d'Apple.

## Preguntes freqüents

### ITMS-90683 és un rebuig d'App Review?

No en el sentit d'un revisor humà. És un control automàtic que es fa sobre el build quan es lliura, abans de la revisió, com ITMS-90717 per a la icona. Ningú no ha obert la teva app. El build queda descartat: has de corregir l'Info.plist i enviar-ne un de nou.

### Per què Apple demana una clau per a una dada que la meva app no fa servir?

Perquè Apple analitza el codi present al build, no el comportament de l'app. Si una llibreria inclosa fa referència a la fototeca o a la càmera, la clau de descripció és obligatòria, encara que cap pantalla no demani mai aquest accés.

### Es pot corregir ITMS-90683 amb una actualització remota?

No. La clau que falta és a l'Info.plist, que forma part del binari. Una actualització remota no modifica aquest fitxer: has de tornar a fer un build i enviar-lo a Apple.

### On s'afegeix NSPhotoLibraryUsageDescription en un projecte Expo?

A la configuració de la teva app, sota `ios.infoPlist`, amb una frase que descrigui l'ús. Algunes llibreries també ofereixen una opció pròpia al seu plugin, que pot afegir altres claus, com un mode en segon pla. En tots dos casos, la clau ha d'existir a la configuració base, no només als fitxers de traducció.

### Cal treure les claus de descripció que no es fan servir?

Només si cap llibreria del build ja no fa referència a l'API corresponent. Si no, el pròxim enviament serà rebutjat amb ITMS-90683. Abans de treure una clau, busca el nom de l'API al codi iOS de les teves dependències.


## El teu projecte

[Apple Review Kit](https://devoria.fr/ca/kits/review-apple): La checklist de review de l'App Store que faig servir, els meus rebuigs d'Apple corregits, les notes per al revisor i dues skills de Claude Code que revisen la teva app. 29 €.

[iOS Kit](https://devoria.fr/ca/kits/ios): Crea la teva app d'iPhone amb Claude Code: el codi de partida de les meves apps, les skills que revisen la seva feina, i els kits Apple Review, App Store Screenshots i ASO. 129,99 €.
