---
title: "Flutter SDKでのユーザー識別"
description: "FlutterでのアプリサブスクリプションのAdapty設定に関するクイックスタートガイド。"
---

:::important
このガイドは、独自の認証システムをお持ちの方向けです。ここでは、Adaptyのユーザープロファイルを既存の認証システムに合わせて管理する方法について説明します。
:::

ユーザーの購入管理方法は、アプリの認証モデルによって異なります：
- バックエンド認証を使用しておらず、ユーザーデータも保存しないアプリの場合は、[匿名ユーザーに関するセクション](#anonymous-users)を参照してください。
- バックエンド認証がある（または予定している）アプリの場合は、[識別済みユーザーに関するセクション](#identified-users)を参照してください。

**主要な概念**：
- **プロファイル**はSDKが動作するために必要なエンティティで、Adaptyが自動的に作成します。
- プロファイルは匿名（**カスタマーユーザーIDなし**）または識別済み（**カスタマーユーザーIDあり**）のいずれかです。
- **カスタマーユーザーID**を提供することで、Adaptyのプロファイルと内部認証システムをクロスリファレンスできます。

匿名ユーザーと識別済みユーザーの違いは以下の通りです：

|                         | 匿名ユーザー                                          | 識別済みユーザー                                                        |
|-------------------------|---------------------------------------------------|-------------------------------------------------------------------------|
| **購入管理** | ストアレベルの購入履歴復元                  | カスタマーユーザーIDを通じてデバイス間で購入履歴を維持 |
| **プロファイル管理**  | 再インストールのたびに新しいプロファイルを作成                    | セッションやデバイスをまたいで同じプロファイルを使用                            |
| **データ保持**    | 匿名ユーザーのデータはアプリのインストールに紐づく | 識別済みユーザーのデータはアプリのインストールをまたいで保持される                |

## 匿名ユーザー \{#anonymous-users\}

バックエンド認証を使用していない場合、**アプリのコードで認証を処理する必要はありません**：

1. アプリの初回起動時にSDKが有効化されると、Adaptyは**ユーザー用の新しいプロファイルを作成**します。
2. ユーザーがアプリ内で何かを購入すると、その購入は**ユーザーのAdaptyプロファイルとストアアカウントに紐づけられます**。
3. ユーザーがアプリを**再インストール**したり、**新しいデバイス**にインストールしたりすると、Adaptyは**有効化時に新しい匿名プロファイルを作成**します。
4. ユーザーが以前にアプリ内で購入をしている場合、デフォルトでは、SDK有効化時にApp Storeから購入が自動的に同期されます。

匿名ユーザーの場合、インストールのたびに新しいプロファイルが作成されますが、Adaptyのアナリティクスで[新しいインストールとして扱われる条件を設定](general#4-installs-definition-for-analytics)できるため、問題ありません。

匿名ユーザーの場合、**デバイスID**でインストールをカウントする必要があります。この場合、再インストールを含め、デバイスへのアプリのインストールそれぞれが1回のインストールとしてカウントされます。

## 識別済みユーザー \{#identified-users\}

ユーザーを識別するには2つの方法があります：

- [**ログイン・サインアップ時：**](#during-loginsignup) アプリ起動後にユーザーがサインインする場合は、認証時に`identify()`をカスタマーユーザーIDと共に呼び出します。

- [**SDK有効化時：**](#during-the-sdk-activation) アプリ起動時にすでにカスタマーユーザーIDが保存されている場合は、`activate()`の呼び出し時に送信します。

:::important
デフォルトでは、Adaptyが現在別のカスタマーユーザーIDに紐づいているカスタマーユーザーIDからの購入を受け取った場合、アクセスレベルは共有されるため、両方のプロファイルが有料アクセスを持つことになります。この設定を変更して、有料アクセスを一方のプロファイルから別のプロファイルに移譲したり、共有を完全に無効にしたりできます。詳細は[こちらの記事](general#6-sharing-paid-access-between-user-accounts)を参照してください。
:::

  <img src="/assets/shared/img/identify-diagram.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

### ログイン・サインアップ時 \{#during-loginsignup\}

アプリ起動後にユーザーを識別する場合（例：ログインやサインアップ後）は、`identify`メソッドを使用してカスタマーユーザーIDを設定します。

- **このカスタマーユーザーIDを使用したことがない場合**、Adaptyは自動的に現在のプロファイルに紐づけます。
- **以前にこのカスタマーユーザーIDでユーザーを識別したことがある場合**、AdaptyはそのカスタマーユーザーIDに関連するプロファイルに切り替えます。

:::important
カスタマーユーザーIDは各ユーザーで一意でなければなりません。パラメーターの値をハードコードすると、すべてのユーザーが同一人物として扱われます。
:::

他のSDKメソッドを呼び出す前に、必ず`identify`を`await`してください。並列呼び出しをすると`#3006 profileWasChanged`が発生するか、匿名プロファイルに対して処理が行われます。詳しくは[Flutter SDKの呼び出し順序](flutter-sdk-call-order)を参照してください。

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

### SDK有効化時 \{#during-the-sdk-activation\}

SDKを有効化する時点でカスタマーユーザーIDがわかっている場合は、`identify`を別途呼び出す代わりに、`activate`メソッドに渡すことができます。

カスタマーユーザーIDがわかっていても有効化後に設定する場合、有効化時にAdaptyが新しい匿名プロファイルを作成し、`identify`を呼び出した後にのみ既存のプロファイルへ切り替わります。

既存のカスタマーユーザーID（以前に使用したもの）でも新しいものでも渡すことができます。新しいIDを渡すと、有効化時に作成された新しいプロファイルがそのカスタマーユーザーIDに自動的に紐づけられます。

:::note
デフォルトでは、匿名プロファイルの作成はアナリティクスのダッシュボードに影響しません。インストールはデバイスIDに基づいてカウントされるためです。

デバイスIDはストアからデバイスへのアプリの1回のインストールを表し、アプリを再インストールした場合にのみ再生成されます。  
初回インストールか再インストールかに関係なく、また既存のカスタマーユーザーIDを使用するかどうかにも依存しません。

プロファイルの作成（SDK有効化時またはログアウト時）、ログイン、またはアプリの再インストールなしのアップグレードでは、追加のインストールイベントは生成されません。

デバイスではなく一意のユーザーを基準にインストールをカウントしたい場合は、**App settings**に移動して[**Installs definition for analytics**](general#4-installs-definition-for-analytics)を設定してください。
:::

```dart showLineNumbers"
   try {
       await Adapty().activate(
           configuration: AdaptyConfiguration(apiKey: 'YOUR_API_KEY')
             ..withCustomerUserId(YOUR_CUSTOMER_USER_ID) // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
       );
   } catch (e) {
       // handle the error
   }
```

### ユーザーのログアウト \{#log-users-out\}

ユーザーをログアウトさせるボタンがある場合は、`logout`メソッドを使用します。

:::important
ユーザーをログアウトすると、そのユーザーに対して新しい匿名プロファイルが作成されます。
:::

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

:::info
ユーザーをアプリに再度ログインさせるには、`identify`メソッドを使用してください。
:::

### ログインなしで購入を許可する \{#allow-purchases-without-login\}

ユーザーがアプリにログインする前後の両方で購入できる場合、ログイン後もアクセスが維持されるよう対応する必要があります：

1. ログアウト中のユーザーが購入を行うと、AdaptyはそれをユーザーのAnonymous Profile IDに紐づけます。
2. ユーザーがアカウントにログインすると、Adaptyは識別済みプロファイルへの切り替えを行います。
    - 新しいカスタマーユーザーIDの場合（例：登録前に購入が行われた場合）、Adaptyは現在のプロファイルにカスタマーユーザーIDを割り当てるため、購入履歴がすべて維持されます。
    - 既存のカスタマーユーザーIDの場合（そのカスタマーユーザーIDがすでにプロファイルに紐づいている場合）、プロファイル切り替え後に実際のアクセスレベルを取得する必要があります。識別直後に[`getProfile`](flutter-check-subscription-status)を呼び出すか、[プロファイルの更新を購読](flutter-check-subscription-status)してデータが自動的に同期されるようにしてください。

## 次のステップ \{#next-steps\}

おめでとうございます！アプリにアプリ内決済のロジックを実装できました！アプリのマネタイズが成功することを願っています！

Adaptyをさらに活用するために、以下のトピックを探索してみてください：
- [**テスト**](troubleshooting-test-purchases)：すべてが期待通りに動作することを確認する
- [**オンボーディング**](flutter-onboardings)：オンボーディングでユーザーを引き付けてリテンションを向上させる
- [**インテグレーション**](configuration)：マーケティングアトリビューションや分析サービスとワンラインで連携する
- [**カスタムプロファイル属性の設定**](flutter-setting-user-attributes)：ユーザープロファイルにカスタム属性を追加してセグメントを作成し、A/Bテストの実施や異なるユーザーへの異なるペイウォール表示を可能にする