> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devin.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Subir compilaciones de iOS a TestFlight con Devin

> Configura App Store Connect, una clave de API y los secretos de Devin para que Devin pueda archivar una app de iOS en una VM de macOS y subir la compilación a TestFlight.

Devin puede archivar una app de iOS, firmarla, subirla a TestFlight y agregar la compilación a un grupo beta. Ejecuta `xcodebuild` en una [VM de macOS](/es/onboard-devin/environment/macos-support) y se autentica con una clave de API de App Store Connect que guardas como secretos de Devin.

Antes de que Devin pueda subir una compilación, debes:

1. Configurar tu app en App Store Connect.
2. Crear una clave de API de App Store Connect.
3. Agregar la clave y tu Team ID a Devin como secretos.
4. Asegurarte de que Devin pueda acceder a los servidores de Apple.

<Note>
  Subir a TestFlight requiere sesiones de macOS. Si usas un despliegue de SaaS dedicado, contacta a tu account team para habilitar las VM de macOS.
</Note>

<div id="requirements">
  ## Requisitos
</div>

| Requisito                               | Detalle                                                             |
| --------------------------------------- | ------------------------------------------------------------------- |
| Membresía del Apple Developer Program   | Una membresía de pago para el equipo propietario de la app.         |
| Registro de la app en App Store Connect | Una app con el mismo bundle ID que el proyecto de Xcode.            |
| Clave de API de App Store Connect       | Una clave de equipo con el rol **App Manager**.                     |
| Secretos de Devin                       | `ASC_KEY_ID`, `ASC_ISSUER_ID`, `ASC_PRIVATE_KEY` y `APPLE_TEAM_ID`. |
| Acceso a la red                         | La VM de macOS de Devin puede conectarse a los servidores de Apple. |

<div id="set-up-app-store-connect">
  ## Configurar App Store Connect
</div>

Realiza estos pasos en el portal de Apple Developer y en App Store Connect. Devin no puede hacerlos por ti: la mayoría requiere un Account Holder o Admin, y algunos necesitan autenticación de dos factores en la Apple Account de una persona.

