EAS Submit iOS: publicar una app Expo en el App Store
Por Mehdi Azizi
Publicado el , 8 min
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.
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, revisada el 25 de octubre de 2026. Si no tienes Mac, el recorrido completo está en publicar una app iOS sin Mac. 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.
- Un identificador de bundle en
ios.bundleIdentifier. Según la referencia de la configuración de Expo, lo inventas tú, pero tiene que ser único en el App Store. - EAS CLI instalado, y luego
eas logincon 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 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, eas submit crea la ficha cuando envías tu primer build. Según la referencia de 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 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 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 perfilproduction, 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 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. Sobre todo, guarda el archivo .p8: solo puedes descargarlo una vez, 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.
{
"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"
}
}
}
}
appVersionSourceyautoIncrement: los servidores de EAS guardan el número de build y lo suben en cada build de producción. Expo recomienda este modo remoto 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 carpetakeysa 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
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 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, 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 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:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Según Apple, 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, 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.
El envío no es enviar a revisión
Expo lo dice: 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:
- Rellena los metadatos obligatorios de la versión.
- Elige el build en la sección Build de la versión.
- 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.
- 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, ITMS-91053 con 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 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: 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 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.