> ## 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.

# iOS-Builds mit Devin nach TestFlight hochladen

> Richten Sie App Store Connect, einen API key und Devin Secrets ein, damit Devin eine iOS-App auf einer macOS-VM archivieren und den Build nach TestFlight hochladen kann.

Devin kann eine iOS-App archivieren, signieren, nach TestFlight hochladen und den Build einer Beta-Gruppe hinzufügen. Dabei führt Devin `xcodebuild` auf einer [macOS-VM](/de/onboard-devin/environment/macos-support) aus und authentifiziert sich mit einem App Store Connect API key, den Sie als Devin Secrets hinterlegen.

Bevor Devin einen Build hochladen kann, müssen Sie:

1. Ihre App in App Store Connect einrichten.
2. Einen App Store Connect API key erstellen.
3. Den Key und Ihre Team ID als Secrets in Devin hinzufügen.
4. Sicherstellen, dass Devin die Server von Apple erreichen kann.

<Note>
  Für Uploads nach TestFlight sind macOS-Sitzungen erforderlich. Wenn Sie ein Dedicated-SaaS-Deployment nutzen, wenden Sie sich an Ihr Account-Team, um macOS-VMs aktivieren zu lassen.
</Note>

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

| Voraussetzung                             | Details                                                                |
| ----------------------------------------- | ---------------------------------------------------------------------- |
| Mitgliedschaft im Apple Developer Program | Eine kostenpflichtige Mitgliedschaft für das Team, dem die App gehört. |
| App-Eintrag in App Store Connect          | Eine App mit derselben Bundle-ID wie das Xcode-Projekt.                |
| App Store Connect API key                 | Ein Team-Key mit der Rolle **App Manager**.                            |
| Devin Secrets                             | `ASC_KEY_ID`, `ASC_ISSUER_ID`, `ASC_PRIVATE_KEY` und `APPLE_TEAM_ID`.  |
| Netzwerkzugriff                           | Die macOS-VM von Devin kann die Server von Apple erreichen.            |

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

Führen Sie diese Schritte im Apple Developer Portal und in App Store Connect aus. Devin kann sie nicht für Sie übernehmen: Die meisten erfordern einen Account Holder oder Admin, und für einige ist die Zwei-Faktor-Authentifizierung eines persönlichen Apple Accounts nötig.

