# App Store Connect build number: versió i número de build

> La versió és el número que veuen els teus clients; el build number identifica cada enviament. La parella ha de ser única: amb Expo, EAS el puja per tu.

Pàgina original: [App Store Connect build number: versió i número de build](https://devoria.fr/ca/blog/app-store-connect-build-number-versio-numero-build)
Autor: [Mehdi Azizi](https://devoria.fr/ca/mehdi-azizi)
Publicació: 2026-11-04
Darrera revisió del contingut: 2026-11-04


El build number d'App Store Connect és el número de build: la clau `CFBundleVersion`, que identifica cada enviament. La versió, `CFBundleShortVersionString`, és el número que els teus clients veuen a l'App Store. **Apple exigeix que la parella de versió i número de build sigui única: un número de build només serveix una vegada per a una mateixa versió.**

Amb Expo, la versió la fixes tu i EAS pot incrementar el número de build a cada build de producció. Aquesta guia explica els dos números, les regles d'Apple, els errors ITMS-90062 i ITMS-90189, i què has de comprovar quan el teu build no apareix.

Publico les meves apps iOS amb Expo i EAS, entre elles Solys, TradaZen i Nolera. La configuració que veuràs més avall és la dels seus fitxers `eas.json`.

## Versió i número de build: quina diferència hi ha?

Dues claus de l'Info.plist identifiquen la teva app. [La documentació d'Apple sobre CFBundleShortVersionString](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleshortversionstring) la descriu com la versió visible per a l'usuari: tres enters separats per punts, com 10.14.1. [La de CFBundleVersion](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleversion) parla de la versió del build: d'un a tres enters, només amb xifres i punts.

| Element         | Clau iOS                   | Qui la veu       | Camp Expo         |
| --------------- | -------------------------- | ---------------- | ----------------- |
| Versió          | CFBundleShortVersionString | Els teus clients | `version`         |
| Número de build | CFBundleVersion            | Tu i Apple       | `ios.buildNumber` |

Exemple fictici: per a la versió 1.4.0, envies els builds 12, 13 i 14 durant les proves i després en tries un per a la revisió. [L'ajuda d'App Store Connect](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds) ho resumeix: la versió vincula el build a la seva fitxa, i el número de build l'identifica a tot arreu dins del sistema.

## Les regles d'increment d'Apple

1. **La parella ha de ser única.** Segons [la documentació de Xcode Cloud](https://developer.apple.com/documentation/xcode/setting-the-next-build-number-for-xcode-cloud-builds), App Store Connect exigeix una combinació única de versió i número de build. Per tant, una app d'iPhone pot tornar a començar per 1 en una versió nova. Una app de Mac, no: el seu número sempre ha de pujar.
2. **Una versió aprovada queda tancada.** Un cop Apple ha validat la versió 1.4.0, ja no hi pots afegir cap build. La següent ha de portar un número més alt.
3. **Cada número es compara com un enter.** 1.10 va després de 1.9, perquè 10 és més gran que 9. Una versió 1.9 enviada després d'una 1.20 aprovada serà rebutjada.

El meu consell: **mantén un número de build enter que sempre pugi, sense tornar-lo a 1.** Tornar a 1 està permès a l'iPhone, però un número únic durant tota la vida de l'app evita confondre dos builds a TestFlight. És el que veig a les meves apps en mode remot: el comptador continua d'una versió a l'altra.

## Gestionar versió i build amb Expo i EAS

[La pàgina d'Expo sobre les versions](https://docs.expo.dev/build-reference/app-versions/), actualitzada el 25 de setembre de 2026, separa els rols. La versió (`version` a app.json) és cosa teva: la canvies quan prepares un llançament nou. El número de build (`ios.buildNumber`) el pots deixar en mans d'EAS. De fet, Expo esmenta l'oblit d'incrementar-lo com una causa habitual de rebuig a l'enviament.

Tot es configura a eas.json:

```json
{
  "cli": {
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "autoIncrement": true
    }
  }
}
```

- **`"remote"`**: els servidors d'EAS guarden el número de build. És el comportament recomanat des d'EAS CLI 12. El comptador parteix del valor de la teva configuració, o d'1, i a partir d'aquí `ios.buildNumber` s'ignora.
- **`"local"`**: mana la teva configuració. Amb `autoIncrement`, EAS modifica `ios.buildNumber` al teu fitxer, i has de fer commit d'aquest canvi a cada build.
- **`autoIncrement`**: [la referència d'eas.json](https://docs.expo.dev/eas/json/) accepta `true` o `"buildNumber"` per al build, i `"version"` per pujar l'última xifra de la versió. En mode remot, Expo precisa que `"version"` no és compatible.

En el meu cas, TradaZen i Nolera estan en `remote`. Solys s'ha quedat en `local`: el seu número de build viu a app.json i cada build de producció el fa pujar dins del fitxer. **Tots dos funcionen, però el mode remot elimina el risc d'un commit oblidat.**

Dues comandes completen el sistema. `eas build:version:set` inicialitza el comptador remot: hi poses l'últim número enviat a Apple. `eas build:version:sync` copia els valors remots al teu projecte, útil si algun dia compiles amb Xcode. Amb EAS Update, el mode remot no funciona amb la política `nativeVersion`: Expo recomana `appVersion`.

## ITMS-90062: la versió ja està aprovada

El missatge s'assembla a això (números ficticis):

```text
ERROR ITMS-90062: This bundle is invalid. The value for key
CFBundleShortVersionString [1.4.0] in the Info.plist file must
contain a higher version than that of the previously approved
version [1.4.0].
```

Apple ja ha aprovat la versió 1.4.0: ja no hi pots afegir cap build. **Puja la versió a app.json, per exemple a 1.4.1, i torna a llançar un build.** Canviar només el número de build no n'hi ha prou.

Si l'error torna tot i que `version` està actualitzada, busca un camp `ios.version`. Segons [la referència de la configuració d'Expo](https://docs.expo.dev/versions/latest/config/app/), té prioritat sobre `version` per a iOS. El mateix remei serveix per a l'error germà ITMS-90186, "Invalid Pre-Release Train", que indica una versió tancada a builds nous.

## ITMS-90189: Redundant Binary Upload

Aquí el que falla és el número de build:

```text
ERROR ITMS-90189: Redundant Binary Upload. You've already uploaded
a build with build number '12' for version number '1.4.0'.
```

La parella 1.4.0 (12) ja existeix a Apple. Amb Expo, hi ha quatre causes habituals:

- **El perfil que fas servir no té `autoIncrement`.** Si crees un perfil a part per a TestFlight, com el de Nolera, torna-hi a posar l'opció.
- **El comptador remot va endarrerit.** Vas passar a `remote` després d'enviaments manuals: executa `eas build:version:set` amb l'últim número que coneix Apple.
- **T'has oblidat el commit en mode local.** El build següent torna a partir del número antic.
- **Tornes a enviar el mateix binari.** Amb `eas submit`, tria el build nou, no l'antic.

**La solució sempre és la mateixa: un build nou amb un número més alt.**

## "No builds available": el teu build no apareix

El build s'ha enviat, però la teva fitxa no te'l proposa. Comprova-ho en aquest ordre.

1. **Encara s'està processant.** Apple processa cada build abans de mostrar-lo i t'envia un correu quan acaba. [Expo](https://docs.expo.dev/submit/ios/) parla en general de 10 a 15 minuts. [Segons Apple](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata), si porta més de 24 hores en processament, has d'obrir un tiquet a Feedback Assistant.
2. **Espera la teva declaració de xifratge.** És l'estat Missing Compliance, detallat més avall.
3. **La versió no coincideix.** Un build 1.4.1 no s'encaixa sota una fitxa preparada com a 1.5.0 a App Store Connect. Alinea-les.
4. **Mentrestant ha sortit una versió.** Segons [l'ajuda sobre l'elecció del build](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit), llavors la llista només mostra els builds enviats des d'aquell llançament.
5. **És el tester qui no el veu.** A l'app TestFlight, "no builds available" sovint vol dir que el build no és a cap grup, que espera la revisió beta o que ha caducat. Tens els detalls a [TestFlight per provar la teva app d'iPhone](https://devoria.fr/ca/blog/testflight-provar-app-iphone-abans-enviar).

### Els estats que has de conèixer

Aquests són els estats que expliquen més sovint un build absent, segons [la llista d'Apple](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses). Processing i Failed no hi surten: són els estats d'enviament descrits a [el seguiment dels builds](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata).

| Estat              | Què vol dir                 | Com ho corregeixes       |
| ------------------ | --------------------------- | ------------------------ |
| Processing         | Apple processa el build     | Esperar el correu        |
| Failed             | Error en el processament    | Llegir l'error, reenviar |
| Missing Compliance | Xifratge no declarat        | Respondre o Info.plist   |
| Invalid Binary     | Enviament no conforme       | Corregir, build nou      |
| Expired            | S'han superat els 90 dies   | Build nou                |
| Ready to Submit    | Llest per a prova o revisió | Afegir-lo a un grup      |

### Declarar el xifratge d'una vegada per totes

Sense la clau `ITSAppUsesNonExemptEncryption`, [Apple](https://developer.apple.com/documentation/bundleresources/information-property-list/itsappusesnonexemptencryption) et fa les preguntes de conformitat a cada versió nova. Amb Expo, el camp es diu `ios.config.usesNonExemptEncryption`:

```json
{
  "expo": {
    "ios": {
      "config": {
        "usesNonExemptEncryption": false
      }
    }
  }
}
```

`false` vol dir: sense xifratge, o només amb xifratge exempt. [Apple precisa](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations) que el xifratge integrat al sistema, com les connexions HTTPS, en general està exempt, i que la resposta també cobreix les teves biblioteques. Les meves tres apps declaren `false`. **Posa `false` només si és cert per a la teva app: la declaració et compromet.**

## Es pot canviar el número d'un build ja enviat?

No. El número està inscrit al binari signat: per corregir-lo, cal un build nou.

El que sí que pots canviar és el build vinculat a la teva versió. Apple només permet un build per versió, però [el pots substituir tantes vegades com vulguis](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit) fins que l'enviïs a revisió:

1. Obre la versió a App Store Connect, secció Build.
2. Passa el cursor per sobre del build actual i fes clic al botó d'eliminar, el signe menys.
3. Fes clic al botó d'afegir, el signe més, tria el build correcte i desa.

Treure un build d'una versió no l'esborra del teu compte. Si la versió ja és en revisió, [retira primer l'enviament](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/remove-a-submission-from-review): la revisió tornarà a començar de zero.

## Abans del teu proper enviament

El número de build només és un dels controls de l'enviament. La imatge de build pot provocar [ITMS-90725](https://devoria.fr/ca/blog/itms-90725-sdk-version-issue-expo), i la signatura té les seves pròpies trampes, detallades a [certificat de desenvolupador iOS i provisioning profile](https://devoria.fr/ca/blog/certificat-ios-provisioning-profile-expo). Tens la cadena completa, del build a TestFlight, a [publicar una app iOS sense Mac](https://devoria.fr/ca/blog/publicar-app-ios-sense-mac-expo-eas), i els terminis de revisió a [termini de validació de l'App Store](https://devoria.fr/ca/blog/temps-revisio-app-store-quant-esperar). Tots els passos estan reunits a la pàgina [publicar una aplicació a l'App Store](https://devoria.fr/ca/expertise/publicar-una-aplicacio-app-store).

Si estàs preparant el teu primer llançament, [fes el diagnòstic gratuït](https://devoria.fr/ca/diagnostic): et diu què bloqueja el teu projecte i t'envia la meva checklist antirebuig d'Apple. Per construir l'app, connectar les subscripcions i publicar-la, l'[iOS & Android Kit](https://devoria.fr/ca/kits/ios) segueix el recorregut en quatre etapes amb el codi de partida de les meves apps, al teu ritme.

## Preguntes freqüents

### Quina diferència hi ha entre la versió i el build number a App Store Connect?

La versió és el número públic del teu llançament, com 1.4.0. El build number identifica un binari concret enviat a Apple per a aquesta versió. Pots enviar diversos builds per a una mateixa versió, cadascun amb el seu número.

### Cal canviar el número de build a cada enviament?

Sí, per a una mateixa versió. Apple rebutja un segon enviament amb la mateixa parella de versió i número de build: és l'error ITMS-90189. Amb EAS, `autoIncrement` se n'encarrega a cada build de producció.

### El número de build ha de tornar a 1 a cada versió?

No és obligatori. A l'iPhone, Apple accepta un número més baix per a una versió nova, perquè només la parella ha de ser única. Un comptador que sempre puja és més fàcil de seguir.

### Com es canvia el build number a App Store Connect?

No pots modificar el número d'un build ja enviat. En canvi, sí que pots substituir el build vinculat a la teva versió, des de la secció Build de la fitxa, mentre no sigui en revisió. Per tenir un número nou, torna a fer un build.

### Per què el meu build no apareix a App Store Connect?

Normalment, encara s'està processant o espera la teva declaració de xifratge. Comprova també que la seva versió coincideix amb la de la teva fitxa. Si porta més de 24 hores en processament, Apple demana que obris un tiquet.


## El teu projecte

[Review Kit](https://devoria.fr/ca/kits/app-review): La meva checklist de revisió de l'App Store, els rebutjos d'Apple que he corregit, la de Google Play i tres skills de Claude Code. 49 €.

[iOS & Android Kit](https://devoria.fr/ca/kits/ios): Crea la teva app d'iPhone i Android amb Claude Code: el codi de partida de les meves apps, el camí fins a les botigues i tots els kits. 99 €.

[Diagnòstic: què et separa de la teva app d'iPhone](https://devoria.fr/ca/diagnostic): 7 preguntes, 60 segons: sabràs què et bloqueja de debò per publicar la teva app d'iPhone, el teu recorregut en 4 etapes i el kit que et toca.
