---
title: "Flutter SDK でユーザーを識別する"
description: "Adapty でユーザーを識別して、パーソナライズされたサブスクリプション体験を向上させましょう。"
---

Adapty はすべてのユーザーに対して内部プロファイル ID を作成します。ただし、独自の認証システムがある場合は、独自の Customer User ID を設定する必要があります。[Profiles](profiles-crm) セクションで Customer User ID によってユーザーを検索でき、また[サーバーサイド API](getting-started-with-server-side-api) でも使用でき、すべてのインテグレーションに送信されます。

### 設定時に Customer User ID を設定する \{#setting-customer-user-id-on-configuration\}

設定時にユーザー ID がある場合は、`.activate()` メソッドの `customerUserId` パラメータとして渡すだけです：

```dart showLineNumbers title="Dart"
   try {
       await Adapty().activate(
           configuration: AdaptyConfiguration(apiKey: 'YOUR_API_KEY')
             ..withCustomerUserId(YOUR_CUSTOMER_USER_ID)
       );
   } catch (e) {
       // handle the error
   }
```

:::tip

Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか？ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。

:::

### 設定後に Customer User ID を設定する \{#setting-customer-user-id-after-configuration\}

SDK の設定時にユーザー ID がない場合は、`.identify()` メソッドを使っていつでも後から設定できます。このメソッドが最もよく使われるケースは、登録または認証後に匿名ユーザーから認証済みユーザーに切り替わるときです。

```dart showLineNumbers
try {
  await Adapty().identify(customerUserId);
} on AdaptyError catch (adaptyError) {
  // handle the error
} catch (e) {
}
```

リクエストパラメータ：

- **Customer User ID**（必須）：文字列のユーザー識別子。

:::warning
重要なユーザーデータの再送信

ユーザーが再度ログインするなど、一部のケースでは Adapty のサーバーにはすでにそのユーザーの情報があります。このような場合、Adapty SDK は自動的に新しいユーザーとして動作するよう切り替わります。カスタム属性やサードパーティネットワークからのアトリビューションなど、匿名ユーザーに渡したデータがある場合は、識別されたユーザーに対してそのデータを再送信する必要があります。

また、新しいユーザーのデータが異なる可能性があるため、ユーザーを識別した後はすべてのペイウォールとプロダクトを再取得する必要があることにも注意してください。
:::

### ログアウトとログイン \{#logging-out-and-logging-in\}

`.logout()` メソッドを呼び出すことで、いつでもユーザーをログアウトできます：

```dart showLineNumbers
try {
  await Adapty().logout();
} on AdaptyError catch (adaptyError) {
  // handle the error
} catch (e) {
  // handle unknown error
}
```

その後、`.identify()` メソッドを使ってユーザーをログインできます。

## `appAccountToken` を設定する（iOS） \{#assign-appaccounttoken-ios\}

