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

# Importar builds iOS para o TestFlight com Devin

> Configure o App Store Connect, uma chave de API e os segredos do Devin para que ele possa arquivar um app iOS em uma VM macOS e importar o build para o TestFlight.

O Devin pode arquivar um app iOS, assiná-lo, importá-lo para o TestFlight e adicionar o build a um beta group. Ele executa o `xcodebuild` em uma [VM macOS](/pt-BR/onboard-devin/environment/macos-support) e se autentica com uma chave de API do App Store Connect que você armazena como segredos do Devin.

Antes que o Devin possa importar um build, você precisa:

1. Configurar seu app no App Store Connect.
2. Criar uma chave de API do App Store Connect.
3. Adicionar a chave e seu Team ID ao Devin como segredos.
4. Garantir que o Devin consiga acessar os servidores da Apple.

<Note>
  Importar para o TestFlight exige sessões no macOS. Se você usa um deployment Dedicated SaaS, entre em contato com seu account team para ativar VMs macOS.
</Note>

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

| Requisito                             | Detalhe                                                               |
| ------------------------------------- | --------------------------------------------------------------------- |
| Associação ao Apple Developer Program | Uma associação paga para a equipe proprietária do app.                |
| Registro do app no App Store Connect  | Um app com o mesmo bundle ID do projeto Xcode.                        |
| Chave de API do App Store Connect     | Uma chave de equipe com a função **App Manager**.                     |
| Segredos do Devin                     | `ASC_KEY_ID`, `ASC_ISSUER_ID`, `ASC_PRIVATE_KEY` e `APPLE_TEAM_ID`.   |
| Acesso à rede                         | A VM macOS do Devin precisa conseguir acessar os servidores da Apple. |

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

Execute estas etapas no portal do Apple Developer e no App Store Connect. O Devin não pode fazê-las por você: a maioria exige um Account Holder ou Admin, e algumas precisam de autenticação de dois fatores na Apple Account de uma pessoa.

