# Errores de eas submit en iOS y cómo corregirlos

> ¿Falla eas submit? Los mensajes reales de EAS y App Store Connect, su causa y su solución: ascAppId, clave API, contrato de Apple, códigos ITMS.

Página original: [Errores de eas submit en iOS y cómo corregirlos](https://devoria.fr/es/blog/errores-eas-submit-ios-solucion)
Autor: [Mehdi Azizi](https://devoria.fr/es/mehdi-azizi)
Publicación: 2026-11-04
Última revisión del contenido: 2026-11-04


Cuando `eas submit --platform ios` falla, el mensaje casi siempre te dice dónde buscar. **O tu configuración de EAS está incompleta, o tu cuenta de Apple está bloqueando, o Apple rechaza el binario.** Los dos primeros casos se corrigen en pocos minutos, sin un build nuevo. El tercero se reconoce por un código ITMS y casi siempre exige un build nuevo.

Publico mis apps de iOS, entre ellas Solys, TradaZen y Nolera, con Expo y EAS. Los mensajes que cito aquí están copiados del código fuente de EAS CLI, en [el repositorio oficial de Expo en GitHub](https://github.com/expo/eas-cli), revisado el 3 de noviembre de 2026. El antiguo foro de Expo ahora redirige a Discord: el código sigue siendo la fuente más confiable. Para el recorrido completo, desde el archivo `eas.json` hasta el envío a revisión, lee primero [EAS Submit iOS: publicar una app de Expo en el App Store](https://devoria.fr/es/blog/eas-submit-ios-publicar-app-expo-app-store). Aquí vamos a reparar.

## Qué hace eas submit y qué necesita

Según [la documentación de Expo](https://docs.expo.dev/deploy/submit-to-app-stores/), el comando envía tu archivo `.ipa` a App Store Connect. El build aparece en TestFlight después de que Apple lo procesa, por lo general en 10 a 15 minutos. **No envía tu app a revisión**: ese paso lo sigues haciendo tú en App Store Connect.

[La página de Expo sobre el envío en iOS](https://docs.expo.dev/submit/ios/) enumera tres requisitos:

- **una cuenta de Apple Developer de pago**, obligatoria para cualquier envío al App Store;
- **el identificador de bundle** en `ios.bundleIdentifier`;
- **EAS CLI instalado** y conectado a tu cuenta de Expo.

Para enviar sin interacción, la misma página agrega dos ajustes:

- **`ascAppId`** en el perfil `submit` de `eas.json`, el número de tu ficha en App Store Connect;
- **una clave API de App Store Connect**, gestionada por EAS o proporcionada por ti. Cómo crearla, qué rol darle y cómo revocarla está detallado en [clave API de App Store Connect (.p8)](https://devoria.fr/es/blog/clave-api-app-store-connect-p8).

El perfil mínimo cabe en unas pocas líneas. El valor es ficticio:

```json
{
  "submit": {
    "production": {
      "ios": {
        "ascAppId": "1234567890"
      }
    }
  }
}
```

Si EAS ya guarda tu clave API, este perfil es suficiente. Es el caso en la mayoría de mis apps.

## Leer el mensaje: tres familias de errores

Antes de buscar la solución, identifica en qué momento se detiene el comando. Esta tabla es la guía que aplico en cada fallo.

| Momento del fallo                        | Familia              | ¿Build nuevo? |
| ---------------------------------------- | -------------------- | ------------- |
| Antes de cualquier envío                 | Configuración de EAS | No            |
| Conexión con Apple, creación de la ficha | Cuenta de Apple      | No            |
| Después del envío, código ITMS-90xxx     | Binario rechazado    | Casi siempre  |

El detalle se ve en la página del envío, en el panel de Expo. [Expo recomienda](https://docs.expo.dev/deploy/submit-to-app-stores/) leer ahí los registros y buscar el recuadro "Build Annotations", que señala las causas de fallo más comunes. En la terminal, la opción `--verbose` siempre muestra los registros de EAS Submit, según [la referencia de EAS CLI](https://docs.expo.dev/eas/cli/).

## Los errores de configuración de EAS

### "Set ascAppId in the submit profile (eas.json) or re-run this command in interactive mode."

Ejecutaste el comando con `--non-interactive`, por ejemplo en integración continua, y tu perfil no contiene `ascAppId`. [El código de EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) se detiene entonces: no puede hacerte preguntas ni crear la ficha por ti.

**Solución: copia el número de tu ficha en `ascAppId`.** [Expo indica dónde encontrarlo](https://github.com/expo/fyi/blob/main/asc-app-id.md): en App Store Connect, abre tu app y luego App Information. Es el campo Apple ID, bajo General Information, un número de unos diez dígitos. No es tu correo de Apple ni tu identificador de bundle.

En Nolera, sin `ascAppId`, el comando me pedía una sesión de Apple Developer, que expira. Desde que el número está en `eas.json`, el envío ya no pide nada.

> Agrega `ascAppId` antes del build, no después. Hasta el SDK 57, [la huella calculada por Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/src/sourcer/Expo.ts) siempre incluye `eas.json`. En Vigie, cuya versión de ejecución sigue la política `fingerprint`, agregar este número después de un build cambió la huella: una actualización publicada después nunca habría llegado al build instalado. Desde el SDK 58, el preajuste predeterminado de la huella, `balanced`, ignora `eas.json`, según [el registro de cambios de Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/CHANGELOG.md).

### "App Store Connect API Keys cannot be set up in --non-interactive mode."

Tu perfil no contiene ninguna clave y EAS no tiene ninguna vinculada a tu app. [Expo lo aclara](https://docs.expo.dev/submit/ios/): en modo no interactivo, el comando no puede pedirte una clave y falla con este mensaje.

Dos soluciones posibles:

- **Deja que EAS cree y guarde la clave.** Ejecuta una vez `eas credentials --platform ios` en modo interactivo, en tu máquina, y deja que configure una clave API de App Store Connect para tu app.
- **Usa tu propia clave** en `ascApiKeyPath`, `ascApiKeyIssuerId` y `ascApiKeyId`. Según [la referencia de eas.json](https://docs.expo.dev/eas/json/), estos tres campos aceptan variables de entorno, como `$ASC_API_KEY_PATH`.

En mi última app, la opción `--auto-submit` quería un Apple ID para crear su clave de envío. Puse los tres campos de mi propia clave en el perfil de mi copia de trabajo, nunca en un commit. Luego envié el build terminado con `--id` y `--non-interactive`.

### "EXPO_APPLE_APP_SPECIFIC_PASSWORD must be in the format xxxx-xxxx-xxxx-xxxx, where x is a lowercase letter."

La variable contiene algo distinto a una contraseña de app, muchas veces tu propia contraseña de Apple. [EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) verifica este formato antes de cualquier envío.

Según [la ayuda de Apple](https://support.apple.com/en-us/102654), una contraseña de app se genera en account.apple.com, sección App-Specific Passwords, con la autenticación de doble factor activada. Se revoca en cuanto cambias la contraseña de tu cuenta de Apple. **Expo considera este método [menos seguro que la clave API](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md), su método predeterminado y recomendado.**

## Los errores de la cuenta de Apple

### "… agree to the latest Program License Agreement in your developer account."

El mensaje completo empieza con "You currently don't have access to this membership resource". Del lado de Apple, la respuesta sin procesar puede contener "Unable to process request - PLA Update available". Los pasos de envío recientes de EAS muestran más bien "A required Apple agreement is missing or has expired".

La causa es la misma: Apple actualizó un contrato y nadie lo aceptó. **Solo el titular de la cuenta, el Account Holder, puede aceptar los contratos**, según [la tabla de roles de Apple](https://developer.apple.com/help/account/access/roles/). [El código de EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) le pide pasar por la página Business de App Store Connect y luego, si Apple lo propone, por su cuenta en developer.apple.com. Después vuelve a ejecutar el comando. El contrato de las apps de pago tiene su propia guía: [Paid Apps Agreement en App Store Connect](https://devoria.fr/es/blog/paid-apps-agreement-estados-w-8ben-primer-pago).

### "App Store Connect rejected the API authentication credentials."

Apple respondió con un error 401, `NOT_AUTHORIZED`. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) menciona tres causas: una clave que ya no está activa, una clave de otra cuenta de App Store Connect, o un Key ID, un contenido de clave o un Issuer ID incorrecto.

Verifica los dos identificadores en App Store Connect, menú Users and Access, pestaña Integrations. Según [Apple](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests), el Issuer ID aparece arriba en la página y el Key ID en la lista de claves activas. **Una clave revocada nunca se reactiva.** [Apple la muestra](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 30 días en Revoked: tienes que generar una nueva.

### "App Store Connect app for application identifier … was not found."

La ficha indicada por `ascAppId` no se encuentra con tu clave. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiUtils.ts) te pide verificar ese número y que la clave tenga acceso a la app en la cuenta correcta. Incluso lista algunas apps visibles con esa clave. Con las herramientas de envío de Apple, el mismo problema aparece como "No suitable application records were found".

Se repiten tres causas, dos de ellas señaladas en [este hilo de los foros de Apple](https://developer.apple.com/forums/thread/106806):

- **La ficha no existe.** Créala en App Store Connect, o quita `ascAppId` para que el comando la cree.
- **El número viene de otra cuenta.** Copiaste el `ascAppId` de otro equipo o de otro proyecto.
- **El usuario no tiene acceso a la app.** Un App Manager o un Developer puede estar limitado a ciertas apps. Una clave de equipo, en cambio, [tiene acceso a todas las apps](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) de la cuenta.

### "… is not available to team" o "… is not available to provider"

Este mensaje aparece cuando EAS crea la ficha por ti, al no haber `ascAppId`. El identificador de bundle ya lo tiene otro equipo. [EAS te pide](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/credentials/ios/appstore/ensureAppExists.ts) cambiarlo en la configuración de tu app y volver a ejecutar.

### "App name "…" is already taken. Using generated name "…""

No es un fallo. Cuando el nombre ya está ocupado en el App Store, EAS agrega seis caracteres al azar y vuelve a intentarlo, hasta cinco veces. Después puedes renombrar la ficha en App Store Connect. Para evitarlo, completa `appName` y `language` en el perfil antes del primer envío: sin `language`, [el idioma principal es `en-US`](https://docs.expo.dev/eas/json/).

## Los errores del binario: los códigos ITMS

Después del envío, Apple procesa el build. Si lo rechaza, el registro menciona uno o varios códigos ITMS. Estos son los que [el paso de envío de EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/functions/uploadToAsc.ts) reconoce y traduce:

| Código ITMS                | Lo que Apple rechaza                              | Solución                    |
| -------------------------- | ------------------------------------------------- | --------------------------- |
| 90189                      | Número de build ya usado                          | `autoIncrement`             |
| 90062, 90186, 90478        | Versión cerrada o ya superada                     | Subir `version`             |
| 90683                      | Falta la frase de permiso                         | `ios.infoPlist`             |
| 90725                      | SDK de iOS demasiado antiguo                      | Imagen de iOS o SDK de Expo |
| 90054, 90055               | Bundle distinto al de la ficha indicada           | Corregir `ascAppId`         |
| 90022, 90023, 90391, 90713 | Íconos faltantes o mal declarados                 | Revisar los íconos          |
| 90771                      | Faltan identificadores de tareas en segundo plano | `ios.infoPlist`             |

Tres aclaraciones sacadas de estos mensajes:

- **El número de build es único por versión.** Para 90189, EAS recomienda `"autoIncrement": true` en `eas.json`. Todo está en [número de build y versión](https://devoria.fr/es/blog/app-store-connect-build-number-version).
- **Para 90725**, EAS recomienda elegir una imagen de iOS más reciente en `eas.json` y, si hace falta, pasar a un SDK de Expo compatible.
- **Para 90771**, tu Info.plist declara el modo en segundo plano `processing`, pero no la clave `BGTaskSchedulerPermittedIdentifiers`.

Salvo en 90054 y 90055, donde basta con apuntar a la ficha correcta o a otro build, **la solución afecta al binario: haz un build nuevo y vuelve a enviarlo.** Dos códigos tienen su propia guía: [ITMS-90683 con Expo](https://devoria.fr/es/blog/itms-90683-missing-purpose-string-expo) e [ITMS-90725](https://devoria.fr/es/blog/itms-90725-sdk-version-issue-expo).

A finales de septiembre de 2026, un build de Solys fue rechazado en la entrega por ITMS-90683. Había quitado una frase de permiso sobre las fotos durante una limpieza del archivo de configuración. Solys no usa las fotos, pero una biblioteca del proyecto llama a la API Photos de iOS. **Apple analiza el binario, no el uso real:** desde entonces, nunca vuelvo a quitar esas frases.

El estado Missing Compliance, por su parte, no es un error de envío. Falta tu declaración sobre el cifrado, explicada en [la guía de publicación con EAS](https://devoria.fr/es/blog/eas-submit-ios-publicar-app-expo-app-store).

## Mi checklist antes de cada envío

- `ascAppId` está en el perfil `submit`, agregado antes del build.
- La clave API la gestiona EAS, o sus tres campos apuntan a un `.p8` guardado fuera del repositorio.
- El Account Holder aceptó los últimos contratos en App Store Connect.
- `autoIncrement` está activo, con `"appVersionSource": "remote"`, [recomendado por Expo](https://docs.expo.dev/build-reference/app-versions/) desde EAS CLI 12.
- La `version` es mayor que la última versión aprobada.
- Cada API sensible presente en el binario tiene su frase de permiso.
- Para una app nueva, `appName` y `language` están completos antes del primer envío.

## Enviar tu primera app sin quedarte atascado

El comando es solo un paso. El [iOS & Android Kit](https://devoria.fr/es/kits/ios) parte del código base de mis apps, suscripciones incluidas, y sigue cuatro etapas hasta el App Store, a tu ritmo.

Si estás preparando tu primer lanzamiento, [haz tu diagnóstico gratuito](https://devoria.fr/es/diagnostic): te dice qué te está bloqueando de verdad y te envía mi checklist contra rechazos de Apple. Para la ficha, las capturas y la validación, la página [publicar una aplicación en el App Store](https://devoria.fr/es/expertise/publicar-una-app-en-app-store) repasa cada etapa.

## Preguntas frecuentes

### ¿Por qué eas submit falla solo en integración continua?

En modo `--non-interactive`, el comando no puede preguntarte nada. Necesita `ascAppId` en el perfil y una clave API ya vinculada a la app, o sus tres campos en `eas.json`. En tu máquina, te habría hecho esas preguntas.

### ¿Hay que hacer un build nuevo después de un error de eas submit?

Solo si Apple rechaza el binario, con un código ITMS. Excepción: en ITMS-90054 y 90055, el build apuntaba a la ficha equivocada, basta con reenviarlo a la correcta. Los errores de configuración y de cuenta se corrigen en `eas.json`, en App Store Connect o en tu cuenta de Apple. Luego vuelves a enviar el mismo build, por ejemplo con `--latest` o `--id`.

### ¿Dónde ver los registros de un envío de EAS Submit?

En la página del envío, en el panel de Expo. Expo recomienda leer ahí los registros y el recuadro "Build Annotations". En la terminal, agrega `--verbose` para mostrar siempre los registros.

### ¿Se puede usar eas submit con una cuenta de Apple gratuita?

No. Expo exige una cuenta de Apple Developer de pago para enviar una app al App Store. La cuenta gratuita permite probar en tu propio iPhone, no usar App Store Connect.

### ¿Qué rol darle a la clave API para eas submit?

La guía de Expo le da el rol Admin a la clave. Según la tabla de roles de Apple, el envío de builds también está abierto a los roles App Manager y Developer. Mis builds de Expo funcionan con una clave de equipo con rol App Manager. Solo el Account Holder y los Admins pueden generar una clave de equipo.

### ¿Qué significa "Increment Build Number" en EAS?

Apple rechazó el build con el código ITMS-90189: ese número de build ya existe para esa versión. Activa `"autoIncrement": true` en `eas.json`, o sube `ios.buildNumber`, y luego haz un build nuevo.


## Tu proyecto

[Review Kit](https://devoria.fr/es/kits/app-review): Mi checklist de revisión de App Store, mis rechazos de Apple corregidos, la de Google Play y tres skills de Claude Code. 49 €.

[iOS & Android Kit](https://devoria.fr/es/kits/ios): Crea tu app para iPhone y Android con Claude Code: el código base de mis apps, el camino hasta las tiendas y todos los kits. 99 €.

[Diagnóstico: lo que te separa de tu app para iPhone](https://devoria.fr/es/diagnostic): 7 preguntas, 60 segundos: descubre qué te frena de verdad para publicar tu app para iPhone, tu ruta en 4 etapas y el kit ideal para ti.
