# ExpoプロジェクトでOTAアップデートを使う

Expo Goの制約を確認し、Paktaのネイティブ連携、チャネル、Releaseビルドを設定して更新を配信します。

## Expo 更新ワークフローを選択してください {#update-workflow}

このガイドでは、Expo OTA アップデートに Pakta の `rn-update` クライアントと `pakta` CLI を使用します。 `expo-updates` と EAS アップデートを比較する場合は、まず [Expo アップデートと Pakta](/docs/expo-updates-vs-pakta) をお読みください。別の OTA クライアントから移行するには、バンドルのロードを担当する 1 つのシステムを備えた新しいネイティブ ビルドが必要です。

## プロジェクトを準備する {#before}

Expo Go ではなく、ネイティブ Expo アプリを使用してください。このプロジェクトの iOS 自動統合には、Expo 50 以降が必要です。既存の互換性のある Expo/RN の組み合わせを維持します。

プロジェクト ルートからアプリケーションをインストールして選択します。

```bash
npx expo install rn-update
npm install -g rn-update-cli
pakta login
pakta selectApp --platform android
```

必要に応じてコンソールでアプリケーションを作成するか、`pakta createApp --platform android --name ExpoDemo` を実行します。一致する `ios` アプリケーションを個別に選択します。

## ルート レイアウトをラップする {#layout}

Expo Router の場合、プロバイダーを既存の `app/_layout.tsx` に追加します。この最小限のスタックの例は、テーマ、フォント、認証設定とマージする必要があります。

```tsx title="app/_layout.tsx"
import { Stack } from 'expo-router';
import { Platform } from 'react-native';
import { Pakta, UpdateProvider } from 'rn-update';
import updateConfig from '../update.json';

const configs = updateConfig as Record<string, { appKey: string }>;
const appKey = configs[Platform.OS]?.appKey;
if (!appKey) throw new Error(`Missing appKey for ${Platform.OS}`);

const client = new Pakta({ appKey, updateStrategy: 'silentAndLater' });

export default function RootLayout() {
  return (
    <UpdateProvider client={client}>
      <Stack />
    </UpdateProvider>
  );
}
```

`src/app/_layout.tsx` から `../../update.json` をインポートします。Expo Routerを使わない場合は、[標準のルートコンポーネント設定](/docs/integration#basic)を参照してください。

## オプション: チャネルを設定します {#channel}

`default` については、このセクションをスキップしてください。 [最初にコンソール](/docs/channels#manage)でカスタムチャンネルを作成します。 `rn-update` には構成プラグインが含まれています。ローカルプラグインを作成しないでください。

このエントリを `app.json` の既存の `expo.plugins` 配列に追加します。

```json title="app.json · merge into existing configuration"
{
  "expo": {
    "plugins": [
      ["rn-update", { "channel": "staging" }]
    ]
  }
}
```

`channel` は、Android マニフェスト メタデータと iOS `Info.plist` に書き込まれます。 Android と iOS で異なるチャネルが必要な場合は、別のビルド構成を使用します。 `default` にはプラグイン エントリは必要ありません。

## Release ビルドを作成して確認する {#build}

`npx expo prebuild` を実行し、生成された Android マニフェストまたは iOS plist で `channel` を確認します。 EAS Build は同じプラグインを実行します。

```bash title="Android"
npx expo run:android --variant release
```

```bash title="iOS · macOS"
npx expo run:ios --configuration Release
```

既存の EAS 制作ワークフローも機能します。リリース アプリでホット アップデートを確認します。

## 更新をアップロードして公開する {#publish}

1. デバイスにインストールされている正確な APK / IPA を保持し、`uploadApk` / `uploadIpa` に登録します。 [ネイティブ登録](/docs/publish#register-native)を参照してください。
2. 画面ラベルを変更し、アップデートをビルドします。

```bash
pakta bundle --platform android --expo --output .pakta/output/android.ppk --no-interactive
```

3. [最初のリリース ](/docs/publish#publish) に従い、ネイティブ インストーラーから解析されたチャネルとバージョンを使用します。
4. インストールされているリリース アプリをチェックインし、ダウンロードを待ち、完全に閉じて再度開き、変更されたラベルを確認します。

iOS の場合は、`--platform ios` と別の出力パスを使用します。ネイティブ プラグイン、チャネル、ネイティブ SDK の変更には、`.ppk` だけでなく、新しいインストーラーが必要です。