<Steps>
  <Step title="Aceite os contratos mais recentes">
    O Account Holder entra no [App Store Connect](https://appstoreconnect.apple.com) e aceita os contratos pendentes em **Business**. As importações falham enquanto houver um contrato obrigatório pendente.
  </Step>

  <Step title="Registre o bundle ID">
    No [portal do Apple Developer](https://developer.apple.com/account/resources/identifiers/list), acesse **Certificates, Identifiers & Profiles → Identifiers** e registre um App ID que corresponda ao bundle ID do target do seu app. Pule esta etapa se o identificador já existir.
  </Step>

  <Step title="Crie o registro do app">
    No App Store Connect, acesse **Apps**, clique em **+** e selecione **New App**. Escolha a plataforma, o nome, o idioma principal, o bundle ID da etapa anterior e um SKU. As importações para o TestFlight falham se não houver um registro de app para o bundle ID.
  </Step>

  <Step title="Crie um beta group">
    Abra o app, acesse **TestFlight** e crie um grupo:

    * **Internal testing**: os testadores precisam ser usuários do seu time no App Store Connect. Os builds ficam disponíveis assim que o processamento termina.
    * **External testing**: os testadores podem ser qualquer pessoa com um endereço de e-mail ou um link público. Antes, preencha as **Test Information** (descrição do app beta, e-mail para feedback e dados de contato para revisão). O primeiro build de cada versão passa pelo Beta App Review.
  </Step>

  <Step title="Responda à conformidade de exportação">
    Todo build precisa responder à pergunta de conformidade de exportação antes que os testadores possam instalá-lo. Para pular essa pergunta a cada build, defina `ITSAppUsesNonExemptEncryption` no `Info.plist` do seu app. Use `NO` se o app usa apenas criptografia isenta, como HTTPS.
  </Step>
</Steps>

<div id="create-an-app-store-connect-api-key">
  ## Criar uma chave de API do App Store Connect
</div>

O Devin se autentica com uma chave de API do App Store Connect, e não com uma Apple Account. A chave não exige autenticação de dois fatores.

<Steps>
  <Step title="Ativar o acesso à API">
    No App Store Connect, acesse **Users and Access → Integrations → App Store Connect API**. Se o acesso à API ainda não estiver ativado, o Account Holder deve clicar em **Request Access** e aceitar os termos.
  </Step>

  <Step title="Gerar uma chave de equipe">
    Em **Team Keys**, clique em **+**. Informe um nome, como `Devin TestFlight`, e selecione a função **App Manager**. É necessário ter a função Admin para gerar uma chave. Se o Xcode não conseguir criar um certificado de distribuição com uma chave App Manager, gere uma chave com a função **Admin**.
  </Step>

  <Step title="Baixar a chave privada">
    Clique em **Download** ao lado da nova chave para salvar `AuthKey_<KEY_ID>.p8`. A Apple permite baixar o arquivo apenas uma vez. Se você perdê-lo, revogue a chave e gere uma nova.
  </Step>

  <Step title="Copiar o Issuer ID e o Key ID">
    O **Issuer ID** aparece acima da tabela de chaves. O **Key ID** fica na linha da chave.
  </Step>

  <Step title="Encontrar o seu Team ID">
    No [portal do Apple Developer](https://developer.apple.com/account), acesse **Membership details** e copie o **Team ID**. É uma sequência de 10 caracteres, como `A1B2C3D4E5`.
  </Step>
</Steps>

<Warning>
  Qualquer pessoa com o arquivo `.p8` pode importar builds e gerenciar o TestFlight de todos os apps da sua equipe. Armazene-o apenas nos segredos do Devin e nunca faça commit dele em um repositório.
</Warning>

<div id="add-secrets-to-devin">
  ## Adicione segredos ao Devin
</div>

Adicione os seguintes valores como segredos brutos na [página de Secrets](https://app.devin.ai/settings/secrets):

| Nome do segredo   | Valor                                                                                                                       | Onde encontrar                                                              |
| ----------------- | --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `ASC_KEY_ID`      | Key ID, como `2X9R4HXF34`                                                                                                   | App Store Connect → Users and Access → Integrations → App Store Connect API |
| `ASC_ISSUER_ID`   | Issuer ID, um UUID                                                                                                          | Mesma página, acima da tabela de chaves                                     |
| `ASC_PRIVATE_KEY` | Conteúdo completo do `AuthKey_<KEY_ID>.p8`, incluindo as linhas `-----BEGIN PRIVATE KEY-----` e `-----END PRIVATE KEY-----` | O arquivo baixado no momento em que você criou a chave                      |
| `APPLE_TEAM_ID`   | Team ID, como `A1B2C3D4E5`                                                                                                  | Portal Apple Developer → Membership details                                 |

Para copiar a chave privada em um Mac, execute:

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

Escolha um escopo para os segredos:

* **Organization**: todas as sessões da sua organização podem usar a chave. Use esse escopo quando o time publica builds com Devin.
* **Personal**: apenas as sessões que você iniciar podem usar a chave.

Os segredos só ficam disponíveis em sessões iniciadas após a sua adição. Para saber mais sobre escopos, consulte [Segredos](/pt-BR/product-guides/secrets).

<div id="allow-network-access">
  ## Permitir acesso à rede
</div>

A VM macOS do Devin precisa acessar os servidores da Apple para assinar e importar builds. Se a sua organização usa uma política de rede restritiva, adicione `api.appstoreconnect.apple.com` e os demais hosts da Apple que o `xcodebuild` utiliza para assinatura e importação. Permitir `*.apple.com` cobre todos eles.

Um host bloqueado normalmente aparece como erro de autenticação, e não como erro de rede. Consulte [Solução de problemas](#troubleshooting).

<div id="upload-a-build">
  ## Importar um build
</div>

Inicie uma sessão no macOS e peça ao Devin para importar um build:

```text theme={null}
Arquive o scheme MyApp e importe para o TestFlight. Use um número de build
maior que o do último build no App Store Connect, adicione o build ao
grupo "QA" e me envie o número do build quando terminar.
```

O Devin usa os segredos para fazer o seguinte:

1. Escrever `ASC_PRIVATE_KEY` em `~/.appstoreconnect/private_keys/AuthKey_$ASC_KEY_ID.p8` com permissões `0600`.
2. Verificar o número do build mais recente com a API do App Store Connect e escolher um número maior.
3. Arquivar o app com `xcodebuild archive`.
4. Assinar e importar o build com `xcodebuild -exportArchive`.
5. Aguardar o fim do processamento e então adicionar o build ao beta group com a API do App Store Connect.

A etapa de exportação usa um plist de opções de exportação com `destination` definido 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>
```

E estes 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 o Xcode crie o certificado de distribuição e o provisioning profile com a chave de API, de modo que a VM não precisa ter os ativos de assinatura instalados.

Se o seu repositório já tiver um script de publicação de versão, como uma lane do `fastlane` ou um target do `make`, peça ao Devin para usá-lo. O `fastlane` aceita a mesma chave por meio de `app_store_connect_api_key`.

<div id="save-the-steps-in-your-blueprint">
  ### Salve as etapas no seu blueprint
</div>

Para não repetir as instruções em todo prompt, adicione-as à seção `knowledge` do [blueprint](/pt-BR/onboard-devin/environment/blueprints) do seu repositório:

```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">
  ## Solução de problemas
</div>

**`No Accounts with App Store Connect Access` ou `Failed to Use Accounts` durante a exportação.** Verifique primeiro o acesso à rede. Se a VM não conseguir alcançar os servidores da Apple, o `xcodebuild` reporta esse erro mesmo que a chave seja válida. Procure por `ITunesConnectFoundationErrorDomain Code=-1003` nas linhas acima. Se a rede estiver funcionando, verifique se a chave tem a função App Manager.

**`No profiles for '<bundle ID>' were found`.** O bundle ID não está registrado para o team indicado em `APPLE_TEAM_ID`, ou não existe nenhum registro de app para ele no App Store Connect.

**`The provided entity includes an attribute with a value that has already been used`.** O número de build já foi usado para esta versão. Faça a importação novamente com um número de build maior.

**O build é importado, mas os testadores não conseguem instalá-lo.** Verifique o build em App Store Connect → TestFlight. Ele pode ainda estar em processamento, estar sem as informações de conformidade de exportação ou aguardando a Beta App Review.

**O Xcode não consegue criar um certificado de distribuição.** A função da chave não permite gerenciar certificados. Gere uma chave com a função Admin ou peça a um Admin que crie o certificado de distribuição no portal Apple Developer.

**As variáveis de ambiente estão vazias na sessão.** Os segredos só ficam disponíveis em sessões iniciadas depois que você os adiciona. Inicie uma nova sessão.