<Steps>
  <Step title="Aceptar los acuerdos más recientes">
    El Account Holder inicia sesión en [App Store Connect](https://appstoreconnect.apple.com) y acepta los acuerdos pendientes en **Business**. Las subidas fallan mientras quede algún acuerdo obligatorio pendiente.
  </Step>

  <Step title="Registrar el bundle ID">
    En el [portal de Apple Developer](https://developer.apple.com/account/resources/identifiers/list), ve a **Certificates, Identifiers & Profiles → Identifiers** y registra un App ID que coincida con el bundle ID del target de tu app. Omite este paso si el identificador ya existe.
  </Step>

  <Step title="Crear el registro de la app">
    En App Store Connect, ve a **Apps**, haz clic en **+** y selecciona **New App**. Elige la plataforma, el nombre, el idioma principal, el bundle ID del paso anterior y un SKU. Las subidas a TestFlight fallan si no existe un registro de app para ese bundle ID.
  </Step>

  <Step title="Crear un grupo beta">
    Abre la app, ve a **TestFlight** y crea un grupo:

    * **Internal testing**: los testers deben ser usuarios de tu equipo de App Store Connect. Las compilaciones están disponibles en cuanto termina el procesamiento.
    * **External testing**: los testers pueden ser cualquier persona con una dirección de correo electrónico o un enlace público. Primero completa **Test Information** (descripción de la app beta, correo para feedback y datos de contacto para la revisión). La primera compilación de cada versión pasa por Beta App Review.
  </Step>

  <Step title="Responder al cumplimiento de exportación">
    Cada compilación debe responder a la pregunta de cumplimiento de exportación antes de que los testers puedan instalarla. Para omitir esa pregunta en cada compilación, define `ITSAppUsesNonExemptEncryption` en el `Info.plist` de tu app. Establécelo en `NO` si la app solo usa cifrado exento, como HTTPS.
  </Step>
</Steps>

<div id="create-an-app-store-connect-api-key">
  ## Crear una clave de API de App Store Connect
</div>

Devin se autentica con una clave de API de App Store Connect, no con una Apple Account. La clave no requiere autenticación de dos factores.

<Steps>
  <Step title="Habilitar el acceso a la API">
    En App Store Connect, ve a **Users and Access → Integrations → App Store Connect API**. Si el acceso a la API aún no está habilitado, el Account Holder debe hacer clic en **Request Access** y aceptar los términos.
  </Step>

  <Step title="Generar una clave de equipo">
    En **Team Keys**, haz clic en **+**. Escribe un nombre, como `Devin TestFlight`, y selecciona el rol **App Manager**. Necesitas el rol Admin para generar una clave. Si Xcode no puede crear un certificado de distribución con una clave de App Manager, genera una clave con el rol **Admin**.
  </Step>

  <Step title="Descargar la clave privada">
    Haz clic en **Download** junto a la nueva clave para guardar `AuthKey_<KEY_ID>.p8`. Apple solo permite descargar el archivo una vez. Si lo pierdes, revoca la clave y genera una nueva.
  </Step>

  <Step title="Copiar el Issuer ID y el Key ID">
    El **Issuer ID** aparece encima de la tabla de claves. El **Key ID** está en la fila de la clave.
  </Step>

  <Step title="Encontrar tu Team ID">
    En el [portal de Apple Developer](https://developer.apple.com/account), ve a **Membership details** y copia el **Team ID**. Es una cadena de 10 caracteres, como `A1B2C3D4E5`.
  </Step>
</Steps>

<Warning>
  Cualquier persona que tenga el archivo `.p8` puede subir compilaciones y gestionar TestFlight de todas las apps de tu equipo. Guárdalo únicamente en los secretos de Devin y no lo confirmes en un repositorio.
</Warning>

<div id="add-secrets-to-devin">
  ## Agregar secretos a Devin
</div>

Agrega los siguientes valores como secretos sin procesar en la [Secrets page](https://app.devin.ai/settings/secrets):

| Nombre del secreto | Valor                                                                                                                         | Dónde encontrarlo                                                           |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `ASC_KEY_ID`       | Key ID, por ejemplo `2X9R4HXF34`                                                                                              | App Store Connect → Users and Access → Integrations → App Store Connect API |
| `ASC_ISSUER_ID`    | Issuer ID, un UUID                                                                                                            | La misma página, encima de la tabla de claves                               |
| `ASC_PRIVATE_KEY`  | Contenido completo de `AuthKey_<KEY_ID>.p8`, incluidas las líneas `-----BEGIN PRIVATE KEY-----` y `-----END PRIVATE KEY-----` | El archivo que descargaste al crear la clave                                |
| `APPLE_TEAM_ID`    | Team ID, por ejemplo `A1B2C3D4E5`                                                                                             | Portal de Apple Developer → Membership details                              |

Para copiar la clave privada en una Mac, ejecuta:

```bash theme={null}
pbcopy < AuthKey_<KEY_ID>.p8
```

Elige un ámbito para los secretos:

* **Organization**: cualquier sesión de tu organización puede usar la clave. Usa este ámbito cuando el equipo publique compilaciones con Devin.
* **Personal**: solo pueden usar la clave las sesiones que tú inicies.

Los secretos solo están disponibles en las sesiones iniciadas después de agregarlos. Para más información sobre los ámbitos, consulta [Secretos](/es/product-guides/secrets).

<div id="allow-network-access">
  ## Permitir acceso a la red
</div>

La VM de macOS de Devin necesita conectarse a los servidores de Apple para firmar y subir compilaciones. Si tu organización usa una política de red restringida, agrega `api.appstoreconnect.apple.com` y los demás hosts de Apple que `xcodebuild` usa para firmar y subir. Permitir `*.apple.com` los cubre todos.

Un host bloqueado suele aparecer como un error de autenticación, no como un error de red. Consulta [Solución de problemas](#troubleshooting).

<div id="upload-a-build">
  ## Subir una compilación
</div>

Inicia una sesión de macOS y pídele a Devin que suba una compilación:

```text theme={null}
Archiva el esquema MyApp y súbelo a TestFlight. Usa un número de compilación
mayor que el de la última compilación en App Store Connect, agrega la compilación
al grupo "QA" y envíame el número de compilación cuando termines.
```

Devin usa los secretos para lo siguiente:

1. Escribir `ASC_PRIVATE_KEY` en `~/.appstoreconnect/private_keys/AuthKey_$ASC_KEY_ID.p8` con permisos `0600`.
2. Consultar el número de compilación más reciente con la API de App Store Connect y elegir uno superior.
3. Archivar la app con `xcodebuild archive`.
4. Firmar y subir la compilación con `xcodebuild -exportArchive`.
5. Esperar a que termine el procesamiento y luego agregar la compilación al grupo beta con la API de App Store Connect.

El paso de exportación usa un plist de opciones de exportación con `destination` configurado como `upload`:

```xml theme={null}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>method</key><string>app-store-connect</string>
  <key>destination</key><string>upload</string>
  <key>teamID</key><string>A1B2C3D4E5</string>
  <key>signingStyle</key><string>automatic</string>
</dict>
</plist>
```

Y estos comandos:

```bash theme={null}
xcodebuild -project MyApp.xcodeproj -scheme MyApp \
  -configuration Release -destination 'generic/platform=iOS' \
  -archivePath build/MyApp.xcarchive \
  CURRENT_PROJECT_VERSION=<build-number> archive

xcodebuild -exportArchive \
  -archivePath build/MyApp.xcarchive \
  -exportOptionsPlist ExportOptions.plist \
  -exportPath build/export \
  -allowProvisioningUpdates \
  -authenticationKeyID "$ASC_KEY_ID" \
  -authenticationKeyIssuerID "$ASC_ISSUER_ID" \
  -authenticationKeyPath ~/.appstoreconnect/private_keys/AuthKey_$ASC_KEY_ID.p8
```

`-allowProvisioningUpdates` permite que Xcode cree el certificado de distribución y el perfil de aprovisionamiento con la clave de API, de modo que la VM no necesita tener instalados los recursos de firma.

Si tu repositorio ya cuenta con un script de publicación, como un lane de `fastlane` o un target de `make`, indícale a Devin que lo use. `fastlane` acepta esa misma clave mediante `app_store_connect_api_key`.

<div id="save-the-steps-in-your-blueprint">
  ### Guarda los pasos en tu blueprint
</div>

Para evitar repetir las instrucciones en cada prompt, agrégalas a la sección `knowledge` del [blueprint](/es/onboard-devin/environment/blueprints) de tu repositorio:

```yaml theme={null}
runs-on: macos

knowledge:
  - name: testflight
    contents: |
      To upload a TestFlight build:
      1. Write $ASC_PRIVATE_KEY to ~/.appstoreconnect/private_keys/AuthKey_$ASC_KEY_ID.p8 (chmod 600).
      2. Use a build number higher than the latest build in App Store Connect.
      3. Archive the MyApp scheme, then run xcodebuild -exportArchive with
         ExportOptions.plist (destination: upload, teamID: $APPLE_TEAM_ID),
         -allowProvisioningUpdates, and the -authenticationKey* flags.
      4. Add the build to the "QA" beta group.
```

<div id="troubleshooting">
  ## Solución de problemas
</div>

**`No Accounts with App Store Connect Access` o `Failed to Use Accounts` durante la exportación.** Revisa primero el acceso a la red. Si la VM no puede comunicarse con los servidores de Apple, `xcodebuild` informa este error incluso cuando la clave es válida. Busca `ITunesConnectFoundationErrorDomain Code=-1003` en las líneas anteriores. Si la red funciona correctamente, verifica que la clave tenga el rol App Manager.

**`No profiles for '<bundle ID>' were found`.** El bundle ID no está registrado para el team indicado en `APPLE_TEAM_ID`, o no existe un registro de app asociado en App Store Connect.

**`The provided entity includes an attribute with a value that has already been used`.** El número de compilación ya se usó para esta versión. Vuelve a subirla con un número de compilación mayor.

**La compilación se sube, pero los testers no pueden instalarla.** Revisa la compilación en App Store Connect → TestFlight. Puede que aún esté procesándose, que le falte la información de cumplimiento de exportación o que esté esperando la Beta App Review.

**Xcode no puede crear un certificado de distribución.** El rol de la clave no permite gestionar certificados. Genera una clave con el rol Admin o pide a un Admin que cree el certificado de distribución en el portal de Apple Developer.

**Las environment variables están vacías en la sesión.** Los secretos solo están disponibles en las sesiones que se inician después de agregarlos. Inicia una nueva sesión.
