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

# DevinでiOSビルドをTestFlightにアップロードする

> App Store Connect、APIキー、Devinのシークレットを設定して、DevinがmacOS VM上でiOSアプリをアーカイブし、ビルドをTestFlightにアップロードできるようにします。

Devinは、iOSアプリのアーカイブ、署名、TestFlightへのアップロード、beta groupへのビルド追加を実行できます。[macOS VM](/ja/onboard-devin/environment/macos-support)上で`xcodebuild`を実行し、Devinのシークレットとして保存したApp Store Connect APIキーで認証します。

Devinがビルドをアップロードできるようにするには、事前に次の準備が必要です。

1. App Store Connectでアプリを設定する。
2. App Store Connect APIキーを作成する。
3. そのキーとTeam IDをシークレットとしてDevinに追加する。
4. DevinがAppleのサーバーに接続できるようにする。

<Note>
  TestFlightへのアップロードにはmacOSセッションが必要です。Dedicated SaaSデプロイメントをご利用の場合は、担当のアカウントチームにご連絡のうえ、macOS VMを有効にしてください。
</Note>

<div id="requirements">
  ## 要件
</div>

| 要件                               | 詳細                                                              |
| -------------------------------- | --------------------------------------------------------------- |
| Apple Developer Program のメンバーシップ | アプリを所有するチームの有料メンバーシップ。                                          |
| App Store Connect 上のアプリレコード      | Xcode プロジェクトと同じ bundle ID のアプリ。                                 |
| App Store Connect APIキー          | **App Manager** ロールを持つチームキー。                                    |
| Devin のシークレット                    | `ASC_KEY_ID`、`ASC_ISSUER_ID`、`ASC_PRIVATE_KEY`、`APPLE_TEAM_ID`。 |
| ネットワークアクセス                       | Devin の macOS VM から Apple のサーバーに接続できること。                        |

<div id="set-up-app-store-connect">
  ## App Store Connect のセットアップ
</div>

以下の手順は Apple Developer ポータルと App Store Connect で実施してください。これらは Devin が代行できません。大半は Account Holder または Admin の権限が必要で、一部は個人の Apple Account での二要素認証が必要です。