[`appAccountToken`](https://developer.apple.com/documentation/storekit/product/purchaseoption/appaccounttoken(_:)) は、App Store のトランザクションを内部ユーザー ID に紐付けるための **UUID** です。  
StoreKit はすべてのトランザクションにこのトークンを関連付けるため、バックエンドで App Store のデータとユーザーを照合できます。

ユーザーごとに生成した安定した UUID を使用し、同じアカウントに対してデバイスをまたいで再利用してください。
これにより、購入と App Store の通知が正しく紐付けられます。

トークンは 2 つの方法で設定できます — SDK の起動時またはユーザーの識別時です。

:::important
`appAccountToken` は必ず `customerUserId` と一緒に渡す必要があります。
トークンのみを渡した場合、トランザクションに含まれません。
:::

```dart showLineNumbers
// During configuration:
try {
   await Adapty().activate(
       configuration: AdaptyConfiguration(apiKey: 'YOUR_API_KEY')
         ..withCustomerUserId(YOUR_CUSTOMER_USER_ID, iosAppAccountToken: "YOUR_APP_ACCOUNT_TOKEN")
   );
} catch (e) {
   // handle the error
}
// Or when identifying users
try {
    await Adapty().identify(customerUserId, iosAppAccountToken: "YOUR_APP_ACCOUNT_TOKEN");
} on AdaptyError catch (adaptyError) {
    // handle the error
} catch (e) {
}
```

### 難読化されたアカウント ID を設定する（Android） \{#set-obfuscated-account-ids-android\}

Google Play では、ユーザーのプライバシーとセキュリティを強化するために、特定のユースケースで難読化されたアカウント ID が必要です。これらの ID により、Google Play はユーザー情報を匿名に保ちながら購入を識別できます。これは不正防止や分析において特に重要です。

アプリが機密性の高いユーザーデータを扱う場合、または特定のプライバシー規制に準拠する必要がある場合は、これらの ID を設定する必要があるかもしれません。難読化された ID により、Google Play は実際のユーザー識別子を公開せずに購入を追跡できます。

```dart showLineNumbers
// During configuration:
try {
   await Adapty().activate(
       configuration: AdaptyConfiguration(apiKey: 'YOUR_API_KEY')
         ..withCustomerUserId(YOUR_CUSTOMER_USER_ID, androidObfuscatedAccountId: "OBFUSCATED_ACCOUNT_ID")
   );
} catch (e) {
   // handle the error
}
// Or when identifying users
try {
    await Adapty().identify(customerUserId, androidObfuscatedAccountId: "OBFUSCATED_ACCOUNT_ID");
} on AdaptyError catch (adaptyError) {
    // handle the error
} catch (e) {
}
```

## デバイスをまたいでユーザーを識別する \{#detect-users-across-devices\}

---
no_index: true
---

SDKが有効化されると、StoreKit（iOS）またはGoogle Play Billing（Android）からユーザーの既存のエンタイトルメントを自動的に読み取り、Adaptyバックエンドと同期します。有効なサブスクリプションは、アプリが`restorePurchases`を呼び出すことなく、Adaptyプロファイルに表示されます。

**自動では行われない**のは、新しいデバイスのプロファイルが元のデバイスと同じユーザーのものであることの認識です。AdaptyはCustomer User IDでプロファイルを照合するため、同一性の継続性はCUIDとして何を使用するかによって異なります。

**デバイス間でAdaptyが検出できること**

| あなたの設定 | Adaptyが検出すること | 必要な対応 |
| --- | --- | --- |
| Customer User ID = `device_id`（アプリのログインなし） | 新しいデバイスは異なるCUIDを取得するため、異なるプロファイルが作成されます。サブスクリプションは**Access level updated**イベントを通じて新しいプロファイルに同期されますが、`subscription_started`は発火しません。新しいプロファイルは元の購入の継承者として扱われます。`subscription_started`に基づくアナリティクスは、リターニングユーザーをカウント不足します。 | リターニングユーザーが既存のプロファイルをデバイス間で照合できるよう、安定したアカウントIDをCustomer User IDとして使用してください。 |
| Customer User ID = 安定したアカウントID（すべてのデバイスでログイン） | SDKは`activate()`でサブスクリプションを自動同期し、`identify()`がCUIDで既存のプロファイルを照合します。 | 追加の設定は不要です。IDとサブスクリプションの両方が自動的に解決されます。 |
| Apple Family Sharing の継承者 | ファミリーメンバーは**Access level updated**イベントのみを通じてサブスクリプションを受け取ります。`subscription_started`は発火しません。 | **Access level updated**をリッスンしてください。完全なイベントマトリクスは[Apple Family Sharing](apple-family-sharing)を参照してください。 |
| 同じApple/Googleアカウント、異なるアプリ内ユーザー | 最初に購入を記録したプロファイルが親になります。その後のプロファイルは継承者チェーンを通じてサブスクリプションを確認し、**Access level updated**イベントが1回発生します。 | ログインを必須にし、あなたのモデルに合った[共有モード](sharing-paid-access-between-user-accounts)を選択してください。 |

**新しいデバイスでの購入の復元**

ペイウォールにユーザーが操作できる「購入を復元」ボタンを設置してください。Apple App Review（ガイドライン3.1.1）で必須とされており、自動同期がエッジケースを見逃した場合のフォールバックとして機能します。このボタンはSDKの`restorePurchases`を呼び出す必要があります。

初回起動時にプログラムで`restorePurchases`を呼び出すことは、通常の使用では必要ありません。SDKはすでに`activate()`で同等の処理を実行しています。プログラムによる呼び出しは、`activate()`完了後にアクセスが欠落している場合のデバッグなど、強制的に新しいレシートチェックを行う場合にのみ使用してください。