<Steps>
  <Step title="Die neuesten Vereinbarungen akzeptieren">
    Der Account Holder meldet sich bei [App Store Connect](https://appstoreconnect.apple.com) an und akzeptiert unter **Business** alle ausstehenden Vereinbarungen. Uploads schlagen fehl, solange eine erforderliche Vereinbarung aussteht.
  </Step>

  <Step title="Die Bundle-ID registrieren">
    Gehen Sie im [Apple Developer Portal](https://developer.apple.com/account/resources/identifiers/list) zu **Certificates, Identifiers & Profiles → Identifiers** und registrieren Sie eine App-ID, die zur Bundle-ID Ihres App-Targets passt. Überspringen Sie diesen Schritt, wenn der Identifier bereits vorhanden ist.
  </Step>

  <Step title="Den App-Eintrag erstellen">
    Gehen Sie in App Store Connect zu **Apps**, klicken Sie auf **+** und wählen Sie **New App**. Legen Sie Plattform, Name, Hauptsprache, die Bundle-ID aus dem vorherigen Schritt sowie eine SKU fest. TestFlight-Uploads schlagen fehl, wenn für die Bundle-ID kein App-Eintrag vorhanden ist.
  </Step>

  <Step title="Eine Beta-Gruppe erstellen">
    Öffnen Sie die App, gehen Sie zu **TestFlight** und erstellen Sie eine Gruppe:

    * **Internal testing**: Tester müssen Nutzer in Ihrem App Store Connect Team sein. Builds stehen zur Verfügung, sobald die Verarbeitung abgeschlossen ist.
    * **External testing**: Tester können beliebige Personen mit einer E-Mail-Adresse oder einem öffentlichen Link sein. Füllen Sie zuerst die **Test Information** aus (Beschreibung der Beta-App, E-Mail-Adresse für Feedback und Kontaktdaten für das Review). Der erste Build jeder Version durchläuft das Beta App Review.
  </Step>

  <Step title="Angaben zur Exportkonformität machen">
    Für jeden Build muss die Frage zur Exportkonformität beantwortet werden, bevor Tester ihn installieren können. Damit diese Frage nicht bei jedem Build erscheint, setzen Sie `ITSAppUsesNonExemptEncryption` in der `Info.plist` Ihrer App. Setzen Sie den Wert auf `NO`, wenn die App ausschließlich ausgenommene Verschlüsselung wie HTTPS verwendet.
  </Step>
</Steps>

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

Devin authentifiziert sich mit einem App Store Connect API key, nicht mit einem Apple Account. Für den Key ist keine Zwei-Faktor-Authentifizierung erforderlich.

<Steps>
  <Step title="API-Zugriff aktivieren">
    Gehen Sie in App Store Connect zu **Users and Access → Integrations → App Store Connect API**. Falls der API-Zugriff noch nicht aktiviert ist, klickt der Account Holder auf **Request Access** und akzeptiert die Bedingungen.
  </Step>

  <Step title="Team Key generieren">
    Klicken Sie unter **Team Keys** auf **+**. Geben Sie einen Namen ein, etwa `Devin TestFlight`, und wählen Sie die Rolle **App Manager**. Zum Generieren eines Keys benötigen Sie die Admin-Rolle. Falls Xcode mit einem App-Manager-Key kein Verteilungszertifikat erstellen kann, generieren Sie stattdessen einen Key mit der Rolle **Admin**.
  </Step>

  <Step title="Private Key herunterladen">
    Klicken Sie neben dem neuen Key auf **Download**, um `AuthKey_<KEY_ID>.p8` zu speichern. Apple erlaubt den Download der Datei nur ein einziges Mal. Wenn Sie sie verlieren, widerrufen Sie den Key und generieren einen neuen.
  </Step>

  <Step title="Issuer ID und Key ID kopieren">
    Die **Issuer ID** wird oberhalb der Tabelle mit den Keys angezeigt. Die **Key ID** steht in der Zeile des jeweiligen Keys.
  </Step>

  <Step title="Team ID finden">
    Gehen Sie im [Apple Developer Portal](https://developer.apple.com/account) zu **Membership details** und kopieren Sie die **Team ID**. Es handelt sich um eine 10-stellige Zeichenfolge, zum Beispiel `A1B2C3D4E5`.
  </Step>
</Steps>

<Warning>
  Wer die `.p8`-Datei besitzt, kann Builds hochladen und TestFlight für sämtliche Apps Ihres Teams verwalten. Speichern Sie sie ausschließlich in Devin Secrets und committen Sie sie nicht in ein Repository.
</Warning>

<div id="add-secrets-to-devin">
  ## Secrets zu Devin hinzufügen
</div>

Fügen Sie die folgenden Werte als Raw Secrets auf der [Secrets page](https://app.devin.ai/settings/secrets) hinzu:

| Name des Secrets  | Wert                                                                                                                                    | Wo Sie ihn finden                                                           |
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `ASC_KEY_ID`      | Key ID, zum Beispiel `2X9R4HXF34`                                                                                                       | App Store Connect → Users and Access → Integrations → App Store Connect API |
| `ASC_ISSUER_ID`   | Issuer ID, eine UUID                                                                                                                    | Dieselbe Seite, oberhalb der Tabelle mit den Keys                           |
| `ASC_PRIVATE_KEY` | Vollständiger Inhalt von `AuthKey_<KEY_ID>.p8`, einschließlich der Zeilen `-----BEGIN PRIVATE KEY-----` und `-----END PRIVATE KEY-----` | Die Datei, die Sie beim Erstellen des Keys heruntergeladen haben            |
| `APPLE_TEAM_ID`   | Team ID, zum Beispiel `A1B2C3D4E5`                                                                                                      | Apple Developer Portal → Membership-Details                                 |

Führen Sie folgenden Befehl aus, um den Private Key auf einem Mac zu kopieren:

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

Wählen Sie einen Geltungsbereich für die Secrets:

* **Organization**: Jede Sitzung in Ihrer Organisation kann den Key verwenden. Nutzen Sie diesen Geltungsbereich, wenn das Team Builds mit Devin ausliefert.
* **Personal**: Nur von Ihnen gestartete Sitzungen können den Key verwenden.

Secrets stehen nur in Sitzungen zur Verfügung, die nach dem Hinzufügen gestartet werden. Weitere Informationen zu Geltungsbereichen finden Sie unter [Secrets](/de/product-guides/secrets).

<div id="allow-network-access">
  ## Netzwerkzugriff erlauben
</div>

Die macOS-VM von Devin muss die Server von Apple erreichen, um Builds zu signieren und hochzuladen. Wenn Ihre Organisation eine eingeschränkte Netzwerkrichtlinie verwendet, fügen Sie `api.appstoreconnect.apple.com` sowie die weiteren Apple-Hosts hinzu, die `xcodebuild` zum Signieren und Hochladen nutzt. Eine Freigabe von `*.apple.com` deckt sie alle ab.

Ein blockierter Host äußert sich meist als Authentifizierungsfehler, nicht als Netzwerkfehler. Siehe [Fehlerbehebung](#troubleshooting).

<div id="upload-a-build">
  ## Einen Build hochladen
</div>

Starten Sie eine macOS-Sitzung und bitten Sie Devin, einen Build hochzuladen:

```text theme={null}
Archiviere das Schema MyApp und lade es in TestFlight hoch. Verwende eine
Build-Nummer, die höher ist als der neueste Build in App Store Connect, füge
den Build zur Gruppe „QA“ hinzu und schicke mir die Build-Nummer, sobald es
fertig ist.
```

Devin verwendet die Secrets für Folgendes:

1. `ASC_PRIVATE_KEY` mit den Berechtigungen `0600` nach `~/.appstoreconnect/private_keys/AuthKey_$ASC_KEY_ID.p8` schreiben.
2. Die neueste Build-Nummer über die App Store Connect API prüfen und eine höhere wählen.
3. Die App mit `xcodebuild archive` archivieren.
4. Den Build mit `xcodebuild -exportArchive` signieren und hochladen.
5. Warten, bis die Verarbeitung abgeschlossen ist, und den Build anschließend über die App Store Connect API zur Beta-Gruppe hinzufügen.

Der Export-Schritt verwendet eine Export-Options-plist, in der `destination` auf `upload` gesetzt ist:

```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>
```

Und diese Befehle:

```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` ermöglicht es Xcode, das Verteilungszertifikat und das Provisioning-Profil mit dem API key zu erstellen, sodass auf der VM keine Signaturressourcen installiert sein müssen.

Wenn dein Repository bereits ein Release-Skript enthält, etwa eine `fastlane`-Lane oder ein `make`-Target, weise Devin an, dieses zu verwenden. `fastlane` nimmt denselben Schlüssel über `app_store_connect_api_key` entgegen.

<div id="save-the-steps-in-your-blueprint">
  ### Die Schritte im Blueprint speichern
</div>

Damit du die Anweisungen nicht in jedem Prompt wiederholen musst, füge sie dem Abschnitt `knowledge` im [Blueprint](/de/onboard-devin/environment/blueprints) deines Repository hinzu:

```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">
  ## Fehlerbehebung
</div>

**`No Accounts with App Store Connect Access` oder `Failed to Use Accounts` beim Export.** Prüfen Sie zuerst den Netzwerkzugriff. Wenn die VM die Server von Apple nicht erreichen kann, meldet `xcodebuild` diesen Fehler auch dann, wenn der Key gültig ist. Achten Sie in den Zeilen darüber auf `ITunesConnectFoundationErrorDomain Code=-1003`. Wenn das Netzwerk in Ordnung ist, prüfen Sie, ob der Key die Rolle App Manager hat.

**`No profiles for '<bundle ID>' were found`.** Die Bundle-ID ist nicht für das Team in `APPLE_TEAM_ID` registriert, oder es existiert kein zugehöriger App-Eintrag in App Store Connect.

**`The provided entity includes an attribute with a value that has already been used`.** Die Build-Nummer wurde für diese Version bereits verwendet. Laden Sie erneut mit einer höheren Build-Nummer hoch.

**Der Build wird hochgeladen, aber Tester können ihn nicht installieren.** Prüfen Sie den Build in App Store Connect → TestFlight. Möglicherweise wird er noch verarbeitet, es fehlen Angaben zur Exportkonformität, oder er wartet auf das Beta App Review.

**Xcode kann kein Verteilungszertifikat erstellen.** Die Rolle des Keys erlaubt das Verwalten von Zertifikaten nicht. Erzeugen Sie einen Key mit der Rolle Admin, oder lassen Sie einen Admin das Verteilungszertifikat im Apple Developer Portal erstellen.

**Umgebungsvariablen sind in der Sitzung leer.** Secrets stehen nur in Sitzungen zur Verfügung, die nach dem Hinzufügen gestartet wurden. Starten Sie eine neue Sitzung.
