Flutter SDK のインストールと設定

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

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

Adapty SDK をモバイルアプリに統合した実際の例を見てみませんか?ペイウォールの表示や購入フローなど基本的な機能の完全なセットアップを示したサンプルアプリをご確認ください。

動作要件

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

Adapty は Google Play Billing Library 8.x までに対応しています。デフォルトでは Google Play Billing Library v7.0.0 を使用しますが、より新しいバージョンを使用したい場合は、手動で依存関係を追加できます。

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

Adapty SDK のインストール

Release

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

    dependencies: 
      adapty_flutter: ^<the latest SDK version>
  2. 以下のコマンドを実行して依存関係をインストールします:

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

    import 'package:adapty_flutter/adapty_flutter.dart';

Adapty SDK の Adapty モジュールを有効化する

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

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

Public SDK Key を取得するには:

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

または、Adapty 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 専用です。
  • SDK keys はアプリごとに固有です。複数のアプリがある場合は、正しいキーを選択してください。

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");
  }
}

他の Adapty SDK メソッドを呼び出す前に、activate の完了を待ってください。完全な呼び出し順序については Flutter SDK の呼び出し順序を参照してください。

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

Adapty SDK の AdaptyUI モジュールを有効化する

ペイウォールビルダーを使用する予定があり、AdaptyUI モジュールをインストール済みの場合は、AdaptyUI も有効化する必要があります:

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

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

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withActivateUI(true), // This automatically activates AdaptyUI
);

オプション設定

ログ

ログシステムを設定する

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

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

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

// 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),
);

データポリシー

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

IP アドレスの収集と共有を無効化する

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

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

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withIpAddressCollectionDisabled(true),
);

広告 ID の収集と共有を無効化する

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

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

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withAppleIdfaCollectionDisabled(true)      // iOS
    ..withGoogleAdvertisingIdCollectionDisabled(true), // Android
);

AdaptyUI のメディアキャッシュ設定を行う

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

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

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


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)

デフォルトでは、ローカルアクセスレベルは iOS で有効、Android で無効になっています。Android でも有効化するには、withGoogleLocalAccessLevelAllowedtrue に設定します:

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withGoogleLocalAccessLevelAllowed(true),
);

バックアップ復元時のデータ消去

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

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

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withClearDataOnBackup(true) // default – false 
);

トラブルシューティング

Android バックアップルール(Auto Backup 設定)

一部のSDK(Adaptyを含む)には、独自のAndroid Auto Backup設定が含まれています。バックアップルールを定義する複数のSDKを使用している場合、Androidのマニフェストマージャーが android:fullBackupContentandroid: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)

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

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

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

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

1. マニフェストに tools 名前空間を追加する

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

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

    ...
</manifest>

2. <application> でバックアップ属性を上書きする

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

<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 に含めてください:

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

3. マージしたバックアップルールファイルを作成する

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

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

Android 12以降(新しいデータ抽出ルール形式を使用):

<?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 version="1.0" encoding="utf-8"?>
<full-backup-content>
    
    <exclude domain="sharedpref" path="appsflyer-data"/>

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

    

Android で別のアプリから戻った後に購入が失敗する

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

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

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

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

Podfile の SWIFT_VERSION オーバーライドが原因で発生する Swift 6 ビルドエラー

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 ターゲット(AdaptyAdaptyUIAdaptyUIBuilderAdaptyLoggerAdaptyPlugin)のみです。

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

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 ターゲットをオーバーライドの対象から除外します:

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 SettingsSwift Language Version を確認します。Swift 6 と表示されているはずです。