<Steps>
  <Step title="最新の契約に同意する">
    Account Holder が [App Store Connect](https://appstoreconnect.apple.com) にサインインし、**Business** で保留中の契約すべてに同意します。必要な契約が保留のままだと、アップロードは失敗します。
  </Step>

  <Step title="bundle ID を登録する">
    [Apple Developer ポータル](https://developer.apple.com/account/resources/identifiers/list) で **Certificates, Identifiers & Profiles → Identifiers** に移動し、アプリターゲットの bundle ID と一致する App ID を登録します。該当の識別子がすでに存在する場合は、この手順を省略してください。
  </Step>

  <Step title="App レコードを作成する">
    App Store Connect で **Apps** に移動し、**+** をクリックして **New App** を選択します。プラットフォーム、名前、主要言語、前の手順の bundle ID、SKU を指定します。bundle ID に対応する App レコードがないと、TestFlight へのアップロードは失敗します。
  </Step>

  <Step title="beta group を作成する">
    アプリを開いて **TestFlight** に移動し、グループを作成します。

    * **Internal testing**: テスターは App Store Connect チームのユーザーである必要があります。処理が完了し次第、ビルドが利用可能になります。
    * **External testing**: メールアドレスまたは公開リンクがあれば誰でもテスターになれます。先に **Test Information**(ベータアプリの説明、フィードバック用メールアドレス、審査用の連絡先情報)を入力してください。各バージョンの最初のビルドは Beta App Review の対象となります。
  </Step>

  <Step title="輸出コンプライアンスに回答する">
    テスターがインストールできるようにするには、ビルドごとに輸出コンプライアンスの質問へ回答する必要があります。この質問をビルドごとに回答せずに済ませるには、アプリの `Info.plist` で `ITSAppUsesNonExemptEncryption` を設定します。HTTPS など対象外の暗号化のみを使用している場合は `NO` を設定してください。
  </Step>
</Steps>

<div id="create-an-app-store-connect-api-key">
  ## App Store Connect APIキーを作成する
</div>

DevinはApple Accountではなく、App Store Connect APIキーで認証します。このキーに二要素認証は不要です。

<Steps>
  <Step title="APIアクセスを有効にする">
    App Store Connectで **Users and Access → Integrations → App Store Connect API** に移動します。APIアクセスがまだ有効になっていない場合は、Account Holderが **Request Access** をクリックして利用規約に同意します。
  </Step>

  <Step title="チームキーを生成する">
    **Team Keys** で **+** をクリックします。`Devin TestFlight` などの名前を入力し、**App Manager** ロールを選択します。キーの生成にはAdminロールが必要です。App ManagerのキーでXcodeが配布証明書を作成できない場合は、代わりに **Admin** ロールでキーを生成してください。
  </Step>

  <Step title="秘密鍵をダウンロードする">
    新しいキーの横にある **Download** をクリックして `AuthKey_<KEY_ID>.p8` を保存します。このファイルをダウンロードできるのは一度だけです。紛失した場合は、キーを失効させて新しいキーを生成してください。
  </Step>

  <Step title="Issuer IDとKey IDをコピーする">
    **Issuer ID** はキー一覧の表の上に表示されます。**Key ID** は各キーの行にあります。
  </Step>

  <Step title="Team IDを確認する">
    [Apple Developerポータル](https://developer.apple.com/account)で **Membership details** に移動し、**Team ID** をコピーします。`A1B2C3D4E5` のような10文字の文字列です。
  </Step>
</Steps>

<Warning>
  `.p8` ファイルを入手した人は誰でも、チーム内のすべてのアプリでビルドのアップロードやTestFlightの管理ができてしまいます。保管はDevinのシークレットに限定し、リポジトリにはコミットしないでください。
</Warning>

<div id="add-secrets-to-devin">
  ## Devin にシークレットを追加する
</div>

以下の値を raw シークレットとして [Secrets ページ](https://app.devin.ai/settings/secrets)に追加します。

| シークレット名           | 値                                                                                              | 確認場所                                                                        |
| ----------------- | ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `ASC_KEY_ID`      | Key ID (例: `2X9R4HXF34`)                                                                       | App Store Connect → Users and Access → Integrations → App Store Connect API |
| `ASC_ISSUER_ID`   | Issuer ID (UUID)                                                                               | 同じページのキー一覧の上部                                                               |
| `ASC_PRIVATE_KEY` | `AuthKey_<KEY_ID>.p8` の全内容 (`-----BEGIN PRIVATE KEY-----` と `-----END PRIVATE KEY-----` の行を含む) | キーの作成時にダウンロードしたファイル                                                         |
| `APPLE_TEAM_ID`   | Team ID (例: `A1B2C3D4E5`)                                                                      | Apple Developer ポータル → Membership details                                   |

Mac で秘密鍵をコピーするには、次のコマンドを実行します。

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

シークレットのスコープを選択します。

* **Organization**: 組織内のすべてのセッションでキーを利用できます。チームで Devin を使ってビルドをリリースする場合は、このスコープを利用してください。
* **Personal**: 自分が開始したセッションのみでキーを利用できます。

シークレットは、追加した後に開始したセッションでのみ利用できます。スコープの詳細については、[シークレット](/ja/product-guides/secrets)を参照してください。

<div id="allow-network-access">
  ## ネットワークアクセスを許可する
</div>

Devin の macOS VM は、ビルドの署名とアップロードのために Apple のサーバーへ接続する必要があります。組織で制限的なネットワークポリシーを利用している場合は、`api.appstoreconnect.apple.com` と、`xcodebuild` が署名およびアップロードに利用するその他の Apple ホストを追加してください。`*.apple.com` を許可すれば、これらをまとめてカバーできます。

ホストがブロックされている場合、ネットワークエラーではなく認証エラーとして表示されるのが一般的です。[トラブルシューティング](#troubleshooting)を参照してください。

<div id="upload-a-build">
  ## ビルドをアップロードする
</div>

macOS セッションを開始し、Devin にビルドのアップロードを依頼します。

```text theme={null}
MyApp スキームをアーカイブして TestFlight にアップロードしてください。ビルド番号は
App Store Connect にある最新ビルドより大きい番号を利用し、そのビルドを
"QA" グループに追加して、完了したらビルド番号を教えてください。
```

Devin はシークレットを利用して以下を実行します:

1. `ASC_PRIVATE_KEY` を `0600` 権限で `~/.appstoreconnect/private_keys/AuthKey_$ASC_KEY_ID.p8` に書き込む。
2. App Store Connect API で最新のビルド番号を確認し、それより大きい番号を選ぶ。
3. `xcodebuild archive` でアプリをアーカイブする。
4. `xcodebuild -exportArchive` でビルドに署名してアップロードする。
5. 処理の完了を待ってから、App Store Connect API でビルドを beta group に追加する。

エクスポートのステップでは、`destination` を `upload` に設定した export options plist を利用します:

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

また、以下のコマンドを実行します:

```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` を指定すると、Xcode が APIキーを利用して配布証明書とプロビジョニングプロファイルを作成できるため、VM に署名用アセットをインストールする必要がありません。

リポジトリに `fastlane` のレーンや `make` ターゲットなどのリリーススクリプトが既にある場合は、それを利用するよう Devin に指示してください。`fastlane` でも `app_store_connect_api_key` から同じキーを渡せます。

<div id="save-the-steps-in-your-blueprint">
  ### 手順をブループリントに保存する
</div>

プロンプトのたびに同じ手順を書かずに済むよう、リポジトリの[ブループリント](/ja/onboard-devin/environment/blueprints)の `knowledge` セクションに追加しておきましょう。

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

**エクスポート中に `No Accounts with App Store Connect Access` または `Failed to Use Accounts` が発生する。** まずネットワークアクセスを確認してください。VM が Apple のサーバーに到達できない場合、キーが有効でも `xcodebuild` はこのエラーを報告します。その直前の行に `ITunesConnectFoundationErrorDomain Code=-1003` が出ていないか確認してください。ネットワークに問題がなければ、キーに App Manager ロールが付与されているかを確認してください。

**`No profiles for '<bundle ID>' were found`。** bundle ID が `APPLE_TEAM_ID` の Team に登録されていないか、App Store Connect に対応する app レコードが存在しません。

**`The provided entity includes an attribute with a value that has already been used`。** そのバージョンで同じビルド番号が既に利用されています。ビルド番号を上げて再度アップロードしてください。

**ビルドはアップロードされるのにテスターがインストールできない。** App Store Connect → TestFlight でビルドを確認してください。まだ処理中である、輸出コンプライアンス情報が未入力である、または Beta App Review 待ちの可能性があります。

**Xcode が配布証明書を作成できない。** キーのロールでは証明書の管理が許可されていません。Admin ロールのキーを生成するか、Admin に Apple Developer ポータルで配布証明書を作成してもらってください。

**セッション内で environment variables が空になる。** シークレットは、追加した後に開始したセッションでのみ利用できます。新しいセッションを開始してください。
