---
title: "Flutter SDK のインストールと設定"
description: "サブスクリプション型アプリ向けに Flutter へ Adapty SDK をインストールするためのステップバイステップガイド。"
---

Adapty SDK には、Flutter アプリへのシームレスな統合を実現する 2 つの主要モジュールが含まれています。

- **Core Adapty**: Adapty をアプリで正しく動作させるために必須の SDK です。
- **AdaptyUI**: クロスプラットフォームのペイウォールを簡単に作成できるノーコードツール、[Adapty ペイウォールビルダー](adapty-paywall-builder)を使用する場合に必要なモジュールです。

:::tip
Adapty SDK をモバイルアプリに統合した実際の例を見てみませんか？ペイウォールの表示や購入フローなど基本的な機能の完全なセットアップを示した[サンプルアプリ](https://github.com/adaptyteam/AdaptySDK-Flutter/tree/master/example)をご確認ください。
:::

## 動作要件 \{#requirements\}

Adapty SDK は iOS 13.0 以降をサポートしていますが、ペイウォールビルダーで作成したペイウォールを正しく表示するには iOS 15.0 以降が必要です。

:::info
Adapty は Google Play Billing Library 8.x までに対応しています。デフォルトでは Google Play Billing Library v7.0.0 を使用しますが、より新しいバージョンを使用したい場合は、手動で[依存関係を追加](https://developer.android.com/google/play/billing/integrate#dependency)できます。
:::

---
no_index: true
---
import Callout from '../../../components/Callout.astro';

<Callout type="info">
SDKのインストールは、Adaptyセットアップのステップ5です。アプリ内で課金が機能するようにするには、アプリをストアに接続し、Adapty ダッシュボードでプロダクト、ペイウォール、プレースメントを作成する必要があります。[クイックスタートガイド](quickstart)では、必要なすべての手順を説明しています。
</Callout>

## Adapty SDK のインストール \{#install-adapty-sdk\}

[![Release](https://img.shields.io/github/v/release/adaptyteam/AdaptySDK-Flutter.svg?style=flat&logo=flutter)](https://github.com/adaptyteam/AdaptySDK-Flutter/releases)

1. `pubspec.yaml` ファイルに Adapty を追加します:

   ```yaml showLineNumbers title="pubspec.yaml"
   dependencies: 
     adapty_flutter: ^<the latest SDK version>
   ```

2. 以下のコマンドを実行して依存関係をインストールします:

   ```bash showLineNumbers title="Terminal"
   flutter pub get
   ```

3. アプリケーションに Adapty SDK をインポートします:

   ```dart showLineNumbers title="main.dart"
   import 'package:adapty_flutter/adapty_flutter.dart';
   ```

## Adapty SDK の Adapty モジュールを有効化する \{#activate-adapty-module-of-adapty-sdk\}

アプリのコードで Adapty SDK を有効化します。

:::note
Adapty SDK の有効化は、アプリ内で一度だけ行う必要があります。
:::

**Public SDK Key** を取得するには：

1. Adapty ダッシュボードを開き、[**App settings → General**](https://app.adapty.io/settings/general) に移動します。
2. **Api keys** セクションで、**Public SDK Key**（Secret Key ではない）をコピーします。
3. コード内の `"YOUR_PUBLIC_SDK_KEY"` を置き換えます。

または、[Adapty CLI](developer-cli) を使ってプログラムから取得することもできます：

```
npm install -g adapty
adapty auth login
adapty apps list
```

あるいは、直接実行する場合：

```
npx adapty auth login
adapty apps list
```

- Adapty の初期化には必ず **Public SDK key** を使用してください。**Secret key** は[サーバーサイド API](getting-started-with-server-side-api) 専用です。
- **SDK keys** はアプリごとに固有です。複数のアプリがある場合は、正しいキーを選択してください。

```dart showLineNumbers title="main.dart"

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    _initializeAdapty();

    super.initState();
  }

  Future<void> _initializeAdapty() async {
    try {
      await Adapty().activate(
        configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY'),
      );
    } catch (e) {
      // handle the error
    }
  }

  Widget build(BuildContext context) {
    return Text("Hello");
  }
}
```

:::important
他の Adapty SDK メソッドを呼び出す前に、`activate` の完了を待ってください。完全な呼び出し順序については [Flutter SDK の呼び出し順序](flutter-sdk-call-order)を参照してください。
:::

次に、アプリにペイウォールを設定します:

- [Adapty ペイウォールビルダー](adapty-paywall-builder)を使用する場合は、まず下記の [AdaptyUI モジュールの有効化](#activate-adaptyui-module-of-adapty-sdk)を行い、その後[ペイウォールビルダーのクイックスタート](flutter-quickstart-paywalls)に進んでください。
- 独自のペイウォール UI を構築する場合は、[カスタムペイウォールのクイックスタート](flutter-quickstart-manual)を参照してください。

## Adapty SDK の AdaptyUI モジュールを有効化する \{#activate-adaptyui-module-of-adapty-sdk\}

[ペイウォールビルダー](adapty-paywall-builder)を使用する予定があり、[AdaptyUI モジュールをインストール](sdk-installation-flutter#install-adapty-sdk)済みの場合は、AdaptyUI も有効化する必要があります:

:::note
AdaptyUI に関連する依存関係は、AdaptyUI が有効化されているかどうかに関わらずアプリにリンクされます。
:::

:::important
コード内では、AdaptyUI を有効化する前に必ずコアの Adapty モジュールを有効化してください。
:::

```dart showLineNumbers title="main.dart"
await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withActivateUI(true), // This automatically activates AdaptyUI
);
```

## オプション設定 \{#optional-setup\}

### ログ \{#logging\}

#### ログシステムを設定する \{#set-up-the-logging-system\}

Adapty は、状況を把握するためにエラーやその他の重要な情報をログに記録します。利用可能なログレベルは以下のとおりです:

| レベル                    | 説明                                                                                                               |
| :----------------------- | :------------------------------------------------------------------------------------------------------------------------ |
| `AdaptyLogLevel.none`    | 何もログに記録されません。デフォルト値                                                                                     |
| `AdaptyLogLevel.error`   | エラーのみログに記録されます                                                                                                |
| `AdaptyLogLevel.warn`    | 重大なエラーは発生しないものの注意が必要な SDK からのエラーとメッセージがログに記録されます。     |
| `AdaptyLogLevel.info`    | エラー、警告、およびさまざまな情報メッセージがログに記録されます。                                                        |
| `AdaptyLogLevel.verbose` | 関数呼び出しや API クエリなど、デバッグ時に役立つ追加情報がすべてログに記録されます。 |

Adapty を設定する前に、アプリ内でログレベルを設定できます:

```dart showLineNumbers title="main.dart"
// Set log level before activation. 
// 'verbose' is recommended for development and the first production release
await Adapty().setLogLevel(AdaptyLogLevel.verbose);

// Or set it during configuration
await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withLogLevel(AdaptyLogLevel.verbose),
);
```

### データポリシー \{#data-policies\}

Adapty は明示的に送信しない限りユーザーの個人データを保存しませんが、ストアや各国のガイドラインに準拠するために追加のデータセキュリティポリシーを実装することができます。

#### IP アドレスの収集と共有を無効化する \{#disable-ip-address-collection-and-sharing\}

Adapty モジュールを有効化する際に、`ipAddressCollectionDisabled` を `true` に設定することで、ユーザーの IP アドレスの収集と共有を無効化できます。デフォルト値は `false` です。

このパラメータは、ユーザープライバシーの強化、GDPR や CCPA などの地域のデータ保護規制への準拠、または IP ベースの機能がアプリに不要な場合の不必要なデータ収集の削減に活用できます。

```dart showLineNumbers title="main.dart"
await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withIpAddressCollectionDisabled(true),
);
```

#### 広告 ID の収集と共有を無効化する \{#disable-advertising-id-collection-and-sharing\}

Adapty モジュールを有効化する際に、`appleIdfaCollectionDisabled`（iOS）または `googleAdvertisingIdCollectionDisabled`（Android）を `true` に設定することで、広告識別子の収集を無効化できます。デフォルト値は `false` です。

このパラメータは、App Store / Play Store のポリシーへの準拠、App Tracking Transparency プロンプトの表示回避、または広告 ID に基づく広告アトリビューションや分析をアプリが必要としない場合に活用できます。

```dart showLineNumbers title="main.dart"
await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withAppleIdfaCollectionDisabled(true)      // iOS
    ..withGoogleAdvertisingIdCollectionDisabled(true), // Android
);
```

#### AdaptyUI のメディアキャッシュ設定を行う \{#set-up-media-cache-configuration-for-adaptyui\}

モジュールは Adapty SDK と共に自動的に有効化されます。ペイウォールビルダーを使用しない場合に AdaptyUI モジュールを無効化したいときは、有効化時に `withActivateUI(false)` を渡してください。

デフォルトでは、AdaptyUI はパフォーマンス向上とネットワーク使用量削減のために、画像や動画などのメディアをキャッシュします。カスタム設定を指定することでキャッシュの設定をカスタマイズできます。

`withMediaCacheConfiguration` を使用して、デフォルトのキャッシュサイズと有効期間を上書きできます。これはオプションです。このメソッドを呼び出さない場合、デフォルト値（ディスクサイズ 100MB、メモリカウント無制限）が使用されます。ただし、設定を使用する場合はすべてのパラメータを含める必要があります。

```dart showLineNumbers title="main.dart"

final mediaCacheConfig = AdaptyUIMediaCacheConfiguration(
  memoryStorageTotalCostLimit: 200 * 1024 * 1024, // 200 MB
  memoryStorageCountLimit: 2147483647, // max int value
  diskStorageSizeLimit: 200 * 1024 * 1024, // 200 MB
);

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withMediaCacheConfiguration(mediaCacheConfig),
);
```

**パラメータ:**

| パラメータ                | 必須 | 説明                                                                                 |
|-------------------------|----------|-----------------------------------------------------------------------------|
| memoryStorageTotalCostLimit | オプション | メモリ上のキャッシュの合計サイズ（バイト単位）。デフォルトは 100 MB。                       |
| memoryStorageCountLimit     | オプション | メモリストレージのアイテム数の上限。デフォルトは int の最大値。              |
| diskStorageSizeLimit        | オプション | ディスク上のファイルサイズの上限（バイト単位）。デフォルトは 100 MB。              |

### ローカルアクセスレベルを有効化する（Android） \{#enable-local-access-levels-android\}

デフォルトでは、[ローカルアクセスレベル](local-access-levels)は iOS で有効、Android で無効になっています。Android でも有効化するには、`withGoogleLocalAccessLevelAllowed` を `true` に設定します:

```dart showLineNumbers title="main.dart"
await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withGoogleLocalAccessLevelAllowed(true),
);
```

### バックアップ復元時のデータ消去 \{#clear-data-on-backup-restore\}

`clearDataOnBackup` を `true` に設定すると、iCloud バックアップからアプリが復元されたことを SDK が検知し、キャッシュされたプロファイル情報、プロダクト詳細、ペイウォールなど、ローカルに保存されたすべての SDK データを削除します。その後、SDK はクリーンな状態で初期化されます。デフォルト値は `false` です。

:::note
削除されるのはローカルの SDK キャッシュのみです。Apple とのトランザクション履歴および Adapty サーバー上のユーザーデータは変更されません。
:::

```dart showLineNumbers title="main.dart"
await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withClearDataOnBackup(true) // default – false 
);
```

## トラブルシューティング \{#troubleshooting\}

#### Android バックアップルール（Auto Backup 設定） \{#android-backup-rules-auto-backup-configuration\}

一部のSDK（Adaptyを含む）には、独自のAndroid Auto Backup設定が含まれています。バックアップルールを定義する複数のSDKを使用している場合、Androidのマニフェストマージャーが `android:fullBackupContent`、`android:dataExtractionRules`、または `android:allowBackup` に関するエラーで失敗することがあります。

よくあるエラーの症状: `Manifest merger failed: Attribute application@dataExtractionRules value=(@xml/your_data_extraction_rules)
is also present at [com.other.sdk:library:1.0.0] value=(@xml/other_sdk_data_extraction_rules)`

:::note
これらの変更は、Androidプラットフォームのディレクトリ（通常はプロジェクトの `android/` フォルダー内）で行う必要があります。
:::

この問題を解決するには、以下が必要です：

- バックアップ関連の属性に対して、アプリの値を使用するようマニフェストマージャーに指示する。

- AdaptyのルールとほかのSDKのルールをマージしたバックアップルールファイルを作成する。

#### 1. マニフェストに `tools` 名前空間を追加する \{#1-add-the-tools-namespace-to-your-manifest\}

`AndroidManifest.xml` ファイルのルートの `<manifest>` タグに tools が含まれていることを確認してください：

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.app">

    ...
</manifest>
```

#### 2. `<application>` でバックアップ属性を上書きする \{#2-override-backup-attributes-in-application\}

同じ `AndroidManifest.xml` ファイルで、`<application>` タグを更新して、アプリが最終的な値を提供し、マニフェストマージャーにライブラリの値を置き換えるよう指示します：

```xml
<application
android:name=".App"
android:allowBackup="true"
android:fullBackupContent="@xml/sample_backup_rules"           
android:dataExtractionRules="@xml/sample_data_extraction_rules"
tools:replace="android:fullBackupContent,android:dataExtractionRules">

    ...
</application>
```

いずれかのSDKが `android:allowBackup` も設定している場合は、`tools:replace` に含めてください：

```xml
tools:replace="android:allowBackup,android:fullBackupContent,android:dataExtractionRules"
```

#### 3. マージしたバックアップルールファイルを作成する \{#3-create-merged-backup-rules-files\}

AndroidプロジェクトのAdaptyのルールとほかのSDKのルールを組み合わせた `res/xml/` ディレクトリにXMLファイルを作成します。AndroidはOSのバージョンによって異なるバックアップルール形式を使用するため、両方のファイルを作成することで、アプリがサポートするすべてのAndroidバージョンとの互換性が確保されます。

:::note
以下の例では、サンプルのサードパーティSDKとしてAppsFlyerを使用しています。アプリで使用しているほかのSDKのルールに置き換えるか、追加してください。
:::

**Android 12以降**（新しいデータ抽出ルール形式を使用）：

```xml title="sample_data_extraction_rules.xml"
<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
    <cloud-backup>
        
        <exclude domain="sharedpref" path="appsflyer-data"/>
        <exclude domain="sharedpref" path="appsflyer-purchase-data"/>
        <exclude domain="database" path="afpurchases.db"/>
        
        <exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>
    </cloud-backup>

    <device-transfer>
        
        <exclude domain="sharedpref" path="appsflyer-data"/>
        <exclude domain="sharedpref" path="appsflyer-purchase-data"/>
        <exclude domain="database" path="afpurchases.db"/>
        <exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>
    </device-transfer>
</data-extraction-rules>
```

**Android 11以前**（従来のフルバックアップコンテンツ形式を使用）：

```xml title="sample_backup_rules.xml"
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    
    <exclude domain="sharedpref" path="appsflyer-data"/>

    
    <exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>

#### Android で別のアプリから戻った後に購入が失敗する \{#purchases-fail-after-returning-from-another-app-in-android\}

購入フローを開始する Activity が非デフォルトの `launchMode` を使用している場合、ユーザーが Google Play、銀行アプリ、またはブラウザから戻ったときに Android が Activity を誤って再作成または再利用することがあります。これにより、購入結果が失われたり、キャンセルとして処理されたりする場合があります。

購入が正しく機能するようにするには、購入フローを開始する Activity に `standard` または `singleTop` の起動モードのみを使用し、その他のモードは避けてください。

`AndroidManifest.xml` で、購入フローを開始する Activity の起動モードが `standard` または `singleTop` に設定されていることを確認してください:

```xml
<activity
    android:name=".MainActivity"
    android:launchMode="standard" />
```

#### Podfile の SWIFT_VERSION オーバーライドが原因で発生する Swift 6 ビルドエラー \{#swift-6-build-errors-caused-by-podfile-swift_version-override\}

iOS 向けに Flutter アプリをビルドする際、Adapty pod ターゲットで Swift 6 のコンパイルエラーが発生することがあります。よくある症状としては、`AdaptyUIBuilderLogic` での `@Sendable` の不一致、Adapty 型への `Sendable` 適合の欠如、またはアクター隔離エラーなどがあります。

Adapty の pod は `s.swift_version = '6.0'` を宣言しており、ビルドに Swift 6 が必要です。アプリ独自のコードは Swift 5 のままで構いません。Swift 6 でビルドする必要があるのは Adapty の pod ターゲット（`Adapty`、`AdaptyUI`、`AdaptyUIBuilder`、`AdaptyLogger`、`AdaptyPlugin`）のみです。

最もよくある原因は、`ios/Podfile` の `post_install` フックがすべての pod ターゲットの `SWIFT_VERSION` を上書きしていることです:

```ruby showLineNumbers title="ios/Podfile"
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '5.9'
    end
  end
end
```

**修正方法**: Adapty の pod ターゲットをオーバーライドの対象から除外します:

```ruby showLineNumbers title="ios/Podfile"
post_install do |installer|
  installer.pods_project.targets.each do |target|
    next if %w[Adapty AdaptyUI AdaptyUIBuilder AdaptyLogger AdaptyPlugin].include?(target.name)
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '5.9'
    end
  end
end
```

その後、`ios/` ディレクトリで `pod install` を実行してリビルドしてください。

確認するには、`ios/Pods/Pods.xcodeproj` を開き、`Adapty` の pod ターゲットを選択して **Build Settings** → **Swift Language Version** を確認します。**Swift 6** と表示されているはずです。