# EAS Submit iOS: publicar una app Expo en el App Store

> EAS Submit envía tu build iOS a App Store Connect, donde llega a TestFlight. El envío a revisión se hace en App Store Connect. El eas.json y los errores comunes.

Página original: [EAS Submit iOS: publicar una app Expo en el App Store](https://devoria.fr/es/blog/eas-submit-ios-publicar-app-expo-app-store)
Autor: [Mehdi Azizi](https://devoria.fr/es/mehdi-azizi)
Publicación: 2026-10-25
Última revisión del contenido: 2026-10-25


`eas submit --platform ios` envía tu build iOS a App Store Connect, donde aparece en TestFlight después de que Apple lo procesa. **El comando no envía tu app a la revisión de Apple: elegir el build y enviarlo a revisión sigue siendo cosa tuya en App Store Connect.** Para automatizarlo, necesita el número de tu ficha (`ascAppId`) y una clave API de App Store Connect.

Publico mis apps iOS, entre ellas Solys, TradaZen y Nolera, con Expo, EAS Build y EAS Submit. Esta guía sigue la [documentación de Expo sobre el envío en iOS](https://docs.expo.dev/submit/ios/), revisada el 25 de octubre de 2026. Si no tienes Mac, el recorrido completo está en [publicar una app iOS sin Mac](https://devoria.fr/es/blog/publicar-app-ios-sin-mac-expo-eas). Aquí nos centramos en el envío.

## Lo que necesitas antes del primer comando

Expo enumera tres requisitos:

- **Una cuenta de Apple Developer de pago.** El precio y el registro están en [cuenta de desarrollador de Apple](https://devoria.fr/es/blog/cuenta-desarrollador-apple-precio).
- **Un identificador de bundle** en `ios.bundleIdentifier`. Según [la referencia de la configuración de Expo](https://docs.expo.dev/versions/latest/config/app/), lo inventas tú, pero tiene que ser único en el App Store.
- **EAS CLI instalado**, y luego `eas login` con tu cuenta de Expo.

También necesitas un build de producción firmado. EAS Build lo genera con el certificado y el perfil que gestiona por ti, como se explica en certificado y provisioning profile iOS.

### La ficha de App Store Connect: ¿tú o EAS?

EAS Submit envía un binario a una app que tiene que existir en App Store Connect.

**Puedes crearla tú mismo.** [La ayuda de Apple](https://developer.apple.com/help/app-store-connect/create-an-app-record/add-a-new-app) describe la ventana New App: plataforma, nombre, idioma principal, identificador de bundle, SKU y acceso de usuarios. Necesitas el rol Account Holder, Admin o App Manager.

**EAS también puede crearla en el primer envío.** Según [la página de Expo sobre TestFlight](https://docs.expo.dev/submit/testflight/), `eas submit` crea la ficha cuando envías tu primer build. Según [la referencia de eas.json](https://docs.expo.dev/eas/json/), si indicas `ascAppId` te saltas este paso. El nombre sale de `appName` o, si no existe, del `name` de tu configuración. El idioma principal sale de `language`, que por defecto es `en-US`. **Si tu app sale primero en francés, define `language` antes de ese primer envío.**

Después, copia el número de la ficha en `ascAppId`. Expo indica dónde encontrarlo: abre tu app en App Store Connect y luego App Information. Es el campo Apple ID, en General Information. **Es un número, no tu identificador de bundle.**

## Por qué una clave API en lugar de tu Apple ID

EAS Submit se conecta a Apple con tu Apple ID o con una clave API de App Store Connect.

El Apple ID choca con la autenticación de dos factores, que [Apple exige](https://developer.apple.com/support/authentication/) a todos los usuarios de App Store Connect: hace falta una persona para confirmar el inicio de sesión. La contraseña de app, pasada en `EXPO_APPLE_APP_SPECIFIC_PASSWORD`, evita ese paso, pero [Expo la considera menos segura](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md) que la clave API, su método por defecto y recomendado. **La clave permite autenticarse sin ninguna interacción y, por lo tanto, automatizar el envío.**

Dos caminos para obtenerla:

- **Deja que EAS la gestione.** Ejecuta `eas credentials --platform ios`, elige el perfil `production`, inicia sesión en tu cuenta de Apple y luego elige "App Store Connect: Manage your API Key".
- **Usa tu propia clave.** En App Store Connect: Users and Access, pestaña Integrations, App Store Connect API, Team Keys y luego Generate API Key. Necesitas una cuenta Admin, y [la guía de Expo](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) le da el rol Admin a la clave.

En el segundo caso, anota el Key ID, que aparece en la lista de claves activas, y el Issuer ID, [arriba en la página Integrations](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests). Sobre todo, guarda el archivo `.p8`: [solo puedes descargarlo una vez](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), y Apple no guarda ninguna copia.

> Según Apple, una clave Admin puede crear y eliminar usuarios de tu cuenta. Apple pide no guardar nunca la clave en un repositorio de código.

## El archivo eas.json mínimo para copiar

Todos los valores son ficticios: reemplázalos por los tuyos.

```json
{
  "cli": {
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "autoIncrement": true
    }
  },
  "submit": {
    "production": {
      "ios": {
        "ascAppId": "1234567890",
        "appleTeamId": "ABCDE12345",
        "ascApiKeyPath": "./keys/AuthKey_XXXXXXXXXX.p8",
        "ascApiKeyIssuerId": "tu-issuer-id",
        "ascApiKeyId": "XXXXXXXXXX"
      }
    }
  }
}
```

- **`appVersionSource` y `autoIncrement`**: los servidores de EAS guardan el número de build y lo suben en cada build de producción. [Expo recomienda este modo remoto](https://docs.expo.dev/build-reference/app-versions/) desde EAS CLI 12.
- **`ascAppId`**: el número de tu ficha. Sin él, el modo no interactivo falla.
- **`appleTeamId`**: el identificador de tu equipo de Apple Developer.
- **`ascApiKeyPath`, `ascApiKeyIssuerId`, `ascApiKeyId`**: tu clave API. Los tres campos aceptan variables de entorno. Agrega la carpeta `keys` a tu `.gitignore`.

El campo `appleId` solo sirve si inicias sesión con tu Apple ID. Si EAS ya gestiona tu clave, quita también los tres campos `ascApiKey`. En mis tres apps, revisadas el 25 de octubre, el perfil de envío de producción solo contiene `ascAppId`, más `appleTeamId` en Solys: ninguna clave en el archivo.

## Lanzar el build y luego el envío

```bash
eas build --platform ios --profile production
eas submit --platform ios
```

Sin más opciones, `eas submit` te hace elegir el build que quieres enviar y, la primera vez, te pide tu Apple ID. El perfil de envío `production` se usa por defecto si existe. La [referencia de EAS CLI](https://docs.expo.dev/eas/cli/) enumera las opciones que evitan tener que elegir:

| Opción           | Qué hace                       |
| ---------------- | ------------------------------ |
| `--latest`       | Envía el último build iOS      |
| `--id`           | Envía un build de EAS concreto |
| `--path`         | Envía un archivo .ipa local    |
| `--url`          | Envía un archivo en línea      |
| `--groups`       | Lo agrega a un grupo interno   |
| `--what-to-test` | Rellena "What to test"         |

Para encadenarlo todo, agrega `--auto-submit` al comando de build. Según [la página de Expo sobre el envío automático](https://docs.expo.dev/build/automate-submissions/), el build terminado pasa a EAS Submit con el perfil de envío del mismo nombre que el perfil de build. Para elegir otro: `--auto-submit-with-profile=nombre`. **El build va a TestFlight, no a revisión.**

En integración continua, agrega `--non-interactive` y un token `EXPO_TOKEN`. El comando ya no puede preguntarte nada: necesita `ascAppId` en el perfil y una clave API, la que EAS vinculó a la app o la tuya en los tres campos `ascApiKey`.

## Qué pasa después del envío

**1. Apple procesa el build.** Tiene que pasar por ese procesamiento antes de aparecer en App Store Connect, y [Apple te envía un correo](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds) al terminar. Expo habla en general de 10 a 15 minutos antes de verlo en TestFlight.

**2. El cumplimiento de exportación.** El estado Missing Compliance significa que falta tu declaración sobre el cifrado. App Store Connect hace estas preguntas en cada nueva versión, salvo que el Info.plist ya las responda. Con Expo, la clave se llama `ios.config.usesNonExemptEncryption`:

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

Según [Apple](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations), `false` es válido si tu app, incluidas las bibliotecas, no usa ningún cifrado o solo un cifrado exento. El cifrado del sistema, como el HTTPS con URLSession, suele estarlo. **Declara `false` solo si es cierto para tu app: la declaración te compromete.** Como cualquier clave del Info.plist, requiere un nuevo build.

**3. TestFlight.** En el estado Ready to Submit, [según Apple](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses), el build puede ir a los testers internos, pasar la revisión beta para los externos o ir a revisión del App Store. El campo `groups` del perfil lo agrega a tus grupos internos. Todo lo demás está en [TestFlight para probar tu app](https://devoria.fr/es/blog/testflight-probar-app-iphone-antes-de-enviarla).

## El envío no es enviar a revisión

[Expo lo dice](https://docs.expo.dev/submit/introduction/): un build de TestFlight no se publica automáticamente en el App Store. EAS Submit no rellena tu ficha ni tus capturas. Quedan cuatro pasos en App Store Connect, descritos en [la ayuda de Apple sobre el envío a revisión](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-app):

1. **Rellena los metadatos obligatorios** de la versión.
2. **Elige el build** en la sección Build de la versión.
3. **Haz clic en "Add for Review".** La versión pasa a Ready for Review, pero todavía no se ha enviado nada a revisión.
4. **Haz clic en "Submit for Review".** El estado pasa a In Review cuando empieza la revisión.

## Los errores frecuentes y cómo corregirlos

| Error mostrado     | Causa                        | Corrección                |
| ------------------ | ---------------------------- | ------------------------- |
| ITMS-90189         | Número de build ya usado     | `autoIncrement`           |
| ITMS-90062 o 90186 | Versión ya cerrada           | Subir `version`           |
| "Set ascAppId"     | Falta `ascAppId` en CI       | Agregar `ascAppId`        |
| "API Keys cannot"  | Ninguna clave vinculada      | `eas credentials`         |
| ITMS-90683         | Falta el texto de propósito  | `ios.infoPlist`           |
| ITMS-91053         | Manifiesto incompleto        | `ios.privacyManifests`    |
| ITMS-90725         | SDK de iOS demasiado antiguo | Subir el SDK de Expo      |
| Missing Compliance | Cifrado no declarado         | `usesNonExemptEncryption` |

Según Expo, el número de build ya usado es una causa común de rechazo en el envío: todo está en número de build y versión. Tres errores tienen su propia guía: [ITMS-90683 con Expo](https://devoria.fr/es/blog/itms-90683-missing-purpose-string-expo), [ITMS-91053 con Expo](https://devoria.fr/es/blog/itms-91053-missing-api-declaration-expo) e ITMS-90725.

Los dos mensajes entre comillas vienen de EAS y se corrigen en su configuración. Missing Compliance también se resuelve respondiendo las preguntas en App Store Connect. **Para todas las demás filas, la corrección afecta al binario: haz un nuevo build y vuelve a enviarlo.** Una actualización remota no cambia ni el Info.plist, ni el manifiesto, ni los números.

## Envía tu primera app sin dar palos de ciego

El comando es solo un paso. El [iOS 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á frenando de verdad y te envía mi checklist para evitar rechazos de Apple. Para la ficha, las capturas y la aprobación, la página [publicar una aplicación en el App Store](https://devoria.fr/es/expertise/publicar-una-app-en-app-store) cubre cada etapa.

## Preguntas frecuentes

### ¿Cómo publicar una app Expo en el App Store?

Lanza un build de producción con EAS Build y luego envíalo con `eas submit --platform ios`. Después de que Apple lo procese, aparece en TestFlight. En App Store Connect, rellena la ficha, elige ese build en la versión y luego haz clic en "Add for Review" y "Submit for Review".

### ¿EAS Submit envía mi app a revisión de Apple?

No. EAS Submit envía el binario a App Store Connect, y el build llega a TestFlight. El envío a revisión se hace a mano en App Store Connect, una vez rellenada la ficha y elegido el build.

### ¿Dónde encuentro el ascAppId de mi app?

En App Store Connect, abre tu app y luego App Information. Es el campo Apple ID, en General Information. Es un número, no lo confundas con tu identificador de bundle.

### ¿Se necesita un Apple ID para usar eas submit?

La primera vez, el comando te lo pide. Después, con `ascAppId` en el perfil y una clave API de App Store Connect, puede ejecutarse sin interacción, incluso en integración continua. La clave API es el método por defecto y recomendado por Expo.

### ¿Cuánto tarda el build en aparecer en TestFlight?

Expo habla en general de 10 a 15 minutos de procesamiento por parte de Apple, que te envía un correo al terminar. Si el build se queda en el estado Missing Compliance, responde las preguntas sobre el cifrado y luego decláralo en tu configuración para los siguientes builds.


## Tu proyecto

[Apple Review Kit](https://devoria.fr/es/kits/review-apple): La checklist de revisión del App Store que uso, mis rechazos de Apple corregidos, las notas para el revisor y dos skills de Claude Code que revisan tu app. 29 €.

[iOS Kit](https://devoria.fr/es/kits/ios): Crea tu app para iPhone con Claude Code: el código base de mis apps, los skills que verifican su trabajo y los kits Apple Review, App Store Screenshots y ASO. 129,99 €.
