### ログイン/サインアップ時 \{#during-loginsignup\}
アプリ起動後にユーザーを識別する場合(例:ログインまたはサインアップ後)、`identify`メソッドを使用してカスタマーユーザーIDを設定します。
- このカスタマーユーザーIDを**まだ使用したことがない場合**、Adaptyは自動的に現在のプロファイルにリンクします。
- このカスタマーユーザーIDを**以前にユーザーの識別に使用したことがある場合**、Adaptyはそのカスタマーユーザーに紐づくプロファイルに切り替えます。
:::important
カスタマーユーザーIDは各ユーザーに対して一意である必要があります。パラメータの値をハードコードすると、すべてのユーザーが同一人物とみなされます。
:::
他のSDKメソッドを呼び出す前に、`identify`の完了コールバックが呼ばれるまで待機してください。同時に呼び出すと、識別済みプロファイルではなく匿名プロファイルに処理が紐づく場合があります。詳細は[Android SDKの呼び出し順序](android-sdk-call-order)をご覧ください。
デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方法は常に最新のデータをユーザーに届けられるため、推奨しています。
ただし、ユーザーのインターネット接続が不安定な場合は、`.returnCacheDataElseLoad` を使用してキャッシュが存在すればそれを返すことも検討してください。この場合、最新データが届かないこともありますが、接続状況に関わらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリア時のみ削除されます。
Adapty SDK はフローとペイウォールをローカルに2つの層で保存しています。1つは上述の定期更新キャッシュ、もう1つは[フォールバックペイウォール](fallback-paywalls)です。また、取得を高速化するために CDN を使用し、CDN にアクセスできない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムにより、インターネット接続が不安定な状況でも、常に最新バージョンを取得しつつ高い信頼性を確保しています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルフォールバックが返されます。
なお、内部的に複数のリクエストで構成される場合があるため、`loadTimeout` で指定した時間よりわずかに遅れてタイムアウトすることがまれにあります。
Android の場合: 拡張関数(例: `5.seconds`、`.seconds` は `import com.adapty.utils.seconds` から)または `TimeInterval.seconds(5)` を使って `TimeInterval` を作成できます。制限なしにするには `TimeInterval.INFINITE` を使用してください。
| レスポンスパラメーター: | パラメーター | 説明 | | :-------- | :---------- | | Flow | プレースメント、識別子(`id`、`variationId`)、名前、リモートコンフィグ、およびフローにビュー設定が含まれているかどうかを示す `hasViewConfiguration` フラグを含む `AdaptyFlow` オブジェクト。プリロード、カスタム UI、またはプログラムによるチェックのために実際のプロダクトを取得するには、`getPaywallProducts(flow)` を呼び出してください。 | ## ビュー設定の取得 \{#fetch-the-view-configuration\} フローまたはペイウォールを取得したら、`flow.hasViewConfiguration` を使ってビュー設定が含まれているかどうかを確認します。このフラグは、Adapty ダッシュボードでプレースメントがどのように設計されているかを示します。 - **`true`** — プレースメントが **Flow Builder**(フロー)または **Paywall Builder**(ペイウォール)でデザインされています。Adapty が UI をレンダリングします。以下の手順に進み、ビュー設定を取得して[フローまたはペイウォールを表示](android-present-paywalls)してください。 - **`false`** — プレースメントはビルダー UI を持たないカスタムペイウォールです。[リモートコンフィグペイウォールとして処理してください](present-remote-config-paywalls-android)。 :::important Flow Builder で **Show on device** トグルを必ず有効にしてください。このオプションがオンになっていない場合、ビュー設定を取得できません。 :::任意
デフォルト: デバイスのロケール
| [ローカライゼーション](add-paywall-locale-in-adapty-paywall-builder)の識別子。`-` で区切られた1つまたは2つのサブタグを持つ言語コードとして指定します(例: `en`、`pt-br`)。[ローカライゼーションとロケールコード](android-localizations-and-locale-codes)を参照してください。 | | **loadTimeout** | デフォルト: 5秒 | このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルフォールバックが返されます。この処理は内部的に複数のリクエストで構成される場合があるため、`loadTimeout` で指定した時間よりもわずかに遅れてタイムアウトすることがまれにあります。 |任意
デフォルト: デバイスのロケール
| [ローカライゼーション](add-paywall-locale-in-adapty-paywall-builder)の識別子。`-` で区切られた1つまたは2つのサブタグを含む言語コードで指定します(例: `en`、`pt-br`)。詳細は [ローカライゼーションとロケールコード](android-localizations-and-locale-codes) を参照してください。 | | **loadTimeout** | デフォルト: 5秒 | このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。内部で複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間よりわずかに遅くタイムアウトすることがあります。 |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるよう、この設定を推奨します。
ただし、ユーザーのインターネット接続が不安定な場合は、`.returnCacheDataElseLoad` の使用を検討してください。キャッシュが存在する場合はキャッシュデータを返します。この場合、最新のデータが取得できないこともありますが、接続状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを減らす目的で使用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリア操作によってのみ削除されます。
| ## アセットのカスタマイズ \{#customize-assets\} フローやペイウォールの画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像と動画には、定義済みのID(`hero_image` と `hero_video`)があります。カスタムアセットバンドルでは、これらのIDを使って要素を指定し、その動作をカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定する](custom-media)必要があります。 例えば、次のようなことができます: - 特定のユーザーに異なる画像や動画を表示する。 - リモートのメイン画像の読み込み中に、ローカルのプレビュー画像を表示する。 - 動画を再生する前にプレビュー画像を表示する。 Here's an example of how you can provide custom assets via a simple dictionary: ```kotlin showLineNumbers val customAssets = AdaptyCustomAssets.of( "hero_image" to AdaptyCustomImageAsset.remote( url = "https://example.com/image.jpg", preview = AdaptyCustomImageAsset.file( FileLocation.fromAsset("images/hero_image_preview.png"), ) ), "hero_video" to AdaptyCustomVideoAsset.file( FileLocation.fromResId(requireContext(), R.raw.custom_video), preview = AdaptyCustomImageAsset.file( FileLocation.fromResId(requireContext(), R.drawable.video_preview), ), ), ) val flowView = AdaptyUI.getFlowView( activity, flowConfiguration, products, eventListener, insets, customAssets, ) ``` :::note アセットが見つからない場合、フローはデフォルトの外観にフォールバックします。 ::: 動画の場合、オプションで `resolution` を渡すことで、動画の読み込み前にレイアウトスペースを確保し、アスペクト比(`width / height`)を設定できます: ```kotlin showLineNumbers AdaptyCustomVideoAsset.file( FileLocation.fromResId(requireContext(), R.raw.custom_video), preview = AdaptyCustomImageAsset.file( FileLocation.fromResId(requireContext(), R.drawable.video_preview), ), resolution = AdaptyCustomVideoAsset.Resolution(width = 1080, height = 1920), ) ```任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-paywall-locale-in-adapty-paywall-builder)の識別子です。このパラメーターは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語、2つ目はリージョンを表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードと推奨する使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)をご覧ください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、この設定を推奨します。
ただし、ユーザーが不安定なインターネット環境を使用していると考えられる場合は、`.returnCacheDataElseLoad` を使用してキャッシュが存在する場合はキャッシュデータを返すことを検討してください。この場合、ユーザーが最新のデータを取得できないことがありますが、インターネット接続が不安定であっても高速なロードを実現できます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリア時のみ削除されます。
Adapty SDK はペイウォールをローカルに2層で保存します。1つ目は上述の定期更新されるキャッシュ、2つ目は[フォールバックペイウォール](fallback-paywalls)です。また、ペイウォールをより高速に取得するために CDN を使用し、CDN に到達できない場合に備えたスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が限られた状況でも信頼性を確保しながら、常に最新バージョンのペイウォールを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト時間を制限する値です。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。
処理が内部で複数のリクエストで構成される場合があるため、まれに `loadTimeout` で指定した時間よりわずかに遅れてタイムアウトすることがあります。
Android の場合: 拡張関数(例: `5.seconds`、`.seconds` は `import com.adapty.utils.seconds` から)を使用して `TimeInterval` を作成するか、`TimeInterval.seconds(5)` を使用できます。制限を設けない場合は `TimeInterval.INFINITE` を使用してください。
| レスポンスパラメーター: | パラメーター | 説明 | | :-------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | プロダクト ID のリスト、ペイウォール識別子、リモートコンフィグ、およびその他のプロパティを含む [`AdaptyPaywall`](https://android.adapty.io/adapty/com.adapty.models/-adapty-paywall/) オブジェクト。 | ## ペイウォールビルダーで作成したペイウォールのビュー設定を取得する \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important ペイウォールビルダーで **Show on device** トグルを必ず有効にしてください。このオプションがオンになっていない場合、ビュー設定を取得できません。 ::: ペイウォールを取得したら、`ViewConfiguration` が含まれているかどうかを確認してください。これが含まれている場合、そのペイウォールはペイウォールビルダーで作成されたことを示します。`ViewConfiguration` が存在する場合はペイウォールビルダーのペイウォールとして処理し、存在しない場合は[リモートコンフィグのペイウォールとして処理](present-remote-config-paywalls)してください。任意
デフォルト: `en`
|[ペイウォールのローカライゼーション](add-remote-config-locale)の識別子。マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよび推奨される使用方法については、[ローカライゼーションとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。この方法を推奨します。ユーザーが常に最新のデータを受け取れることが保証されるためです。
ただし、ユーザーが不安定なインターネット環境を利用していると考えられる場合は、`.returnCacheDataElseLoad` を使用することで、キャッシュが存在する場合はキャッシュデータを返すことができます。この場合、最新データが取得できないことはありますが、インターネット接続が不安定であっても読み込み速度が向上します。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを省くためにキャッシュを使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップ時にのみクリアされます。
| ## アセットのカスタマイズ \{#customize-assets\} ペイウォール内の画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像と動画には、あらかじめ定義されたID(`hero_image` と `hero_video`)があります。カスタムアセットバンドルでは、これらのIDを使って要素を指定し、動作をカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定する](custom-media)必要があります。 たとえば、次のようなことができます: - 一部のユーザーに別の画像や動画を表示する。 - リモートのメイン画像の読み込み中に、ローカルのプレビュー画像を表示する。 - 動画を再生する前にプレビュー画像を表示する。 :::important この機能を使用するには、Adapty Android SDK をバージョン 3.7.0 以上にアップデートしてください。 ::: カスタムアセットをシンプルな辞書で提供する方法の例を示します。 ```kotlin showLineNumbers val customAssets = AdaptyCustomAssets.of( "hero_image" to AdaptyCustomImageAsset.remote( url = "https://example.com/image.jpg", preview = AdaptyCustomImageAsset.file( FileLocation.fromAsset("images/hero_image_preview.png"), ) ), "hero_video" to AdaptyCustomVideoAsset.file( FileLocation.fromResId(requireContext(), R.raw.custom_video), preview = AdaptyCustomImageAsset.file( FileLocation.fromResId(requireContext(), R.drawable.video_preview), ), ), ) val paywallView = AdaptyUI.getPaywallView( activity, viewConfiguration, products, eventListener, insets, customAssets, ) ``` :::note アセットが見つからない場合、ペイウォールはデフォルトの外観にフォールバックします。 :::インセットは、タップ可能な要素がシステムバーの裏に隠れないようにするためのフロー周囲のスペースです。
デフォルト: `Unspecified`。この場合、Adapty が自動的にインセットを調整します。エッジツーエッジのフローでは適切に機能します。
フローがエッジツーエッジでない場合は、カスタムインセットを設定することを検討してください。設定方法については、以下の [フローインセットの変更](android-present-paywalls#change-flow-insets) セクションをご参照ください。
| | **customAssets** | 任意 | `AdaptyCustomAssets` オブジェクトを渡すことで、実行時にフローやペイウォール内の画像や動画を置き換えられます。詳細は [アセットのカスタマイズ](android-get-pb-paywalls#customize-assets) をご参照ください。 | | **tagResolver** | 任意 | フローのテキスト内のカスタムタグを解決するには `AdaptyUiTagResolver` を使用します。このリゾルバーはタグパラメータを受け取り、対応する文字列に解決します。詳細はペイウォールビルダーのカスタムタグのトピックをご参照ください。 | | **timerResolver** | 任意 | カスタムタイマー機能を使用する場合は、ここにリゾルバーを渡してください。 | :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: ## フローのインセットを変更する \{#change-flow-insets\} インセットとは、フローの周囲の余白のことで、タップ可能な要素がシステムバーの後ろに隠れないようにするためのものです。デフォルトでは Adapty がインセットを自動的に調整するため、エッジツーエッジのフローでも問題なく機能します。 フローがエッジツーエッジでない場合は、カスタムインセットを設定することをお勧めします。 - ステータスバーとナビゲーションバーのどちらも `AdaptyFlowView` と重ならない場合は、`AdaptyFlowInsets.None` を使用してください。 - フローが上部のステータスバーとは重なるが下部とは重ならないといった複雑な設定の場合は、以下の例のように `bottomInset` のみを `0` に設定できます。インセットは、タップ可能な要素がシステムバーの後ろに隠れないようにするためのペイウォール周囲のスペースです。
デフォルト値は `UNSPECIFIED` で、Adapty がインセットを自動調整します。これはエッジツーエッジのペイウォールに最適です。
ペイウォールがエッジツーエッジでない場合は、カスタムインセットを設定することをお勧めします。設定方法については、以下の [ペイウォールインセットの変更](android-present-paywalls#change-paywall-insets) セクションをご覧ください。
| | **personalizedOfferResolver** | 任意 | パーソナライズされた価格表示([詳細](https://developer.android.com/google/play/billing/integrate#personalized-price))を示すには、`AdaptyUiPersonalizedOfferResolver` を実装し、`AdaptyPaywallProduct` に対してその価格がパーソナライズされている場合は `true`、そうでない場合は `false` を返す独自のロジックを渡します。 | | **tagResolver** | 任意 | ペイウォールテキスト内のカスタムタグを解決するには `AdaptyUiTagResolver` を使用します。このリゾルバはタグパラメータを受け取り、対応する文字列に変換します。詳しくはペイウォールビルダーのカスタムタグのトピックをご覧ください。 | | **timerResolver** | 任意 | カスタムタイマー機能を使用する場合は、ここにリゾルバを渡してください。 | :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: ## ペイウォールのインセットを変更する \{#change-paywall-insets\} インセットとは、システムバーの裏側にタップ可能な要素が隠れないようにするための、ペイウォール周囲のスペースのことです。デフォルトでは、Adapty がインセットを自動的に調整します。これはエッジツーエッジのペイウォールではうまく機能します。 ペイウォールがエッジツーエッジでない場合は、カスタムインセットを設定することをお勧めします。 - ステータスバーとナビゲーションバーの両方が`AdaptyPaywallView`と重ならない場合は、`AdaptyPaywallInsets.NONE`を使用してください。 - ペイウォールが上部のステータスバーとは重なるが下部とは重ならないといったカスタム設定の場合は、以下の例のように`bottomInset`のみを`0`に設定できます。
## ペイウォールのビュー数が多すぎる \{#the-paywall-view-number-is-too-big\}
**問題**: ペイウォールのビュー数が期待値の2倍になっている。
**原因**: ペイウォールビルダーまたはフローBuilder を使用しているにもかかわらず、コード内で `logShowFlow`(Android SDK v4以降)/ `logShowPaywall` を呼び出している可能性があります。これらのツールで作成したフローやペイウォールでは、アナリティクスが自動的に計測されるため、このメソッドを使用する必要はありません。
**解決策**: ペイウォールビルダーまたはフローBuilderを使用している場合は、コード内で `logShowFlow`(Android SDK v4以降)/ `logShowPaywall` を呼び出していないことを確認してください。
## その他の問題 \{#other-issues\}
**問題**: 上記で取り上げていないペイウォールビルダー関連の問題が発生している。
**解決策**: 必要に応じて[マイグレーションガイド](android-sdk-migration-guides)を参照し、SDKを最新バージョンへ移行してください。多くの問題は新しいSDKバージョンで解決されています。
---
# File: android-quickstart-manual
---
---
title: "Android SDKのカスタムペイウォールで購入を有効にする"
description: "Adapty SDKをAndroidカスタムペイウォールに統合してアプリ内課金を有効にする方法。"
---
このガイドでは、Adaptyをカスタムペイウォールに統合する方法を説明します。ペイウォールの実装を完全にコントロールしながら、Adapty SDKがプロダクトの取得、新規購入の処理、過去の購入の復元を行います。
:::important
**このガイドは、カスタムペイウォールを実装している開発者向けです。** 課金を有効にする最も簡単な方法をお探しであれば、[Adapty Flow Builder](android-quickstart-paywalls) をご利用ください。Flow Builder を使うと、ノーコードのビジュアルエディターでフローを作成でき、すべての購入ロジックは Adapty が自動的に処理します。また、アプリを再公開することなく、さまざまなデザインをテストすることができます。
:::
## 始める前に \{#before-you-start\}
### プロダクトを設定する \{#set-up-products\}
アプリ内課金を有効にするには、3つの重要な概念を理解する必要があります。
- [**プロダクト**](product) – ユーザーが購入できるもの(サブスクリプション、消耗型アイテム、永続アクセスなど)
- [**ペイウォール**](paywalls) – どのプロダクトを提供するかを定義する設定。Adapty では、プロダクトを取得するにはペイウォールを使う必要がありますが、この設計のおかげでアプリのコードを変更せずにプロダクト、価格、オファーを変更できます。
- [**プレースメント**](placements) – アプリ内でペイウォールを表示する場所とタイミング(`main`、`onboarding`、`settings` など)。ダッシュボードでプレースメントにペイウォールを設定しておき、コード内でプレースメント ID を指定してリクエストします。これにより、A/B テストの実施や、ユーザーごとに異なるペイウォールの表示が簡単に行えます。
これらのコンセプトは、カスタムペイウォールを使用する場合でも理解しておく必要があります。基本的には、アプリで販売するプロダクトを管理するための仕組みです。
カスタムペイウォールを実装するには、**ペイウォール**を作成し、**プレースメント**に追加する必要があります。この設定によって、プロダクトを取得できるようになります。ダッシュボードでの操作については、[こちら](quickstart)のクイックスタートガイドを参照してください。
### ユーザーの管理 \{#manage-users\}
バックエンド認証の有無にかかわらず利用できます。
ただし、Adapty SDKは匿名ユーザーと識別済みユーザーを異なる方法で処理します。詳細を理解し、ユーザーを適切に扱うために、[識別クイックスタートガイド](android-quickstart-identify)をお読みください。
## ステップ 1. プロダクトを取得する \{#step-1-get-products\}
カスタムペイウォール用のプロダクトを取得するには、次の手順が必要です。
1. `getFlow` メソッドに[プレースメント](placements) ID を渡して `flow` オブジェクトを取得する。
2. `getPaywallProducts` メソッドを使って、このフローのプロダクト配列を取得する。
デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方式では常に最新のデータが提供されるため、推奨しています。
ただし、ユーザーがインターネット接続の不安定な環境にいると考えられる場合は、`.returnCacheDataElseLoad` の使用を検討してください。キャッシュが存在する場合はそれを返します。この方式では最新のデータが得られない場合がありますが、接続状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、ネットワークリクエストを避けるためにセッション中に使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動クリーンアップを行った場合にのみ削除されます。
Adapty SDK はフローとペイウォールを 2 つの層に保存します。1 つ目は上述の定期更新キャッシュ、2 つ目は[フォールバックペイウォール](android-use-fallback-paywalls)です。また、フローとペイウォールの高速取得のために CDN を使用しており、CDN に到達できない場合に備えた独立したフォールバックサーバーも用意しています。
| | **loadTimeout** | デフォルト: 5 秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合は、キャッシュされたデータまたはローカルのフォールバックが返されます。
処理内部で複数のリクエストが発生することがあるため、まれに `loadTimeout` で指定した時間よりわずかに遅れてタイムアウトする場合があります。
| プロダクトIDをハードコードしないでください!フローはリモートで設定されるため、利用可能なプロダクト、プロダクトの数、特別オファー(無料トライアルなど)は随時変更される可能性があります。コードがこれらのシナリオに対応できるようにしてください。 たとえば、最初に2つのプロダクトを取得した場合、アプリはその2つのプロダクトを表示する必要があります。しかし、後で3つのプロダクトを取得した場合は、コードを変更することなく3つすべてを表示できる必要があります。ハードコードする必要があるのはプレースメントIDだけです。 レスポンスのパラメーター: | パラメーター | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | プレースメント、識別子(`id`、`variationId`)、名前、設定済みロケールごとのエントリを含む `remoteConfigs` 配列、および `hasViewConfiguration` フラグを持つ `AdaptyFlow` オブジェクトです。フローのプロダクトを取得するには、`getPaywallProducts(flow)` を呼び出してください。 | :::note v4 では、`locale` パラメータは `getFlow` から移動し、`getFlowConfiguration`(AdaptyUI でレンダリングする場合のみ使用)に渡すようになりました。カスタムペイウォールの場合、利用可能なすべてのロケールが `flow.remoteConfigs` にまとめて返されるため、ユーザーのデバイスやアプリの設定に合ったロケールを選択してください。 ::: ## プロダクトを取得する \{#fetch-products\} フローを取得したら、それに対応するプロダクト配列を取得できます:デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュデータを返します。この方法を推奨するのは、ユーザーが常に最新のデータを受け取れるようにするためです。
ただし、ユーザーがインターネット接続の不安定な環境にいると想定される場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在すればそちらを返すことも検討してください。この場合、ユーザーが最新データを取得できないことがありますが、接続状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中のネットワークリクエスト削減を目的としてキャッシュを利用しても問題ありません。
なお、キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でクリアした場合にのみ削除されます。
|任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子。このパラメータはマイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目はリージョンを表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードの詳細や推奨される使い方については、[ローカライズとロケールコード](android-localizations-and-locale-codes)をご覧ください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、この方式を推奨します。
ただし、ユーザーが不安定なインターネット環境を使用していると考えられる場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在すればそれを返すようにすることを検討してください。この場合、ユーザーは最新データを取得できないことがありますが、通信環境に関わらず読み込み速度が向上します。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける目的で安全に使用できます。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でクリアした場合にのみ削除されます。
Adapty SDK はペイウォールを2層に保存しています。1つは上記の定期更新キャッシュ、もう1つは[フォールバックペイウォール](android-use-fallback-paywalls)です。また、ペイウォールをより高速に取得するために CDN を使用し、CDN に到達できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムにより、インターネット接続が不安定な場合でも、常に最新バージョンのペイウォールを確実に取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
内部的に複数のリクエストで構成される場合があるため、まれに `loadTimeout` で指定した時間より若干遅れてタイムアウトすることがあります。
| プロダクト ID をハードコードしないでください!ペイウォールはリモートで設定されるため、利用可能なプロダクト、プロダクト数、特別オファー(無料トライアルなど)は随時変更される場合があります。こうしたシナリオにコードで対応できるようにしてください。 たとえば、最初に 2 つのプロダクトを取得した場合はそれらを表示し、後から 3 つ取得した場合はコードを変更せずに 3 つすべてを表示できるようにする必要があります。ハードコードする必要があるのは、プレースメント ID だけです。 レスポンスパラメータ: | パラメータ | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | プロダクト ID のリスト、ペイウォール識別子、リモートコンフィグ、その他いくつかのプロパティを含む [`AdaptyPaywall`](https://android.adapty.io/adapty/com.adapty.models/-adapty-paywall/) オブジェクト。 | ## プロダクトを取得する \{#fetch-products\} ペイウォールを取得したら、それに対応するプロダクト配列を取得できます:任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子です。このパラメーターは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードである必要があります。最初のサブタグは言語を、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードとその推奨利用方法については、[ローカライズとロケールコード](android-localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。これにより常に最新のデータが提供されるため、この方式を推奨します。
ただし、ユーザーが不安定なインターネット環境を使用していると想定される場合は、`.returnCacheDataElseLoad` の使用を検討してください。これはキャッシュが存在する場合にキャッシュデータを返す設定です。この場合、最新データが届かないことがありますが、通信状況に関わらず読み込みが速くなります。キャッシュはセッション中も定期的に更新されるため、ネットワークリクエストを減らす目的で安全に利用できます。
なお、キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップを行った場合にのみ削除されます。
|リクエストが成功した場合、レスポンスにはこのオブジェクトが含まれます。[AdaptyProfile](https://android.adapty.io/adapty/com.adapty.models/-adapty-profile/) オブジェクトは、アプリ内のユーザーのアクセスレベル、サブスクリプション、および買い切り購入に関する包括的な情報を提供します。
アクセスレベルのステータスを確認して、ユーザーがアプリへの必要なアクセス権を持っているかどうかを確認してください。
| :::warning **注意:** Apple の StoreKit バージョンが v2.0 未満で、Adapty SDK バージョンが v2.9.0 未満の場合は、代わりに [Apple App Store 共有シークレット](app-store-connection-configuration#step-5-enter-app-store-shared-secret)を提供する必要があります。この方法は現在 Apple によって非推奨とされています。 ::: ## 購入時にサブスクリプションを変更する \{#change-subscription-when-making-a-purchase\} ユーザーが現在のサブスクリプションを更新する代わりに新しいサブスクリプションを選択した場合、その動作はアプリストアによって異なります。Google Play では、サブスクリプションは自動的に更新されません。以下に説明するように、モバイルアプリのコードで切り替えを管理する必要があります。 Android でサブスクリプションを別のものに変更するには、追加パラメータを指定して `.makePurchase()` メソッドを呼び出します:[`AdaptyProfile`](https://android.adapty.io/adapty/com.adapty.models/-adapty-profile/) オブジェクト。このモデルにはアクセスレベル、サブスクリプション、買い切り購入に関する情報が含まれています。
ユーザーがアプリへのアクセス権を持っているかどうかを判断するには、**アクセスレベルのステータス**を確認してください。
| :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: --- # File: implement-observer-mode-android --- --- title: "Android SDKにオブザーバーモードを実装する" description: "Android SDKでAdaptyのオブザーバーモードを実装し、ユーザーのサブスクリプションイベントを追跡します。" --- すでに独自の購入インフラがあり、Adaptyへの完全な移行を検討していない場合は、[オブザーバーモード](observer-vs-full-mode)を検討してみてください。基本的な機能として、オブザーバーモードは高度なアナリティクスと、アトリビューションおよびアナリティクスシステムとのシームレスな連携を提供します。 これで十分な場合、必要な作業は以下の2つだけです: 1. `observerMode` パラメータを `true` に設定して、Adapty SDKの設定時にオブザーバーモードを有効化する。[Android](sdk-installation-android#activate-adapty-module-of-adapty-sdk)のセットアップ手順を参照してください。 2. 既存の購入インフラから[トランザクションをAdaptyに報告する](report-transactions-observer-mode-android)。 ## オブザーバーモードのセットアップ \{#observer-mode-setup\} 購入とサブスクリプションのステータスを自分で管理し、サブスクリプションイベントとアナリティクスの送信にAdaptyを使用する場合は、オブザーバーモードを有効にしてください。 :::important オブザーバーモードで動作している場合、Adapty SDKはトランザクションをクローズしません。そのため、ご自身でトランザクションを処理するようにしてください。 :::1. `AdaptyUiObserverModeHandler` を実装します。 `onPurchaseInitiated` イベントは、ユーザーが購入を開始したことを通知します。このコールバックに応じて、カスタム購入フローをトリガーできます。
1. `AdaptyUiObserverModeHandler` を実装します。 `onPurchaseInitiated` イベントは、ユーザーが購入を開始したことを通知します。このコールバックに応答して、独自の購入フローをトリガーできます。
iOS・StoreKit 1 の場合: [`SKPaymentTransaction`](https://developer.apple.com/documentation/storekit/skpaymenttransaction) オブジェクト。
iOS・StoreKit 2 の場合: [Transaction](https://developer.apple.com/documentation/storekit/transaction) オブジェクト。
Android の場合: 購入の文字列識別子(`purchase.getOrderId()`)。ここで purchase は billing ライブラリの [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) クラスのインスタンスです。
|iOS、StoreKit1 の場合: [`SKPaymentTransaction`](https://developer.apple.com/documentation/storekit/skpaymenttransaction) オブジェクト。
iOS、StoreKit 2 の場合: [Transaction](https://developer.apple.com/documentation/storekit/transaction) オブジェクト。
Android の場合: 購入の文字列識別子(`purchase.getOrderId()`)。ここで purchase は billing ライブラリの [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) クラスのインスタンスです。
| システムバーがUIの一部に重なるフルスクリーンモードでは、以下の方法でインセットを取得します。phoneNumber
firstName
lastName
| String | | gender | Enum。使用可能な値: `female`、`male`、`other` | | birthday | Date | ### カスタムユーザー属性 \{#custom-user-attributes\} 独自のカスタム属性を設定することもできます。カスタム属性は通常、アプリの使用状況に関連するものです。たとえば、フィットネスアプリなら週あたりの運動回数、語学学習アプリならユーザーの習熟度レベルなどが挙げられます。セグメントで活用してターゲットを絞ったペイウォールやオファーを作成したり、アナリティクスでどのプロダクト指標が収益に最も影響するかを把握したりすることができます。[AdaptyProfile](https://android.adapty.io/adapty/com.adapty.models/-adapty-profile/)オブジェクト。通常、ユーザーがプレミアムアクセスを持っているかどうかを判断するには、プロファイルのアクセスレベルのステータスを確認するだけで十分です。
`.getProfile`メソッドは常にAPIへのクエリを試みるため、最新の結果を返します。何らかの理由(例:インターネット接続なし)でAdapty SDKがサーバーから情報を取得できない場合、キャッシュのデータが返されます。なお、Adapty SDKは`AdaptyProfile`のキャッシュを定期的に更新し、情報をできる限り最新の状態に保ちます。
| `.getProfile()`メソッドはユーザープロファイルを返し、そこからアクセスレベルのステータスを取得できます。アプリごとに複数のアクセスレベルを設定することが可能です。たとえばニュースアプリで異なるトピックへのサブスクリプションを個別に販売する場合、「sports」や「science」といったアクセスレベルを作成できます。ただし、ほとんどの場合は1つのアクセスレベルで十分であり、その場合はデフォルトの「premium」アクセスレベルを使用するだけで問題ありません。 デフォルトの「premium」アクセスレベルを確認する例:任意
デフォルト: `en`
|オンボーディングのローカライズ識別子。このパラメータは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目はリージョンを表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよび推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュデータを返します。ユーザーが常に最新のデータを取得できるようにするため、このオプションを推奨します。
ただし、ユーザーが不安定なインターネット環境を利用していると思われる場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在すればそれを返すことを検討してください。この場合、最新のデータが取得できないことがありますが、接続状況にかかわらずより速い読み込みを実現できます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを減らす目的で使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリア時にのみ削除されます。
Adapty SDK はオンボーディングをローカルに2層で保存します。1つは上記の定期更新キャッシュ、もう1つはフォールバックオンボーディングです。また、CDN を使用してオンボーディングを高速に取得し、CDN が利用できない場合に備えたスタンドアロンのフォールバックサーバーも用意しています。このシステムにより、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンのオンボーディングを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
内部的に複数のリクエストで構成される場合があるため、まれに `loadTimeout` で指定した時間よりも若干遅れてタイムアウトすることがあります。
Android の場合: `TimeInterval` は拡張関数(例: `5.seconds`、`.seconds` は `import com.adapty.utils.seconds` から)または `TimeInterval.seconds(5)` で作成できます。制限なしに設定するには `TimeInterval.INFINITE` を使用してください。
| レスポンスパラメータ: | パラメータ | 説明 | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | オンボーディングの識別子と設定、リモートコンフィグ、その他いくつかのプロパティを含む [`AdaptyOnboarding`](https://android.adapty.io/adapty/com.adapty.models/-adapty-onboarding/) オブジェクト。 | ## デフォルトオーディエンスのオンボーディングでフェッチを高速化する \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} 通常、オンボーディングのフェッチはほぼ瞬時に完了するため、この処理の高速化を特別に意識する必要はありません。ただし、オーディエンスやオンボーディングの数が多く、ユーザーのインターネット接続が不安定な場合は、フェッチに予想以上の時間がかかることがあります。そのような状況では、オンボーディングをまったく表示しないよりも、デフォルトのオンボーディングを表示してスムーズなユーザー体験を提供したほうがよいでしょう。 この問題に対処するには、`getOnboardingForDefaultAudience` メソッドを使用できます。このメソッドは、指定されたプレースメントの **All Users** オーディエンス向けオンボーディングを取得します。ただし、推奨されるアプローチは [オンボーディングの取得](#fetch-onboarding) セクションで詳しく説明されている `getOnboarding` メソッドでオンボーディングを取得することである点を理解しておくことが重要です。 :::warning `getOnboardingForDefaultAudience` の代わりに `getOnboarding` の使用を検討してください。前者には以下の重要な制限があります: - **互換性の問題**: 複数のアプリバージョンをサポートする際に問題が生じる可能性があり、後方互換性のある設計が必要になるか、古いバージョンでは正しく表示されない可能性を受け入れる必要があります。 - **パーソナライズなし**: 「すべてのユーザー」オーディエンス向けのコンテンツのみ表示され、国、アトリビューション、カスタム属性に基づくターゲティングが利用できません。 取得速度の向上がこれらのデメリットを上回る場合は、以下に示すように `getOnboardingForDefaultAudience` を使用してください。それ以外の場合は、[上記](#fetch-onboarding)で説明した `getOnboarding` を使用してください。 ::: ```kotlin Adapty.getOnboardingForDefaultAudience("YOUR_PLACEMENT_ID") { result -> when (result) { is AdaptyResult.Success -> { val onboarding = result.value // Handle successful onboarding retrieval } is AdaptyResult.Error -> { val error = result.error // Handle error case } } } ``` パラメーター: | パラメーター | 必須/任意 | 説明 | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | 必須 | 対象の[プレースメント](placements)の識別子。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
|オンボーディングのローカライズ識別子。このパラメーターは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードである必要があります。最初のサブタグは言語、2番目は地域を表します。
例:`en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードとその推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるよう、このオプションを推奨します。
ただし、ユーザーが不安定なインターネット環境にいると思われる場合は、キャッシュが存在すればそれを返す `.returnCacheDataElseLoad` の使用を検討してください。このシナリオでは、最新データを取得できない場合がありますが、インターネット接続が不安定な状況でも読み込みが高速になります。キャッシュはセッション中に定期的に更新されるため、ネットワークリクエストを避けるためにキャッシュを使用しても安全です。
キャッシュはアプリの再起動後も保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はオンボーディングをローカルに2層で保存します:上記の定期更新キャッシュと、フォールバックオンボーディングです。また、オンボーディングをより高速に取得するためにCDNを使用し、CDNに到達できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な場合でも、常に最新バージョンのオンボーディングを確実に取得できるよう設計されています。
| --- # File: android-present-onboardings --- --- title: "Android SDKでのオンボーディングの表示" description: "効果的なユーザーエンゲージメントのためにAndroidでオンボーディングを表示する方法を学びます。" --- :::tip **SDK v4以降**では、オンボーディングのより強力な代替手段として[フロー](android-get-pb-paywalls)を構築できます。オンボーディングがWebView内で動作するのに対し、フローはデバイス上でネイティブにレンダリングされます。これにより、スムーズなアニメーション、一貫したAndroidのルック&フィール、高速な読み込み、WebViewランタイムへの依存なしで動作します。開始するには、[フロー&ペイウォールの取得](android-get-pb-paywalls)と[フロー&ペイウォールの表示](android-present-paywalls)をご覧ください。 ::: 始める前に、以下を確認してください: 1. [Adapty Android SDK](sdk-installation-android) 3.8.0 以降をインストール済みであること。 2. [オンボーディングを作成済み](create-onboarding)であること。 3. オンボーディングを[プレースメント](placements)に追加済みであること。 オンボーディングビルダーを使ってオンボーディングをカスタマイズした場合、ユーザーに表示するためのレンダリングコードをアプリ側で実装する必要はありません。このようなオンボーディングには、表示する内容と表示方法の両方が含まれています。 デバイス画面にビジュアルオンボーディングを表示するには、まず設定が必要です。`AdaptyUI.getOnboardingView()` メソッドを呼び出すか、`OnboardingView` を直接作成してください:
例えば、ユーザーが **Login** や **Allow notifications** などのカスタムボタンをタップすると、デリゲートメソッド `onCustomAction` がビルダーで設定したアクション ID とともに呼び出されます。"allowNotifications" のように、任意の ID を自由に作成できます。
```kotlin showLineNumbers
class YourActivity : AppCompatActivity() {
private val eventListener = object : AdaptyOnboardingEventListener {
override fun onCustomAction(action: AdaptyOnboardingCustomAction, context: Context) {
when (action.actionId) {
"allowNotifications" -> {
// Request notification permissions
}
}
}
override fun onError(error: AdaptyOnboardingError, context: Context) {
// Handle errors
}
// ... other required delegate methods
}
}
```
ローカルのフォールバックペイウォール JSON が無効です。
デフォルトの英語のペイウォールを修正してから、無効なローカルペイウォールを置き換えてください。ペイウォールの修正方法については [リモートコンフィグでペイウォールをカスタマイズする](customize-paywall-with-remote-config) を、ローカルペイウォールの置き換え方法については [ローカルフォールバックペイウォールを定義する](fallback-paywalls) を参照してください。
| |CURRENT_SUBSCRIPTION_TO_UPDATE
\_NOT_FOUND_IN_HISTORY
| 置き換え対象の元のサブスクリプションが有効なサブスクリプションの中に見つかりません。 | | [BILLING_SERVICE_TIMEOUT](https://developer.android.com/google/play/billing/errors#service_timeout_error_code_-3) | Google Play が応答する前にリクエストが最大タイムアウトに達したことを示します。Play Billing Library の呼び出しで要求されたアクションの実行が遅延した場合などに発生します。 | | [FEATURE_NOT_SUPPORTED](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#FEATURE_NOT_SUPPORTED()) | 要求された機能が現在のデバイスの Play Store でサポートされていません。 | | [BILLING_SERVICE_DISCONNECTED](https://developer.android.com/google/play/billing/errors#service_disconnected_error_code_-1) | クライアントアプリと `BillingClient` 経由の Google Play Store サービスとの接続が切断されたことを示します。 | | [BILLING_SERVICE_UNAVAILABLE](https://developer.android.com/google/play/billing/errors#service_unavailable_error_code_2) | Google Play Billing サービスが現在利用できないことを示します。ほとんどの場合、クライアントデバイスと Google Play Billing サービスの間のどこかでネットワーク接続の問題が発生しています。 | | [BILLING_UNAVAILABLE](https://developer.android.com/google/play/billing/errors#billing_unavailable_error_code_3) |購入プロセス中に請求に関する問題が発生したことを示します。考えられる原因は以下のとおりです:
1. ユーザーのデバイスに Play Store アプリがインストールされていないか、古いバージョンです。
2. ユーザーがサポートされていない国にいます。
3. ユーザーが、管理者によって購入が無効化されているエンタープライズアカウントに属しています。
4. Google Play がユーザーの支払い方法に請求できませんでした(例:クレジットカードの有効期限切れ)。
5. ユーザーが Play Store アプリにログインしていません。
| | [DEVELOPER_ERROR](https://developer.android.com/google/play/billing/errors#developer_error) | API の使い方が正しくないことを示します。 | | [BILLING_ERROR](https://developer.android.com/google/play/billing/errors#error_error_code_6) | Google Play 自体の内部的な問題を示します。 | | [ITEM_ALREADY_OWNED](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#ITEM_ALREADY_OWNED()) | そのプロダクトはすでに購入済みです。 | | [ITEM_NOT_OWNED](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#ITEM_NOT_OWNED()) | ユーザーがそのアイテムを所有していないため、要求されたアクションが失敗したことを示します。 | | [BILLING_NETWORK_ERROR](https://developer.android.com/google/play/billing/errors#network_error_error_code_12) | デバイスと Play のシステム間のネットワーク接続に問題があったことを示します。 | | NO_PRODUCT_IDS_FOUND |ペイウォール内のプロダクトがいずれもストアで利用できないことを示します。
このエラーが発生した場合は、以下の手順で解決してください:
認証前にコードが期限切れになった場合、または**Deny**をクリックした場合は、次のコマンドを再度実行してフローを再開してください:
```bash
adapty auth login
```
## 認証の管理 \{#manage-authentication\}
### 認証状態の確認 \{#check-authentication-status\}
現在の認証状態を確認するには、次のコマンドを実行します:
```bash
adapty auth status
```
認証済みの場合、出力にはメールアドレス、マスクされたトークンのプレフィックス、およびローカル設定ファイルのパスが表示されます:
```
Email: you@example.com
Token: abcd1234****
Config: ~/.config/adapty/config.json
```
未認証の場合:
```
Not authenticated. Run `adapty auth login`.
```
### トークンの検証 \{#verify-your-token\}
トークンが有効であることを確認し、アカウントの詳細を表示するには、次のコマンドを実行します:
```bash
adapty auth whoami
```
`adapty auth status`とは異なり、このコマンドはサーバーにリクエストを送信してトークンを検証します。
### ログアウト \{#log-out\}
保存されている認証情報をローカルから削除するには、次のコマンドを実行します:
```bash
adapty auth logout
```
これにより`~/.config/adapty/config.json`が削除されます。トークンは有効期限が切れるまでサーバー側では有効なままです。すぐに無効化する必要がある場合は、代わりに`adapty auth revoke`を使用してください。
### トークンの失効 \{#revoke-your-token\}
サーバー上のトークンを無効化し、ローカルからも削除するには、次のコマンドを実行します:
```bash
adapty auth revoke
```
このコマンドは、たとえば認証情報が漏洩した可能性がある場合など、トークンを完全に無効化したいときに使用します。失効後、再認証するには`adapty auth login`を実行してください。
## トークンエラー \{#token-errors\}
トークンが失効または無効になった場合、CLIコマンドは401エラーを返します。再認証するには、次のコマンドを実行します:
```bash
adapty auth login
```
---
# File: developer-cli-reference
---
---
title: "Adapty Developer CLIの完全リファレンス"
description: "すべてのAdapty Developer CLIコマンドの完全リファレンス。"
---
:::link
AIアシスタントを使っていますか?LLMがCLIを操作しやすいように[Adapty CLIスキル](https://github.com/adaptyteam/adapty-cli/tree/main/skills/adapty-cli)が用意されています。
:::
この記事では、Adapty CLIのすべてのコマンドと引数、フラグ、使用可能な値を一覧で紹介します。
:::link
認証の設定とトークン管理については、[認証](developer-cli-authentication)を参照してください。
:::
## グローバルフラグ \{#global-flags\}
これらのフラグはすべてのコマンドで使用できます。
| フラグ | 説明 |
|---|---|
| `--json` | フォーマットテキストの代わりにJSONで出力する |
| `--help` | コマンドのヘルプを表示する |
すべての `list` コマンドではページネーションフラグも使用できます:
| フラグ | デフォルト | 説明 |
|---|---|---|
| `--page` | `1` | ページ番号 |
| `--page-size` | `20` | 1ページあたりのアイテム数(最大:100) |
## アプリ \{#apps\}
Adaptyアカウント内のアプリを管理します。ダッシュボードベースの設定については、[App settings](general)を参照してください。
### adapty apps list \{#adapty-apps-list\}
Adaptyアカウント内のすべてのアプリを一覧表示します。
```bash
adapty apps list
```
[ページネーションフラグ](#global-flags)を使用できます。
### adapty apps get \{#adapty-apps-get\}
特定のアプリの詳細を取得します。
```bash
adapty apps get
:::note サブスクリプションイベントを追跡するには、Adapty の [Webhook](webhook) 連携を利用するか、既存のサービスと直接連携してください。 ::: ## ウェブとモバイル間でサブスクライバーを同期する場合 \{#case-1-sync-subscribers-between-web-and-mobile\} StripeやChargeBeeなどのWeb決済プロバイダーを使用している場合、サブスクリプションユーザーを簡単に同期できます。手順は以下のとおりです: 1.
ユーザーの Adapty プロファイル ID。[Adapty Dashboard -> **Profiles**](https://app.adapty.io/profiles/users) -> 特定のプロファイルページの **Adapty ID** フィールドで確認できます。
**adapty-customer-user-id** と互換性があり、どちらでも使用できます。
| | **adapty-customer-user-id** |あなたのシステムにおけるユーザー ID。[Adapty Dashboard -> **Profiles**](https://app.adapty.io/profiles/users) -> 特定のプロファイルページの **Customer user ID** フィールドで確認できます。
**adapty-profile-id** と互換性があり、どちらでも使用できます。
⚠️ Adapty SDK を使用してアプリコード内で
### ログイン/サインアップ時 \{#during-loginsignup\}
アプリ起動後にユーザーを識別する場合(例:アプリへのログインやサインアップ後)は、`identify`メソッドを使用してカスタマーユーザーIDを設定します。
- **このカスタマーユーザーIDを以前に使用したことがない**場合、Adaptyは自動的にそれを現在のプロファイルに紐付けます。
- **このカスタマーユーザーIDを以前にユーザーの識別に使用したことがある**場合、AdaptyはそのカスタマーユーザーIDに関連付けられたプロファイルに切り替えます。
:::tip
カスタマーユーザーIDを作成する際は、ユーザーデータと一緒に保存しておくと、新しいデバイスからログインした場合やアプリを再インストールした際に同じIDを送信できます。
:::
他のSDKメソッドを呼び出す前に、必ず`identify`を`await`してください。並行して呼び出すと`#3006 profileWasChanged`が発生するか、匿名プロファイルに対して操作が行われます。[Capacitor SDKの呼び出し順序](capacitor-sdk-call-order)を参照してください。
```typescript showLineNumbers
try {
await adapty.identify({ customerUserId: "YOUR_USER_ID" });
// successfully identified
} catch (error) {
// handle the error
}
```
### SDK有効化時 \{#during-the-sdk-activation\}
SDKを有効化するときにすでにカスタマーユーザーIDがわかっている場合は、`identify`を別途呼び出す代わりに、`activate`メソッドで送信できます。
カスタマーユーザーIDがわかっていても、有効化後にのみ設定する場合、有効化時にAdaptyは新しい空のプロファイルを作成し、`identify`を呼び出した後にのみ既存のプロファイルに切り替わります。
既存のカスタマーユーザーID(以前に使用したもの)と新しいもののどちらでも渡すことができます。新しいものを渡した場合、有効化時に作成された新しいプロファイルが自動的にそのカスタマーユーザーIDに紐付けられます。
:::tip
作成された空のプロファイルをダッシュボードのアナリティクスから除外するには、**App settings**に移動して[**Installs definition for analytics**](general#4-installs-definition-for-analytics)を設定してください。
:::
```typescript showLineNumbers
await adapty.activate({
apiKey: "YOUR_PUBLIC_SDK_KEY",
params: {
customerUserId: "YOUR_USER_ID"
}
});
```
### ユーザーをログアウトする \{#log-users-out\}
ユーザーをログアウトするボタンがある場合は、`logout`メソッドを使用します。これにより、ユーザーに新しい匿名プロファイルIDが作成されます。
```typescript showLineNumbers
try {
await adapty.logout();
// successful logout
} catch (error) {
// handle the error
}
```
:::info
ユーザーをアプリに再度ログインさせるには、`identify`メソッドを使用してください。
:::
### ログインせずに購入を許可する \{#allow-purchases-without-login\}
ユーザーがアプリにログインする前後の両方で購入できる場合、追加の設定は不要です:
仕組みは次のとおりです:
1. ログアウト状態のユーザーが購入を行うと、Adaptyはその購入を匿名プロファイルIDに紐付けます。
2. ユーザーがアカウントにログインすると、Adaptyは識別済みプロファイルに切り替えます。
- 既存のカスタマーユーザーID(すでにプロファイルに紐付けられているカスタマーユーザーID)の場合、Adaptyはトランザクションを自動的に同期します。
- 新しいカスタマーユーザーID(例:登録前に購入が行われた場合)の場合、Adaptyは現在のプロファイルにカスタマーユーザーIDを割り当て、すべての購入履歴が維持されます。
---
# File: adapty-sdk-integration-skill-capacitor
---
---
title: "SDKインテグレーションスキルを使ってAdaptyをCapacitorアプリに導入する"
description: "adapty-sdk-integrationスキルを使って、AIコーディングツールでCapacitorアプリにAdapty SDKをエンドツーエンドで統合する方法を説明します。"
---
:::important
このスキルはベータ版です。処理が止まったり予期しない動作が発生した場合は、代わりに[ステップバイステップの統合ガイド](adapty-cursor-capacitor)を参照してください。AIツールが各ステップを正しいドキュメントに沿って進められるよう案内しています。
:::
[adapty-sdk-integration スキル](https://github.com/adaptyteam/adapty-sdk-integration-skill)は、Adapty のインテグレーションをエンドツーエンドで自動化します。ダッシュボードのセットアップ、SDK のインストール、ペイウォール、各ステージの検証まで対応しています。プラットフォームを自動検出し、各ステージで関連する Adapty ドキュメントを取得します。
**対応ツール**: Claude Code、GitHub Copilot CLI、OpenAI Codex、Gemini CLI。
インストールするには、お使いのツールに対応したフォームを選択してください。全リストは[スキルの README](https://github.com/adaptyteam/adapty-sdk-integration-skill) にあります。
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex またはその他のツール** — [skills CLI](https://skills.sh) を使用してください(この方法でインストールしたスキルは自動更新されません):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
または、リポジトリをクローンして `skills/adapty-sdk-integration/` をお使いのツールのスキルディレクトリにコピーしてください。
インストール後、プロジェクトでスキルを実行します:
```
/adapty-sdk-integration
```
スキルがいくつかのセットアップに関する質問をした後、ダッシュボードのセットアップ、SDK のインストール、ペイウォール、検証の手順を案内します。
---
# File: adapty-cursor-capacitor
---
---
title: "AIアシスタンスを使用してCapacitorアプリにAdaptyを統合する"
description: "Cursor、Context7、ChatGPT、Claude、その他のAIツールを使用してCapacitorアプリにAdaptyを統合するステップバイステップガイド。"
---
このガイドでは、AIコーディングツールを使ってCapacitorアプリにAdaptyを段階的に統合する方法を説明します。適切なAdaptyドキュメントを正しい順序でAIに提供していきます。
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## はじめる前に:ダッシュボードの設定 \{#before-you-start-dashboard-setup\}
AdaptyはSDKコードを書く前に、いくつかのダッシュボード設定が必要です。インタラクティブなLLMスキルを使うか、ダッシュボードから手動で設定できます。
### スキルを使う方法(推奨) \{#skill-approach-recommended\}
Adapty CLIスキルを使うと、LLMがアプリ、プロダクト、アクセスレベル、ペイウォール、プレースメントを直接設定できます。各ステップでダッシュボードを開く必要がありません。[ストアの接続](integrate-payments)だけダッシュボードで行う必要があります。
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
スキルを追加したら、エージェントで `/adapty-cli` を実行してください。ストアの接続が必要なタイミングも含め、各ステップをガイドしてくれます。
### ダッシュボードを使った設定方法 \{#dashboard-approach\}
コードを書く前に手動で設定を行う場合、事前に準備が必要なものがあります。LLM がダッシュボードの値を自動で調べることはできないため、あなた自身が提供する必要があります。
1. **アプリストアを連携する**: Adapty ダッシュボードで **App settings → General** に移動します。Capacitor アプリが両方のプラットフォームを対象とする場合は、App Store と Google Play の両方を連携してください。これは購入機能を動作させるために必要です。
[アプリストアを連携する](integrate-payments)
2. **公開 SDK キーをコピーする**: Adapty ダッシュボードで **App settings → General** に移動し、**API keys** セクションを確認します。コード内では、この文字列を `adapty.activate()` に渡します。
3. **プロダクトを少なくとも 1 つ作成する**: Adapty ダッシュボードで **Products** ページに移動します。コード内でプロダクトを直接参照する必要はありません — Adapty はペイウォールを通じてプロダクトを提供します。
[プロダクトを追加する](quickstart-products)
4. **ペイウォールとプレースメントを作成する**: Adapty ダッシュボードの **Paywalls** ページでペイウォールを作成し、**Placements** ページでプレースメントに割り当てます。コード内では、プレースメント ID が `adapty.getFlow()` に渡す文字列です。
[ペイウォールを作成する](quickstart-paywalls)
5. **アクセスレベルを設定する**: Adapty ダッシュボードの **Products** ページで、プロダクトごとに設定します。コード内では `profile.accessLevels['premium']?.isActive` で確認します。デフォルトの `premium` アクセスレベルは、ほとんどのアプリで利用できます。購入ユーザーがプロダクトによって異なる機能にアクセスできる場合(たとえば `basic` プランと `pro` プランなど)、コーディングを始める前に[追加のアクセスレベルを作成](assigning-access-level-to-a-product)してください。
:::tip
5つすべてが揃ったら、コードを書く準備完了です。LLMに「パブリックSDKキーはX、プレースメントIDはY」と伝えることで、正しい初期化とフロー取得コードを生成できます。
:::
### 準備ができたら設定すること \{#set-up-when-ready\}
コーディングを始める前に必須ではありませんが、統合が成熟するにつれて必要になります:
- **A/B テスト**: **Placements** ページで設定します。コードの変更は不要です。
[A/B テスト](ab-tests)
- **追加のペイウォールとプレースメント**: 異なるプレースメントIDで `getPaywall` の呼び出しを追加します。
- **アナリティクス連携**: **Integrations** ページで設定します。セットアップは連携先によって異なります。[アナリティクス連携](analytics-integration)と[アトリビューション連携](attribution-integration)を参照してください。
## AdaptyドキュメントをLLMに提供する \{#feed-adapty-docs-to-your-llm\}
### Context7を使う(推奨)
[Context7](https://context7.com)は、LLMが最新のAdaptyドキュメントに直接アクセスできるMCPサーバーです。何を質問するかに応じて、LLMが自動的に適切なドキュメントを取得するため、URLを手動で貼り付ける必要はありません。
Context7は**Cursor**、**Claude Code**、**Windsurf**、その他のMCP対応ツールで動作します。セットアップするには、次のコマンドを実行してください:
```
npx ctx7 setup
```
これにより、エディタが検出され、Context7サーバーが設定されます。手動セットアップについては、[Context7 GitHubリポジトリ](https://github.com/upstash/context7)を参照してください。
設定が完了したら、プロンプトでAdaptyライブラリを参照してください:
```
Use the adaptyteam/adapty-docs library to look up how to install the Capacitor SDK
```
:::warning
Context7によってドキュメントのリンクを手動で貼り付ける手間は省けますが、実装の順序は重要です。すべてが正しく動作するよう、以下の[実装手順](#implementation-walkthrough)にしたがって順番に進めてください。
:::
### プレーンテキストのドキュメントを使う \{#use-plain-text-docs\}
Adaptyのドキュメントはプレーンテキストのマークダウンとして取得できます。URLの末尾に `.md` を追加するか、記事タイトルの下にある **Copy for LLM** をクリックしてください。例:[adapty-cursor-capacitor.md](https://adapty.io/docs/ja/adapty-cursor-capacitor.md)
以下の[実装ウォークスルー](#implementation-walkthrough)の各ステージには、貼り付け用の `.md` リンクが含まれた「LLMに送るもの」ブロックがあります。
一度に複数のドキュメントが必要な場合は、以下の[インデックスファイルとプラットフォーム別サブセット](#plain-text-doc-index-files)を参照してください。
## 実装ウォークスルー \{#implementation-walkthrough\}
このガイドの残りでは、実装順序に沿ってAdapty統合を進めていきます。各ステージには、LLMに送るドキュメント、完了時に確認できること、よくある問題が含まれています。
### インテグレーションを計画する \{#plan-your-integration\}
コーディングを始める前に、LLM にプロジェクトを分析させて実装計画を立ててもらいましょう。AI ツールにプランニングモードがある場合(Cursor や Claude Code のプランモードなど)、コードを書く前に LLM がプロジェクト構造と Adapty のドキュメントを両方確認できるよう、そのモードを活用してください。
購入に使っているアプローチを LLM に伝えましょう。これによって参照すべきガイドが変わります:
- [**Adapty フロービルダー**](adapty-flow-builder): Adapty のノーコードビルダーでフローを作成し、SDK が自動的にレンダリングします。
- [**手動で作成したペイウォール**](capacitor-making-purchases): 独自のペイウォール UI をコードで構築しながら、プロダクトの取得と購入処理には Adapty を使用します。
- [**オブザーバーモード**](observer-vs-full-mode): 既存の購入インフラをそのまま使用し、Adapty はアナリティクスとインテグレーションにのみ利用します。
どれを選べばよいかわからない場合は、[クイックスタートの比較表](capacitor-quickstart-paywalls)をご覧ください。
### SDKのインストールと設定 \{#install-and-configure-the-sdk\}
npm を使って Adapty SDK の依存関係を追加し、公開 SDK キーで有効化します。これがすべての基盤となります。これなしには何も動作しません。
**ガイド:** [Adapty SDK のインストールと設定](sdk-installation-capacitor)
:::info
このウォークスルーは Adapty Capacitor SDK v4(ベータ版)を対象としています — [クイックスタート](capacitor-quickstart-paywalls)で紹介している API です。v4 はプレリリース版のため、最新の安定版 3.x をインストールするのではなく、LLM が正確なバージョン(`npm install @adapty/capacitor@4.0.0-beta.2`)を固定するように注意してください。[SDK 4.0 インストールセクション](sdk-installation-capacitor#adapty-sdk-40-beta)と[移行ガイド](migration-to-capacitor-sdk-v4)をご参照ください。
:::
これを LLM に送信してください:
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/ja/sdk-installation-capacitor.md
```
:::tip[チェックポイント]
- **確認事項:** iOS・Android 両方でアプリがビルド・起動できること。コンソールに Adapty のアクティベーションログが表示されること。
- **よくある問題:** "Public API key is missing" → **App settings** のキーをプレースホルダーから実際のキーに置き換えたか確認してください。
:::
### ペイウォールの表示と購入処理 \{#show-paywalls-and-handle-purchases\}
プレースメント ID でペイウォールを取得し、表示して、購入イベントを処理します。必要なガイドは購入処理の方法によって異なります。
進めながら各購入をサンドボックスでテストしてください — 最後まで待たないようにしましょう。セットアップ手順は[サンドボックスでの購入テスト](test-purchases-in-sandbox)を参照してください。
オプションの `params` オブジェクト内で渡します。デフォルトでは、SDK はサーバーからデータを取得しようとし、失敗した場合はキャッシュされたデータを返します。この方式はユーザーが常に最新のデータを受け取れるため、推奨しています。
ただし、ユーザーのインターネット接続が不安定な場合は、`'return_cache_data_else_load'` を使用してキャッシュが存在すればそれを返すことを検討してください。この場合、絶対的に最新のデータが届かないことがありますが、回線状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、ネットワークリクエストを減らす目的でセッション中に使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はペイウォールをローカルに2層で保存しています。上記の定期更新されるキャッシュと[フォールバックペイウォール](fallback-paywalls)です。また、ペイウォールをより速く取得するために CDN を使用し、CDN に到達できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な場合でも常に最新バージョンのペイウォールを取得できるよう設計されています。
| | **loadTimeoutMs** | デフォルト: 5秒 |オプションの `params` オブジェクト内で渡します。このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルフォールバックが返されます。
まれに、内部で複数のリクエストが実行されるため、このメソッドが `loadTimeoutMs` に指定した時間よりわずかに遅れてタイムアウトする場合があります。
| **プロダクトIDをハードコードしないでください。** ハードコードすべきIDはプレースメントIDのみです。フローとペイウォールはリモートで設定されるため、プロダクトの数や利用可能なオファーはいつでも変更される可能性があります。アプリはこれらの変更を動的に処理する必要があります。今日ペイウォールが2つのプロダクトを返し、明日3つを返しても、コードを変更せずにすべて表示できるようにしてください。 レスポンスパラメーター: | パラメータ | 説明 | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Flow | フローの識別子(`id`、`variationId`)、名前、プレースメント、ペイウォールのバリアント(`paywalls`)、リモートコンフィグ(`remoteConfigs`)を持つ `AdaptyFlow` オブジェクト。 | ## ビュー設定を取得する \{#fetch-the-view-configuration\} :::important ビルダーで **Show on device** トグルを有効にしてください。このオプションがオンになっていない場合、ビュー設定を取得できません。 ::: プレースメントが **Flow Builder** または **Paywall Builder** でデザインされている場合、Adapty が UI をレンダリングします。`createFlowView` でビューを作成し、[フローまたはペイウォールを表示](capacitor-present-paywalls)してください。プレースメントがビルダー UI のないカスタムペイウォールの場合は、代わりに[リモートコンフィグペイウォールとして処理](present-remote-config-paywalls-capacitor)してください。 Capacitor SDK では、`createFlowView` を直接呼び出すことができます。事前にビューの設定を取得する必要はありません。 :::warning `createFlowView` メソッドの戻り値は一度しか使用できません。再度使用する必要がある場合は、`createFlowView` メソッドを再度呼び出してください。再生成せずに2回呼び出すとエラーが発生する場合があります。 ::: ```typescript showLineNumbers try { const view = await createFlowView(flow); } catch (error) { // handle the error } ``` パラメーター: | パラメーター | 必須/任意 | 説明 | | :------------------- | :------- | :----------------------------------------------------------- | | **flow** | 必須 | 目的のフロー/ペイウォールのコントローラーを取得するための `AdaptyFlow` オブジェクト。 | | **customTags** | 任意 | カスタムタグとその解決済みの値の辞書を定義します。カスタムタグはコンテンツ内のプレースホルダーとして機能し、フロー/ペイウォール内のパーソナライズされたコンテンツに対して特定の文字列に動的に置き換えられます。詳細については、ペイウォールビルダーのカスタムタグに関するトピックを参照してください。 | | **prefetchProducts** | 任意 | 画面上のプロダクト表示タイミングを最適化するために有効にします。`true` の場合、AdaptyUI は必要なプロダクトを自動的に取得します。デフォルト: `true`。 | | **android.enableSafeArea** | 任意 | Android のみ(iOS では無視されます)。`android` キーの下にネストされます。`true` の場合、フロービューにセーフエリアのパディングが適用されます。デフォルト: `true`。デフォルト設定はほとんどのケースに適しています。 | :::note 複数の言語を使用している場合は、[フローのローカライズ](add-paywall-locale-in-adapty-paywall-builder)の追加方法と、ロケールコードの正しい使い方について[こちら](capacitor-localizations-and-locale-codes)をご覧ください。 ::: ビューを取得したら、[フロー/ペイウォールを表示](capacitor-present-paywalls)してください。 ## デフォルトオーディエンスのフローまたはペイウォールをより速く取得する \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} 通常、フローやペイウォールはほぼ瞬時に取得されるため、この処理を高速化することを気にする必要はありません。ただし、オーディエンスやプレースメントの数が多く、ユーザーのインターネット接続が不安定な場合は、フローやペイウォールの取得に予想以上の時間がかかることがあります。そのような場合、何も表示しないよりもスムーズなユーザー体験を確保するために、デフォルトのフローまたはペイウォールを表示したいことがあるでしょう。 これに対処するには、`getFlowForDefaultAudience` メソッドを使用できます。このメソッドは、指定したプレースメントの **All Users** オーディエンスに対応するフローまたはペイウォールを取得します。ただし、推奨されるアプローチは `getFlow` メソッドでフローまたはペイウォールを取得することであり、詳細は上記の [フロー/ペイウォールの取得](#fetch-flowpaywall) セクションを参照してください。 :::warning `getFlow` を推奨する理由 `getFlowForDefaultAudience` メソッドにはいくつかの重大な欠点があります: - **後方互換性の問題**: 現在のバージョンと将来のバージョンで異なるペイウォールを表示する必要がある場合、課題が生じる可能性があります。現在の(レガシー)バージョンに対応したペイウォールを設計するか、現在の(レガシー)バージョンのユーザーがレンダリングされないペイウォールで問題が発生することを受け入れるかのいずれかになります。 - **ターゲティングの喪失**: すべてのユーザーが **All Users** オーディエンス向けに設計された同じペイウォールを見ることになるため、パーソナライズされたターゲティング(国、マーケティングアトリビューション、独自のカスタム属性に基づくものを含む)が失われます。 これらのデメリットを許容してでもフローやペイウォールの取得を高速化したい場合は、以下のように `getFlowForDefaultAudience` メソッドを使用してください。そうでない場合は、[上記](#fetch-flowpaywall)で説明した `getFlow` を使用してください。 ::: ```typescript showLineNumbers try { const flow = await adapty.getFlowForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', }); // the requested flow/paywall } catch (error) { // handle the error } ``` | パラメーター | 必須/任意 | 説明 | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | 必須 | [プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **fetchPolicy** | デフォルト: `'reload_revalidating_cache_data'` |省略可能な `params` オブジェクト内に渡します。デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるよう、この設定を推奨します。
ただし、ユーザーがネットワーク環境の不安定な状況を頻繁に経験する場合は、`'return_cache_data_else_load'` を使用してキャッシュが存在するときはキャッシュデータを返すことを検討してください。この場合、ユーザーが最新データを取得できないことがありますが、ネットワーク状況に関わらず読み込み時間が短縮されます。キャッシュはセッション中に定期的に更新されるため、ネットワークリクエストを避ける目的でキャッシュを使用しても安全です。
なお、キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
| ## アセットのカスタマイズ \{#customize-assets\} フロー/ペイウォールの画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像とヒーロー動画には事前定義されたID(`hero_image` と `hero_video`)があります。カスタムアセットバンドルでは、これらのIDを使って各要素を指定し、動作をカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定](custom-media)する必要があります。 たとえば、次のようなことができます: - 一部のユーザーに異なる画像や動画を表示する。 - リモートのメイン画像の読み込み中に、ローカルのプレビュー画像を表示する。 - 動画の再生前にプレビュー画像を表示する。 カスタムアセットをシンプルなディクショナリで指定する例を以下に示します。 ```typescript showLineNumbers const customAssets: Record任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-paywall-locale-in-adapty-paywall-builder)の識別子。このパラメーターは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードである必要があります。最初のサブタグは言語、2番目のサブタグは地域を表します。
例:`en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードとその推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **params** | 任意 | ペイウォールを取得するための追加パラメーター。 | **プロダクトIDをハードコードしないでください。** ハードコードしてよいのはプレースメントIDだけです。ペイウォールはリモートで設定されるため、プロダクト数や利用可能なオファーはいつでも変更される可能性があります。アプリはこれらの変更を動的に処理する必要があります。今日は2つのプロダクトが返ってきて、明日は3つになったとしても、コードを変更せずにすべてを表示できるようにしてください。 レスポンスパラメーター: | パラメーター | 説明 | | :-------- |:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | プロダクトIDのリスト、ペイウォール識別子、リモートコンフィグ、その他のプロパティを含む [`AdaptyPaywall`](https://capacitor.adapty.io/interfaces/adaptypaywall) オブジェクト。 | ## ペイウォールビルダーで作成したペイウォールのビュー設定を取得する \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important ペイウォールビルダーの **Show on device** トグルを有効にしてください。このオプションがオンになっていない場合、ビュー設定を取得できません。 ::: ペイウォールを取得したら、`ViewConfiguration` が含まれているかどうかを確認してください。これが存在する場合、ペイウォールビルダーで作成されたペイウォールであることを示します。この情報をもとに、ペイウォールの表示方法を決定します。`ViewConfiguration` が存在する場合はペイウォールビルダーのペイウォールとして扱い、存在しない場合は[リモートコンフィグのペイウォールとして処理してください](present-remote-config-paywalls-capacitor)。 Capacitor SDK では、ビュー設定を手動で取得することなく、直接 `createPaywallView` メソッドを呼び出してください。 :::warning `createPaywallView` メソッドの結果は一度しか使用できません。再度使用する必要がある場合は、`createPaywallView` メソッドを新たに呼び出してください。 ::: ```typescript showLineNumbers if (paywall.hasViewConfiguration) { try { const view = await createPaywallView(paywall); } catch (error) { // handle the error } } else { // use your custom logic } ``` パラメーター: | パラメータ | 必須/任意 | 説明 | | :------------------- | :------- | :----------------------------------------------------------- | | **paywall** | 必須 | 目的のペイウォールのコントローラーを取得するための `AdaptyPaywall` オブジェクト。 | | **customTags** | 任意 | カスタムタグとその解決済みの値の辞書を定義します。カスタムタグはペイウォールコンテンツ内のプレースホルダーとして機能し、ペイウォール内のパーソナライズされたコンテンツ向けに特定の文字列へ動的に置換されます。詳細はペイウォールビルダーのカスタムタグのトピックを参照してください。 | | **prefetchProducts** | 任意 | 画面上のプロダクト表示タイミングを最適化するために有効にします。`true` の場合、AdaptyUI は必要なプロダクトを自動的に取得します。デフォルト: `false`。 | :::note 複数の言語を使用している場合は、[ペイウォールビルダーのローカライゼーションの追加方法](add-paywall-locale-in-adapty-paywall-builder)と、ロケールコードの正しい使い方[こちら](capacitor-localizations-and-locale-codes)をご確認ください。 ::: ビューを取得したら、[ペイウォールを表示](capacitor-present-paywalls)します。 ## デフォルトオーディエンス向けペイウォールを取得してより速く表示する \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} 通常、ペイウォールはほぼ瞬時に取得されるため、速度を気にする必要はありません。ただし、オーディエンスやペイウォールの数が多く、かつユーザーのインターネット接続が不安定な場合は、取得に想定以上の時間がかかることがあります。そのような状況では、ペイウォールをまったく表示しないよりも、デフォルトのペイウォールを表示してスムーズなユーザー体験を確保したい場合があります。 これに対処するには、`getPaywallForDefaultAudience` メソッドを使用できます。このメソッドは、**All Users** オーディエンス向けに指定されたプレースメントのペイウォールを取得します。ただし、推奨されるアプローチは `getPaywall` メソッドでペイウォールを取得することであり、詳細は上記の[ペイウォール情報を取得する](#fetch-paywall-designed-with-paywall-builder)セクションを参照してください。 :::warning `getPaywall` を推奨する理由 `getPaywallForDefaultAudience` メソッドにはいくつかの重大な欠点があります: - **後方互換性の問題**: 異なるアプリバージョン(現行版と将来版)に対して異なるペイウォールを表示する必要がある場合、現行(レガシー)バージョンに対応したペイウォールを設計するか、現行(レガシー)バージョンのユーザーがペイウォールを正しくレンダリングできない問題を受け入れるかのどちらかになります。 - **ターゲティングの喪失**: すべてのユーザーに **All Users** オーディエンス向けに設計された同じペイウォールが表示されます。これにより、国、マーケティングのアトリビューション、独自のカスタム属性に基づくターゲティングなど、パーソナライズされたターゲティングが失われます。 これらのデメリットを許容してでもペイウォールの取得を高速化したい場合は、以下のように `getPaywallForDefaultAudience` メソッドを使用してください。そうでない場合は、[上記](#fetch-paywall-designed-with-paywall-builder)で説明した `getPaywall` をご利用ください。 ::: ```typescript showLineNumbers try { const paywall = await adapty.getPaywallForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en', }); // the requested paywall } catch (error) { // handle the error } ``` | パラメータ | 必須/任意 | 説明 | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | 必須 | [プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
|[ペイウォールのローカライゼーション](add-remote-config-locale)の識別子です。このパラメータは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語を、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよび推奨される使用方法については、[ローカライゼーションとロケールコード](capacitor-localizations-and-locale-codes)を参照してください。
| | **params** | 任意 | ペイウォールを取得するための追加パラメータです。 | ## アセットのカスタマイズ \{#customize-assets\} ペイウォール内の画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像と動画には事前定義されたIDがあります:`hero_image` と `hero_video` です。カスタムアセットバンドルでは、これらのIDを使って対象の要素を指定し、動作をカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定](custom-media)する必要があります。 たとえば、次のようなことができます: - 一部のユーザーに別の画像や動画を表示する。 - リモートのメイン画像の読み込み中にローカルのプレビュー画像を表示する。 - 動画再生前にプレビュー画像を表示する。 以下は、シンプルなディクショナリーを使ってカスタムアセットを提供する例です: ```typescript showLineNumbers const customAssets: Record任意
デフォルト: `'reload_revalidating_cache_data'`
|デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、この設定を推奨します。
ただし、ユーザーのインターネット環境が不安定な場合は、`'return_cache_data_else_load'` を使用してキャッシュが存在する場合はそれを返すことを検討してください。この場合、最新データが取得できないこともありますが、接続状況に関わらずより速い読み込みが期待できます。キャッシュは定期的に更新されるため、ネットワークリクエストを減らすためにセッション中に使用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はフローとペイウォールを2つの層で保存しています。1つは上述の定期更新されるキャッシュ、もう1つは[フォールバックペイウォール](capacitor-use-fallback-paywalls)です。また、フローとペイウォールをより速く取得するために CDN を使用し、CDN に到達できない場合に備えてスタンドアローンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な場合でも信頼性を確保しながら、常に最新のフローを取得できるよう設計されています。
| | **params.loadTimeoutMs** |任意
デフォルト: 5000 ms
|このメソッドのタイムアウト(ミリ秒)を制限する値です。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。
このメソッドは内部で複数のリクエストを行う場合があるため、まれに `loadTimeoutMs` で指定した時間よりわずかに遅れてタイムアウトすることがあります。
| :::note v4 では、`getFlow` は `locale` パラメータを受け取らなくなりました。カスタムペイウォールの場合、利用可能なすべてのロケールはフローのリモートコンフィグ(`flow.remoteConfigs`)で返されます。ユーザーのデバイスまたはアプリの設定に合うものを選択してください。 ::: プロダクト ID をハードコードしないでください!フローはリモートで設定されるため、利用可能なプロダクト、プロダクトの数、特別オファー(無料トライアルなど)は随時変更される可能性があります。コードがこれらのシナリオに対応できるようにしてください。 たとえば、最初に 2 つのプロダクトを取得した場合、アプリはその 2 つを表示する必要があります。その後 3 つのプロダクトを取得した場合は、コードを変更することなく 3 つすべてを表示できるようにしてください。ハードコードする必要があるのはプレースメント ID だけです。 レスポンスパラメーター: | パラメーター | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | プレースメント、識別子(`id`、`variationId`)、名前、ペイウォールのバリアント(`paywalls`)、および設定済みロケールごとに1エントリの `remoteConfigs` 配列を含む `AdaptyFlow` オブジェクト。フローのプロダクトを取得するには、`getPaywallProducts({ flow })` を呼び出してください。 | ## プロダクトの取得 \{#fetch-products\} フローを取得したら、それに対応するプロダクトの配列を取得できます。 ```typescript showLineNumbers try { const products = await adapty.getPaywallProducts({ flow }); // the requested products list } catch (error) { console.error('Failed to fetch products:', error); } ``` レスポンスパラメーター: | パラメータ | 説明 | | :-------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | [`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct) オブジェクトのリストで、プロダクト識別子、プロダクト名、価格、通貨、サブスクリプション期間、その他のプロパティが含まれます。 | 独自のペイウォールデザインを実装する際には、[`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct) オブジェクトから以下のプロパティにアクセスする必要があります。よく使用されるプロパティを以下に示しますが、利用可能なすべてのプロパティの詳細については、リンク先のドキュメントを参照してください。 | プロパティ | 説明 | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | プロダクトのタイトルを表示するには、`product.localizedTitle` を使用します。ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づきます。 | | **Price** | ローカライズされた価格を表示するには、`product.price?.localizedString` を使用します。このローカライズはデバイスのロケール情報に基づきます。`product.price?.amount` を使うと、数値として価格を取得することもできます。値はローカル通貨で提供されます。関連する通貨記号を取得するには、`product.price?.currencySymbol` を使用します。 | | **Subscription Period** | サブスクリプション期間(週・月・年など)を表示するには、`product.subscription?.localizedSubscriptionPeriod` を使用します。このローカライズはデバイスのロケールに基づきます。サブスクリプション期間をプログラムで取得するには、`product.subscription?.subscriptionPeriod` を使用します。ここから `unit` プロパティにアクセスすると、期間の単位(`'day'`・`'week'`・`'month'`・`'year'`・`'unknown'`)を取得できます。`numberOfUnits` の値で期間の単位数を取得できます。たとえば四半期ごとのサブスクリプションの場合、`unit` プロパティは `'month'`、`numberOfUnits` は `3` となります。 | | **Introductory Offer** | サブスクリプションに初回オファーが含まれているかどうかをバッジなどで示すには、`product.subscription?.offer?.phases` プロパティを確認してください。これは最大2つの割引フェーズ(無料トライアルフェーズと初回価格フェーズ)を含むリストです。各フェーズオブジェクトには以下の便利なプロパティがあります:任意
デフォルト: `'reload_revalidating_cache_data'`
|デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。この方式を推奨するのは、ユーザーが常に最新のデータを取得できるためです。
ただし、ユーザーのインターネット接続が不安定だと想定される場合は、`'return_cache_data_else_load'` を使用してキャッシュが存在する場合にキャッシュデータを返すことを検討してください。この場合、ユーザーは必ずしも最新データを取得できるわけではありませんが、接続状況に左右されずに高速な読み込みを体験できます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても安全です。
なお、キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でクリアした場合にのみ消去されます。
|任意
デフォルト: `en`
|[ペイウォールのローカライゼーション](add-remote-config-locale)の識別子。このパラメーターは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよび推奨される使用方法については、[ローカライゼーションとロケールコード](capacitor-localizations-and-locale-codes)を参照してください。
| | **params.fetchPolicy** |任意
デフォルト: `'reload_revalidating_cache_data'`
|デフォルトでは、SDKはサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方法はユーザーが常に最新のデータを取得できるため、推奨しています。
ただし、ユーザーが不安定なインターネット環境を使用していると考えられる場合は、`'return_cache_data_else_load'` を使用してキャッシュデータが存在する場合にそれを返すことを検討してください。この場合、ユーザーが最新のデータを取得できないこともありますが、インターネット接続が不安定であっても、より速い読み込み速度を体験できます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるためにキャッシュを使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリのアンインストールまたは手動でのクリーンアップ時にのみクリアされます。
| | **params.loadTimeoutMs** |任意
デフォルト: 5000 ms
|このメソッドのタイムアウト(ミリ秒)を制限する値です。タイムアウトに達した場合、キャッシュされたデータまたはローカルフォールバックが返されます。
このメソッドは内部で複数のリクエストを行う場合があるため、`loadTimeoutMs` で指定した時間よりもわずかに遅くタイムアウトすることがまれにあります。
| **プロダクトIDをハードコードしないでください。** ハードコードすべきIDはプレースメントIDのみです。ペイウォールはリモートで設定されるため、プロダクトの数や利用可能なオファーはいつでも変わる可能性があります。アプリはこれらの変更を動的に処理する必要があります。たとえば、今日のペイウォールが2つのプロダクトを返し、明日3つを返す場合でも、コードを変更せずにすべて表示できるようにしてください。 レスポンスパラメーター: | パラメータ | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | プロダクトIDのリスト、ペイウォールの識別子、リモートコンフィグ、その他いくつかのプロパティを含む [`AdaptyPaywall`](https://capacitor.adapty.io/interfaces/adaptypaywall) オブジェクト。 | ## プロダクトを取得する \{#fetch-products\} ペイウォールを取得したら、それに対応するプロダクトの配列を取得できます: ```typescript showLineNumbers try { const products = await adapty.getPaywallProducts({ paywall }); // the requested products list } catch (error) { console.error('Failed to fetch products:', error); } ``` レスポンスパラメーター: | パラメータ | 説明 | | :-------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | [`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct) オブジェクトのリスト。プロダクト識別子、プロダクト名、価格、通貨、サブスクリプション期間、その他いくつかのプロパティを含みます。 | 独自のペイウォールデザインを実装する場合、[`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct) オブジェクトの以下のプロパティが必要になります。よく使われるプロパティを以下に示しますが、利用可能なすべてのプロパティの詳細については、リンク先のドキュメントを参照してください。 | プロパティ | 説明 | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **タイトル** | プロダクトのタイトルを表示するには、`product.localizedTitle` を使用します。ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づいて行われます。 | | **価格** | ローカライズされた価格を表示するには、`product.price?.localizedString` を使用します。このローカライズはデバイスのロケール情報に基づいています。`product.price?.amount` を使って数値としての価格にアクセスすることもできます。値はローカル通貨で提供されます。関連する通貨記号を取得するには、`product.price?.currencySymbol` を使用します。 | | **サブスクリプション期間** | 期間(週、月、年など)を表示するには、`product.subscription?.localizedSubscriptionPeriod` を使用します。このローカライズはデバイスのロケールに基づいています。プログラムでサブスクリプション期間を取得するには、`product.subscription?.subscriptionPeriod` を使用します。ここから `unit` プロパティにアクセスして長さ(`'day'`、`'week'`、`'month'`、`'year'`、`'unknown'` のいずれか)を取得できます。`numberOfUnits` の値で期間の単位数を取得できます。たとえば、四半期ごとのサブスクリプションの場合、unit プロパティには `'month'`、numberOfUnits プロパティには `3` が表示されます。 | | **初回オファー** | サブスクリプションに初回オファーが含まれていることを示すバッジやインジケーターを表示するには、`product.subscription?.offer?.phases` プロパティを確認してください。これは最大2つの割引フェーズ(無料トライアルフェーズと初回価格フェーズ)を含むリストです。各フェーズオブジェクトには以下の便利なプロパティがあります:任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子。このパラメータは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよび推奨される使用方法については、[ローカライズとロケールコード](capacitor-localizations-and-locale-codes)を参照してください。
| | **params.fetchPolicy** |任意
デフォルト: `'reload_revalidating_cache_data'`
|デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるようになるため、この設定を推奨します。
ただし、ユーザーが不安定なインターネット環境を利用していると想定される場合は、`'return_cache_data_else_load'` を使用してキャッシュが存在すればそれを返すことを検討してください。この場合、ユーザーが受け取るデータが最新でない可能性がありますが、インターネット接続が不安定な状況でも読み込み速度が向上します。キャッシュは定期的に更新されるため、ネットワークリクエストを減らす目的でセッション中に使用しても安全です。
キャッシュはアプリの再起動後も保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
|任意
デフォルト: `en`
|オンボーディングのローカライズ識別子。マイナス(**-**)で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードと推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)をご覧ください。
| | **params.fetchPolicy** |任意
デフォルト: `'reload_revalidating_cache_data'`
|デフォルトでは、SDK はサーバーからデータを取得しようとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるよう、このオプションを推奨します。
ただし、ユーザーが不安定なインターネット環境を使用している場合は、`'return_cache_data_else_load'` を使用してキャッシュが存在する場合にキャッシュデータを返すことを検討してください。この場合、ユーザーが受け取るデータが最新でないことがありますが、インターネット接続が不安定でも読み込みが速くなります。キャッシュはこまめに更新されるため、セッション中のネットワークリクエスト削減を目的として安心して利用できます。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリアを行った場合にのみ削除されます。
| | **params.loadTimeoutMs** |任意
デフォルト: 5000 ms
|このメソッドのタイムアウト(ミリ秒単位)を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
内部的に複数のリクエストで構成されている場合があるため、まれに `loadTimeoutMs` で指定した時間よりもわずかに遅れてタイムアウトすることがあります。
| レスポンスパラメーター: | パラメーター | 説明 | |:----------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **onboarding** | オンボーディングの識別子と設定、リモートコンフィグ、およびその他のプロパティを含む [`AdaptyOnboarding`](https://capacitor.adapty.io/interfaces/adaptyonboarding) オブジェクト。 | ## デフォルトオーディエンスのオンボーディングでフェッチを高速化する \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} 通常、オンボーディングはほぼ瞬時にフェッチされるため、このプロセスの高速化を気にする必要はありません。ただし、オーディエンスやオンボーディングが多数あり、ユーザーのインターネット接続が不安定な場合、オンボーディングのフェッチに想定以上の時間がかかることがあります。そのような状況では、オンボーディングをまったく表示しないよりも、デフォルトのオンボーディングを表示してスムーズなユーザー体験を提供した方がよいでしょう。 この問題を解決するには、`getOnboardingForDefaultAudience` メソッドを使用できます。このメソッドは、指定したプレースメントの **All Users** オーディエンス向けのオンボーディングを取得します。ただし、推奨されるアプローチは `getOnboarding` メソッドでオンボーディングを取得することであり、詳細は上記の[オンボーディングの取得](#fetch-onboarding)セクションをご覧ください。 :::warning `getOnboardingForDefaultAudience` ではなく `getOnboarding` の使用をご検討ください。前者には重要な制限があります: - **互換性の問題**: 複数のアプリバージョンをサポートする際に問題が生じる可能性があり、後方互換性のある設計が必要になるか、古いバージョンでは正しく表示されない場合があります。 - **パーソナライズなし**: 「すべてのユーザー」オーディエンス向けのコンテンツのみが表示され、国・アトリビューション・カスタム属性によるターゲティングができなくなります。 取得速度の向上がこれらのデメリットを上回る場合は、以下に示す `getOnboardingForDefaultAudience` を使用してください。そうでない場合は、[上記](#fetch-onboarding)で説明した `getOnboarding` を使用してください。 ::: ```typescript showLineNumbers try { const onboarding = await adapty.getOnboardingForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en', params: { fetchPolicy: 'reload_revalidating_cache_data' // Load from server, fallback to cache } }); console.log('Default audience onboarding fetched successfully'); } catch (error) { console.error('Failed to fetch default audience onboarding:', error); } ``` パラメーター: | パラメータ | 必須/任意 | 説明 | |---------|--------|-----------| | **placementId** | 必須 | 対象の[プレースメント](placements)の識別子。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
|オンボーディングのローカライズ識別子。このパラメータは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよびその推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **params.fetchPolicy** |任意
デフォルト: `'reload_revalidating_cache_data'`
|デフォルトでは、SDKはサーバーからデータの読み込みを試み、失敗した場合はキャッシュデータを返します。このオプションを推奨するのは、常に最新のデータをユーザーに提供できるためです。
ただし、ユーザーのインターネット接続が不安定な場合は、`'return_cache_data_else_load'` を使用してキャッシュデータが存在すればそれを返すことを検討してください。この場合、最新のデータが提供されないことがありますが、接続状況に関わらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、セッション中のネットワークリクエストを避けるために安全に使用できます。
なお、キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリア時にのみ削除されます。
| --- # File: capacitor-present-onboardings --- --- title: "Capacitor SDKでオンボーディングを表示する" description: "Capacitor でオンボーディングを表示してコンバージョンと収益を向上させる方法を解説します。" --- :::warning **オンボーディングは SDK v4 で非推奨となり、今後のリリースで削除される予定です。** バグ修正や改善は行われません。代わりに[フロー](capacitor-get-pb-paywalls)を使用してください。オンボーディングは WebView 内で動作しますが、フローはデバイス上でネイティブにレンダリングされるため、よりスムーズなアニメーション、一貫したネイティブな外観、高速な読み込み、WebView ランタイムへの依存がなくなります。始めるには、[フローとペイウォールの取得](capacitor-get-pb-paywalls)および[フローとペイウォールの表示](capacitor-present-paywalls)を参照してください。 ::: ビルダーを使ってオンボーディングをカスタマイズした場合、それをモバイルアプリのコードでレンダリングしてユーザーに表示する必要はありません。このようなオンボーディングには、表示する内容と表示方法の両方が含まれています。 始める前に、以下を確認してください: 1. [オンボーディングを作成](create-onboarding)していること。 2. オンボーディングを[プレースメント](placements)に追加していること。 ## オンボーディングを表示する \{#present-onboarding\} オンボーディングを表示するには、`createOnboardingView` メソッドで作成した `view` に対して `view.present()` メソッドを呼び出します。各 `view` は一度しか使用できません。オンボーディングを再度表示する必要がある場合は、`createOnboardingView` をもう一度呼び出して新しい `view` インスタンスを作成してください。 :::warning `view` を再作成せずに再利用すると、エラーが発生する場合があります。 ::: ```typescript showLineNumbers try { const view = await createOnboardingView(onboarding); view.setEventHandlers({ onClose: (actionId, meta) => { console.log('Onboarding closed:', actionId); return true; // Allow the onboarding to close }, onCustom: (actionId, meta) => { console.log('Custom action:', actionId); return false; // Don't close the onboarding } }); await view.present(); console.log('Onboarding presented successfully'); } catch (error) { console.error('Failed to present onboarding:', error); } ``` ## iOSの表示スタイルを設定する \{#configure-ios-presentation-style\} `present()` メソッドに `iosPresentationStyle` パラメーターを渡すことで、iOSでのオンボーディングの表示方法を設定できます。このパラメーターには `'full_screen'`(デフォルト)または `'page_sheet'` を指定できます。 ```typescript showLineNumbers await view.present({ iosPresentationStyle: 'page_sheet' }); ``` ## オンボーディングでのリンクの開き方をカスタマイズする \{#customize-how-links-open-in-onboardings\} :::important オンボーディングでのリンクの開き方のカスタマイズは、Adapty SDK v3.15 以降でサポートされています。 ::: デフォルトでは、オンボーディング内のリンクはアプリ内ブラウザで開きます。これにより、アプリを切り替えることなくウェブページを表示できるため、シームレスなユーザー体験を提供できます。 外部ブラウザでリンクを開きたい場合は、`openIn` パラメーターを `browser_out_app` に設定することでこの動作をカスタマイズできます。 ```typescript showLineNumbers await view.present({ openIn: 'browser_out_app' }); // default — browser_in_app ``` ## 次のステップ \{#next-steps\} オンボーディングを表示したら、[ユーザーのインタラクションとイベントを処理](capacitor-handling-onboarding-events)しましょう。オンボーディングイベントの処理方法を学んで、ユーザーのアクションに応答し、アナリティクスを追跡してください。 --- # File: capacitor-handling-onboarding-events --- --- title: "Capacitor SDKでオンボーディングイベントを処理する" description: "Adaptyを使用してCapacitorでオンボーディング関連のイベントを処理します。" --- :::warning **オンボーディングはSDK v4で非推奨となり、将来のリリースで削除される予定です。** バグ修正や改善は行われません。代わりに[フロー](capacitor-get-pb-paywalls)をご利用ください。オンボーディングはWebView内で動作しますが、フローはデバイス上でネイティブにレンダリングされるため、よりスムーズなアニメーション、一貫したネイティブな外観、高速な読み込み、WebViewランタイムへの依存がなくなります。まずは[フローとペイウォールの取得](capacitor-get-pb-paywalls)と[フローとペイウォールの表示](capacitor-present-paywalls)をご覧ください。 ::: ビルダーで設定されたオンボーディングは、アプリが応答できるイベントを生成します。スタンドアロンの画面表示でこれらのイベントを処理するには、`setEventHandlers` メソッドを使用してください。 始める前に、以下を確認してください: 1. [オンボーディングを作成](create-onboarding)済みであること。 2. オンボーディングを[プレースメント](placements)に追加済みであること。 ## イベントハンドラーの設定 \{#set-up-event-handlers\} オンボーディングのイベントを処理するには、`view.setEventHandlers` メソッドを使用します。 ```typescript showLineNumbers try { const view = await createOnboardingView(onboarding); view.setEventHandlers({ onAnalytics(event, meta) { console.log('Analytics event:', event); }, onClose(actionId, meta) { console.log('Onboarding closed:', actionId); return true; // Allow the onboarding to close }, onCustom(actionId, meta) { console.log('Custom action:', actionId); return false; // Don't close the onboarding }, onPaywall(actionId, meta) { console.log('Paywall action:', actionId); view.dismiss().then(() => { openPaywall(actionId); }); }, onStateUpdated(action, meta) { console.log('State updated:', action); }, onFinishedLoading(meta) { console.log('Onboarding finished loading'); }, onError(error) { console.error('Onboarding error:', error); }, }); await view.present(); } catch (error) { console.error('Failed to present onboarding:', error); } ``` ## イベントの種類 \{#event-types\} 以下のセクションでは、処理できるさまざまなイベントの種類を説明します。 ### カスタムアクションの処理 \{#handle-custom-actions\} ビルダーでは、ボタンに**カスタム**アクションを追加してIDを割り当てることができます。
その後、このIDをコードで使用し、カスタムアクションとして処理できます。たとえば、ユーザーが **Login** や **Allow notifications** などのカスタムボタンをタップすると、ビルダーの **Action ID** と一致する `actionId` パラメータを持つイベントハンドラが呼び出されます。"allowNotifications" のような独自のIDを作成できます。
```typescript showLineNumbers
view.setEventHandlers({
onCustom(actionId, meta) {
switch (actionId) {
case 'login':
console.log('Login action triggered');
break;
case 'allow_notifications':
console.log('Allow notifications action triggered');
break;
}
return false; // Don't close the onboarding
},
});
```
:::important
ユーザーがオンボーディングを閉じたときの処理は、ご自身で実装する必要があります。たとえば、オンボーディング自体の表示を停止する処理などが必要です。
:::
```typescript showLineNumbers
view.setEventHandlers({
onClose(actionId, meta) {
console.log('Onboarding closed:', actionId);
return true; // Allow the onboarding to close
},
});
```
ユーザーが支払いリクエストをキャンセルしたことを示します。
特に対応は不要ですが、ビジネスロジックの観点から、ユーザーに割引を提示したり、後でリマインドしたりすることができます。
| | paymentInvalid | 3 | 支払いパラメーターのいずれかがストアに認識されなかったことを示します。 | | paymentNotAllowed | 4 |ユーザーが支払いを承認する権限を持っていないことを示します。考えられる原因:
- ユーザーの国では支払いがサポートされていない。
- ユーザーが未成年である。
| | storeProductNotAvailable | 5 | リクエストされたプロダクトが App Store に存在しないことを示します。対象国でプロダクトが利用可能になっているか確認してください。 | | cloudServicePermissionDenied | 6 | ユーザーがクラウドサービス情報へのアクセスを許可していないことを示します。 | | cloudServiceNetworkConnectionFailed | 7 | デバイスがネットワークに接続できなかったことを示します。 | | cloudServiceRevoked | 8 | ユーザーがクラウドサービスの使用許可を取り消したことを示します。 | | privacyAcknowledgementRequired | 9 | ユーザーがストアのプライバシーポリシーにまだ同意していないことを示します。 | | unauthorizedRequestData | 10 | リクエストが正しく構築されていないことを示します。 | | invalidOfferIdentifier | 11 |オファー識別子が無効です。考えられる原因:
- App Store でその識別子のオファーをまだ設定していない。
- オファーを取り消している。
- オファー ID を誤って入力している。
| | invalidSignature | 12 | 支払いディスカウントの署名が無効であることを示します。**In-app purchase Key ID** フィールドに入力し、**In-App Purchase Private Key** ファイルをアップロードしているか確認してください。詳細は [App Store インテグレーションの設定](app-store-connection-configuration) を参照してください。 | | missingOfferParams | 13 |Adapty インテグレーションまたはオファーに問題があることを示します。
設定方法の詳細は [App Store インテグレーションの設定](app-store-connection-configuration) および [オファー](offers) を参照してください。
| | invalidOfferPrice | 14 | ストアで指定した価格が無効になったことを示します。オファーは常に割引価格である必要があります。 | ## カスタム Android コード \{#custom-android-codes\} | エラー | コード | 説明 | |-----|----|-----------| | adaptyNotInitialized | 20 | `Adapty.activate` メソッドで Adapty SDK を正しく設定する必要があります。設定方法は [React Native 向けのガイド](sdk-installation-reactnative) を参照してください。 | | productNotFound | 22 | 購入リクエストされたプロダクトがストアで利用できないことを示します。 | | invalidJson | 23 | ペイウォールの JSON が無効です。Adapty ダッシュボードで修正してください。修正方法の詳細は [リモートコンフィグでペイウォールをカスタマイズする](customize-paywall-with-remote-config) を参照してください。 | | currentSubscriptionToUpdateNotFoundInHistory | 24 | 更新が必要な元のサブスクリプションが見つかりません。 | | pendingPurchase | 25 | 購入状態が「購入済み」ではなく「保留中」であることを示します。詳細は Android デベロッパー ドキュメントの [保留中のトランザクションの処理](https://developer.android.com/google/play/billing/integrate#pending) を参照してください。 | | billingServiceTimeout | 97 | Google Play が応答する前にリクエストが最大タイムアウトに達したことを示します。Play Billing Library の呼び出しで要求されたアクションの実行が遅延した場合などに発生します。 | | featureNotSupported | 98 | リクエストされた機能が現在のデバイスの Play Store でサポートされていません。 | | billingServiceDisconnected | 99 | `BillingClient` 経由でのクライアントアプリと Google Play Store サービスの接続が切断されたことを示す致命的なエラーです。 | | billingServiceUnavailable | 102 | Google Play Billing サービスが現在利用できないことを示す一時的なエラーです。ほとんどの場合、クライアントデバイスと Google Play Billing サービス間のどこかでネットワーク接続に問題があることを意味します。 | | billingUnavailable | 103 |購入プロセス中にユーザーの課金エラーが発生したことを示します。発生する状況の例:
1. ユーザーのデバイスの Play Store アプリが古い。
2. ユーザーがサポート対象外の国にいる。
3. ユーザーがエンタープライズユーザーであり、エンタープライズ管理者が購入を無効にしている。
4. Google Play がユーザーの支払い方法に課金できない(クレジットカードの有効期限切れなど)。
5. ユーザーが Play Store アプリにログインしていない。
| | developerError | 105 | API の使い方が正しくないことを示す致命的なエラーです。 | | billingError | 106 | Google Play 内部の問題を示す致命的なエラーです。 | | itemAlreadyOwned | 107 | 消耗型アイテムがすでに購入済みです。 | | itemNotOwned | 108 | アイテムに対してリクエストされたアクションが失敗したことを示します。 | ## カスタム StoreKit コード \{#custom-storekit-codes\} | エラー | コード | 説明 | |-----|----|-----------| | noProductIDsFound | 1000 |ペイウォール内のプロダクトがいずれもストアで利用できないことを示します。
このエラーが発生した場合は、以下の手順で解決してください:
1. すべてのプロダクトが Adapty ダッシュボードに追加されているか確認する。
2. アプリの Bundle ID が Apple Connect のものと一致しているか確認する。
3. アプリストアのプロダクト識別子がダッシュボードに追加したものと一致しているか確認する。識別子にはストアにすでに含まれている場合を除き、Bundle ID を含めないこと。
4. Apple の税務設定でアプリの有料ステータスがアクティブになっているか確認する。税務情報が最新であり、証明書が有効であることを確認する。
5. アプリに銀行口座が紐付けられており、収益化の対象になっているか確認する。
6. プロダクトがすべての地域で利用可能になっているか確認する。また、プロダクトのステータスが **"Ready to Submit"** になっていることを確認する。
| | productRequestFailed | 1002 |現時点で利用可能なプロダクトを取得できません。考えられる原因:
- キャッシュがまだ作成されておらず、同時にインターネット接続もない。
| | cantMakePayments | 1003 | このデバイスではアプリ内課金が許可されていません。 | | noPurchasesToRestore | 1004 | Google Play が復元対象の購入を見つけられなかったことを示します。 | | cantReadReceipt | 1005 |デバイス上に有効なレシートがありません。サンドボックステスト中に発生することがあります。
特に対応は不要ですが、ビジネスロジックの観点から、ユーザーに割引を提示したり、後でリマインドしたりすることができます。
| | productPurchaseFailed | 1006 | プロダクトの購入に失敗しました。このエラーは内部の StoreKit エラーをラップしています。実際の原因を確認するには、ラップされたエラーを読み取るか(または詳細ログを有効にしてコンソールで確認)してください。ラップされたエラーは通常、上記の StoreKit コード 0〜14 のいずれかで、最も多いのは `paymentCancelled`、`paymentInvalid`、`paymentNotAllowed`、`invalidOfferPrice` です。原因が特定できない場合は、新しい[サンドボックスプロファイル](test-purchases-in-sandbox)でお試しください。それでも解決しない場合は Apple サポートにお問い合わせください。 | | refreshReceiptFailed | 1010 | レシートが受信されなかったことを示します。StoreKit 1 のみ対象です。 | | receiveRestoredTransactionsFailed | 1011 | 購入の復元に失敗しました。 | ## カスタムネットワークコード \{#custom-network-codes\} | エラー | コード | 説明 | | :------------------- | :--- | :----------------------------------------------------------- | | notActivated | 2002 | `Adapty.activate` メソッドで Adapty SDK を正しく設定する必要があります。設定方法は [React Native 向けのガイド](sdk-installation-reactnative) を参照してください。 | | badRequest | 2003 | リクエストが不正です。 | | serverError | 2004 | サーバーエラーです。 | | networkFailed | 2005 | ネットワークリクエストに失敗しました。 | | decodingFailed | 2006 | レスポンスのデコードに失敗したことを示します。 | | encodingFailed | 2009 | リクエストのエンコードに失敗したことを示します。 | | analyticsDisabled | 3000 | アナリティクスをオプトアウトしているため、アナリティクスイベントを処理できません。詳細は [アナリティクスインテグレーション](analytics-integration) を参照してください。 | | wrongParam | 3001 | パラメーターの一部が正しくないことを示します(空白にできない箇所が空白になっている、型が違うなど)。 | | activateOnceError | 3005 | `.activate` メソッドを複数回呼び出すことはできません。 | | profileWasChanged | 3006 | 操作中にユーザープロファイルが変更されました。 | | fetchTimeoutError | 3101 | 設定された制限時間内にペイウォールを取得できなかったことを示します。この状況を回避するには、[ローカルフォールバックを設定](fetch-paywalls-and-products)してください。 | | operationInterrupted | 9000 | この操作はシステムによって中断されました。 | --- # File: capacitor-sdk-migration-guides --- --- title: "Capacitor SDK マイグレーションガイド" description: "Adapty Capacitor SDK バージョンのマイグレーションガイド。" --- このページには、Adapty Capacitor SDK のすべてのマイグレーションガイドが含まれています。詳細な手順については、移行先のバージョンを選択してください: - **[v4.0(ベータ版)へ移行](migration-to-capacitor-sdk-v4)** - [**v3.16 へ移行**](migration-to-capacitor-316) --- # File: migration-to-capacitor-sdk-v4 --- --- title: "Adapty Capacitor SDK を v. 4.0 へ移行する" description: "ペイウォール API をフロー API に置き換えて Adapty Capacitor SDK v4.0 (beta) へ移行します。Flow Builder と Paywall Builder の両方に対応しています。" --- Adapty Capacitor SDK 4.0 (beta) ではフローが導入され、それに伴いペイウォール API の名称が変更されました。新しい API は新しい Flow Builder と既存の Paywall Builder の両方で動作します。Adapty ダッシュボード側の設定変更は不要です。 ## クイックリファレンス \{#quick-reference\} | v3 | v4 | |---|---| | `adapty.getPaywall({ placementId, locale?, params? })` | `adapty.getFlow({ placementId, params? })` | | `adapty.getPaywallForDefaultAudience({ placementId, locale?, params? })` | `adapty.getFlowForDefaultAudience({ placementId, params? })` | | `adapty.getPaywallProducts({ paywall })` | `adapty.getPaywallProducts({ flow })` | | `adapty.logShowPaywall({ paywall })` | `adapty.logShowFlow({ flow })` | | `AdaptyPaywall`(型) | `AdaptyFlow` + `AdaptyFlowPaywall` | | `createPaywallView(paywall, params?)` | `createFlowView(flow, params?)` | | `PaywallViewController` | `FlowViewController` | | `EventHandlers`(型) | `FlowEventHandlers` | | `CreatePaywallViewParamsInput` | `CreateFlowViewParamsInput` | | `onRenderingFailed` | `onError` | `AdaptyPaywallProduct` はその名前を維持します — プロダクトは引き続きフローに属し、`getPaywallProducts` も名前を維持したまま、`AdaptyFlow` を受け取るようになります。`getFlow` および `getFlowForDefaultAudience` メソッドは `locale` パラメータを受け取らなくなりました。購入とプロファイルに関するAPI(`makePurchase`、`restorePurchases`、`getProfile`、`identify`、`updateProfile`)、および `setFallback` によるフォールバックは変更ありません。ビューメソッド `present`、`dismiss`、`setEventHandlers`、`showDialog`、およびイベントハンドラ `onCloseButtonPress`、`onUrlPress`、`onCustomAction`、`onProductSelected`、`onPurchaseStarted`、`onPurchaseCompleted`、`onPurchaseFailed`、`onRestoreStarted`、`onRestoreCompleted`、`onRestoreFailed`、`onLoadingProductsFailed`、`onWebPaymentNavigationFinished`、`onAndroidSystemBack` は v3 と同じ名前を維持します。オンボーディングメソッドは引き続き動作しますが、非推奨となっています — 詳しくは[オンボーディング API の非推奨化](#onboarding-api-deprecation)を参照してください。一部のデフォルト動作が変更されています — 詳しくは[デフォルト動作の変更点](#default-behavior-changes)を参照してください。 ## 最小バージョン \{#minimum-versions\} ランタイムの要件はv3.16+から変わらず、**iOS 15.0**、**Android minSdk 24**、**Capacitor 8**です。デプロイターゲットの変更は不要です。 新たなビルド要件が1つあります:**Xcode 26以降** — このリリースに同梱されているネイティブAdapty iOS SDK 4.0.0-beta.2はSwift tools 6.2を使用しています。 v4にはネイティブAdapty SDK iOS 4.0.0-beta.2およびAndroid BOM 4.0.0-beta.1が含まれています。 ## インストール \{#installation\} ### パッケージを更新する \{#update-the-package\} v4.0 はプレリリースのため、npm がキャレット/チルダ範囲でプレリリースバージョンを選択しないよう、正確なバージョンを指定してください: ```bash showLineNumbers npm install @adapty/capacitor@4.0.0-beta.2 ``` 次に、ネイティブプロジェクトを同期します: ```bash showLineNumbers npx cap sync ``` ### iOS: Swift Package Manager のみ \{#ios-swift-package-manager-only\} [CocoaPods の spec リポジトリは 2026 年 12 月に読み取り専用になります](https://blog.cocoapods.org/CocoaPods-Specs-Repo/)。そのため、v4 以降は `AdaptyCapacitor.podspec` が削除され、iOS への SDK インストールは **Swift Package Manager (SPM) のみ**対応となります。アプリの iOS プロジェクトで Capacitor の SPM 連携を使用する必要があります。 - 新規アプリの場合: SPM パッケージマネージャーを指定して iOS プラットフォームを追加します。 ```bash showLineNumbers npx cap add ios --packagemanager SPM ``` - CocoaPods を使用している既存アプリの場合: [既存プロジェクトで SPM を使用するための Capacitor ガイド](https://capacitorjs.com/docs/ios/spm#using-spm-in-an-existing-capacitor-project)に従って iOS プロジェクトを移行してください。 完全なセットアップ手順については、[SDK のインストール](sdk-installation-capacitor)をご覧ください。 ## フローの取得 \{#fetching-flows\} ### getPaywall → getFlow 返り値の型が `AdaptyPaywall` から `AdaptyFlow` に変わり、`locale` オプションが削除されました。フローをレンダリングする際、ロケールは自動的に解決されます。カスタムペイウォールの場合、すべてのロケールは `flow.remoteConfigs` に含まれます: ```diff showLineNumbers - const paywall = await adapty.getPaywall({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en' }); + const flow = await adapty.getFlow({ placementId: 'YOUR_PLACEMENT_ID' }); ``` `getPaywallForDefaultAudience` も同様にリネームされています: ```diff showLineNumbers - const paywall = await adapty.getPaywallForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en' }); + const flow = await adapty.getFlowForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID' }); ``` ### getPaywallProducts(paywall) → getPaywallProducts(flow) `getPaywallProducts` は名前を維持しますが、`AdaptyFlow` を受け取るようになります: ```diff showLineNumbers - const products = await adapty.getPaywallProducts({ paywall }); + const products = await adapty.getPaywallProducts({ flow }); ``` ## データモデル \{#data-model\} `getFlow` は `AdaptyPaywall` の代わりに `AdaptyFlow` を返し、オブジェクトの形状が変更されました。 | v3 `AdaptyPaywall` フィールド | v4 `AdaptyFlow` フィールド | 操作 | |---|---|---| | `remoteConfig?`(単一) | `remoteConfigs?: AdaptyRemoteConfig[]`(配列) | フローは設定された言語ごとにリモートコンフィグを1つ持ちます。ユーザーに合致するものを取得してください:`flow.remoteConfigs?.find((c) => c.lang === 'en')`。 | | `products` | `flow.paywalls[i].productIdentifiers` | プロダクト識別子は、フロー自体ではなく各フローバリアントに移動しました。 | | `webPurchaseUrl?` | `flow.paywalls[i].webPurchaseUrl` | フローから各ペイウォールバリアントに移動しました。 | | `version?: number` | `flowVersionId?: string` | リネームされ、型が `number` から `string` に変更されました。 | | `hasViewConfiguration` | 削除 | コードから `hasViewConfiguration` のチェックをすべて削除してください — `createFlowView` が代わりにスローするようになりました([フローの表示](#displaying-flows)を参照)。 | | `requestLocale` | 削除 | ロケールはモデルの一部ではなくなりました。 | | _(新規)_ | `paywalls: AdaptyFlowPaywall[]` | 各エントリはフロー内のペイウォールバリアント1つを表します。 | | _(新規)_ | `responseCreatedAt: number` | サーバーレスポンスのタイムスタンプ(ミリ秒単位)。 | `hasViewConfiguration` と `requestLocale` は `AdaptyOnboarding` に残ります — フローモデルからのみ削除されます。 プロダクト識別子はフローから各バリアントに移動しました: ```diff showLineNumbers - const ids = paywall.products; + const ids = flow.paywalls[0].productIdentifiers; ``` ## Web ペイウォールのメソッド \{#web-paywall-methods\} `openWebPaywall` と `createWebPaywallUrl` は名前が変わらず、`paywallOrProduct` オプションに渡す型が `AdaptyPaywall` から `AdaptyFlowPaywall`(フローのバリアント)になります。`AdaptyPaywallProduct` は引き続き渡せます。最初のエントリを読み取る前に `flow.paywalls` が空でないことを確認してください。 ```diff showLineNumbers const flow = await adapty.getFlow({ placementId: 'YOUR_PLACEMENT_ID' }); - await adapty.openWebPaywall({ paywallOrProduct: paywall }); + await adapty.openWebPaywall({ paywallOrProduct: flow.paywalls[0] }); ``` ## フローのビュー数を追跡する \{#tracking-flow-views\} ### logShowPaywall → logShowFlow `logShowPaywall` は `logShowFlow` に名称変更され、`AdaptyFlow` を受け取るようになりました。イベントは引き続き同じバリエーションに対して記録されるため、既存のファネルや A/B テストの指標はダッシュボードを変更することなく機能し続けます。 ```diff showLineNumbers - await adapty.logShowPaywall({ paywall }); + await adapty.logShowFlow({ flow }); ``` v3 と同様に、[フロービルダー](adapty-flow-builder) または [ペイウォールビルダー](adapty-paywall-builder) でレンダリングされたフローやペイウォールを表示する際には、このメソッドを呼び出す必要はありません — Adapty がそれらのビューを自動的に追跡します。 ## フローの表示 \{#displaying-flows\} ### createPaywallView → createFlowView ファクトリー関数名を変更し、`AdaptyFlow` を渡します。返されるコントローラーは `PaywallViewController` から `FlowViewController` に改名されましたが、そのメソッド(`present`、`dismiss`、`setEventHandlers`、`showDialog`)は変わりません。パラメーターの型は `CreatePaywallViewParamsInput` から `CreateFlowViewParamsInput` に改名されました: ```diff showLineNumbers - import { createPaywallView } from '@adapty/capacitor'; + import { createFlowView } from '@adapty/capacitor'; - const view = await createPaywallView(paywall); + const view = await createFlowView(flow); await view.present(); ``` `createFlowView` はビューが設定されていないフローの場合に `AdaptyError` をスローします — これは v3 の `hasViewConfiguration` チェックを置き換えるものです: ```diff showLineNumbers - if (paywall.hasViewConfiguration) { - const view = await createPaywallView(paywall); - await view.present(); - } + try { + const view = await createFlowView(flow); + await view.present(); + } catch (error) { + // the flow has no view configured, or view creation failed + } ``` :::note フロービューは使い捨てです。`dismiss()` を呼び出すとビューは破棄されてイベントハンドラーもクリアされるため、フローを再度表示するには `createFlowView` を呼び出し直してください。 ::: ### Android のセーフエリアパディング \{#android-safe-area-paddings\} `CreateFlowViewParamsInput` に新しいパラメーター `enableSafeArea` が追加されました。このパラメーターは Android のセーフエリアパディングを実行時に制御します。`android` キーの下にネストされており、デフォルト値は `true` です。 ```typescript showLineNumbers const view = await createFlowView(flow, { android: { enableSafeArea: true }, }); ``` ## イベントの処理 \{#handling-events\} イベントハンドラーのインターフェース名が `EventHandlers` から `FlowEventHandlers` に変更され、コールバックが1つ改名されました。既存のハンドラー本体はコードの変更不要です。名前だけ変えてください: ```diff showLineNumbers - onRenderingFailed: (error) => { /* … */ }, + onError: (error) => { /* … */ }, ``` 他のすべてのイベントハンドラーはそのまま名前が変わりません。ただし、2つのハンドラーには第2引数が追加されています。`onPurchaseCompleted` は `(purchaseResult, product)`、`onPurchaseFailed` は `(error, product)` となり、`product` は関連する `AdaptyPaywallProduct` です。詳細は[フロー&ペイウォールイベントの処理](capacitor-handling-events)を参照してください。 v4 では、オプトインで使用できる機能もいくつか追加されています。 - `adapty.openWebUrl({ url, openIn })` と `adapty.requestAppReview()` メソッド — これらはデフォルトの `onUrlPress` および `onRequestAppReview` ハンドラーをバックアップするもので、URLやアプリレビューのプロンプトはそのままネイティブで処理されます。これらのハンドラーをオーバーライドする場合にのみ、直接呼び出してください。 - オブザーバーモードでのフロー内購入処理は、新しい `onObserverPurchaseInitiated` / `onObserverRestoreInitiated` ハンドラーを使用します。詳しくは[オブザーバーモードでフローを表示する](capacitor-present-flows-in-observer-mode)を参照してください。 ## デフォルト動作の変更 \{#default-behavior-changes\} これらの変更はコンパイルエラーを引き起こさないため、実行時にテストしてください: - **`onAndroidSystemBack`**: デフォルトの動作が、ビューを閉じる動作から開いたままにする動作に変更されました。以前の動作に戻すには、ハンドラーから `true` を返してください。 - **`onPurchaseCompleted`**: デフォルトの動作が、ビューを閉じる動作(ユーザーが購入をキャンセルした場合を除く)から、常に開いたままにする動作に変更されました。以前の動作に戻すには、ハンドラーから `purchaseResult.type !== 'user_cancelled'` を返してください。 - **`onRestoreCompleted`**: デフォルトの動作が、復元成功後にビューを閉じる動作から開いたままにする動作に変更されました。以前の動作に戻すには、ハンドラーから `true` を返してください。 - **`onUrlPress`**: デフォルトでネイティブレイヤーを通じてURLを開くようになり、ダッシュボードのアプリ内ブラウザまたは外部ブラウザの設定が反映されます。URLを独自に開く場合は、ハンドラーをオーバーライドしてください。 - **ビューは使い捨て**: `dismiss()` を呼び出すと、ビューは破棄されます。フローを再度表示するには、`createFlowView` を再度呼び出してください。 ## 削除された API \{#removed-apis\} ### 削除されたエクスポート \{#removed-exports\} 以下のシンボルは `@adapty/capacitor` からエクスポートされなくなりました。これらのインポートを削除してください: - **`AdaptyPaywall`**: 代わりに `AdaptyFlow` および `AdaptyFlowPaywall` を使用してください。 - **`ProductReference`**: 代わりに `AdaptyProductIdentifier` を使用してください。`flow.paywalls[i].productIdentifiers` から読み取ります。 - **`AdaptyPaywallBuilder`**: 削除されました。フローとペイウォールはネイティブでレンダリングされます。 - **`AdaptyAndroidSubscriptionUpdateParameters`**: ネストされた `android` 購入パラメータの形式を使用してください(下記参照)。 ### activate: lockMethodsUntilReady `lockMethodsUntilReady`(v3 ではすでに非推奨の no-op でした)は削除されました。`activate` の呼び出しから削除してください — そのままではコンパイルが通りません: ```diff showLineNumbers - await adapty.activate({ apiKey: 'PUBLIC_SDK_KEY', params: { lockMethodsUntilReady: true } }); + await adapty.activate({ apiKey: 'PUBLIC_SDK_KEY' }); ``` ### makePurchase: Android パラメーター \{#makepurchase-android-parameters\} 非推奨となっていた `MakePurchaseParamsInput` のフラットな Android 形式は削除されました。ネストされた形式のみが使用可能です。Android の購入パラメーターは `params: { android: { ... } }` に移動してください。完全な例については[購入の実装](capacitor-making-purchases)を参照してください。 ## オンボーディング API の非推奨化 \{#onboarding-api-deprecation\} 従来のオンボーディング API は v4.0 で非推奨となり、[Flow Builder](adapty-flow-builder) に置き換えられました。現在も動作しますが、将来のリリースで削除される予定です。オンボーディングを Flow Builder へ移行する計画を立ててください。 非推奨のシンボル: `getOnboarding`、`getOnboardingForDefaultAudience`、`createOnboardingView`、および `OnboardingViewController`。 --- # File: migration-to-capacitor-316 --- --- title: "Adapty Capacitor SDK を v3.16 に移行する" description: "より良いパフォーマンスと新しいマネタイズ機能のために Adapty Capacitor SDK v3.16 に移行します。" --- Adapty SDK v3.16.0 以降、Capacitor 8 が必要です。Capacitor 7 を使用する場合は、Adapty SDK v3.15 をご利用ください。 Capacitor SDK v3.16 にアップグレードするには、プロジェクトが Capacitor 8 を使用していることを確認してください。まだ Capacitor 7 を使用している場合は、次の 2 つの選択肢があります。 1. **Capacitor 8 にアップグレードする**: [公式 Capacitor 移行ガイド](https://capacitorjs.com/docs/updating/8-0)に従ってプロジェクトを更新し、Adapty SDK v3.16 をインストールします。 2. **Adapty SDK v3.15 を使い続ける**: Capacitor 8 へのアップグレードが難しい場合は、Capacitor 7 をサポートする Adapty SDK v3.15 を引き続き使用してください。 --- # End of Documentation _Generated on: 2026-07-24T13:00:57.636Z_ _Successfully processed: 45/45 files_ # FLUTTER - Adapty Documentation (Full Content) This file contains the complete content of all documentation pages for this platform. Locale: ja Generated on: 2026-07-24T13:00:57.638Z Total files: 44 --- # File: sdk-installation-flutter --- --- 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+ が必要です。 Adapty Flutter SDK 4.0 — [フロービルダー](adapty-flow-builder)サポートを追加 — の最低要件は **iOS 15.0+**、**Xcode 26+**、**Flutter 3.32.0+**(Dart 3.8.0+)に引き上げられました。インストールの詳細については、以下の [Adapty SDK 4.0](#adapty-sdk-40-swift-package-manager) を参照してください。 :::info Adapty は Google Play Billing Library 8.x までに対応しています。デフォルトでは Adapty は Google Play Billing Library v7.0.0 で動作しますが、より新しいバージョンを使用したい場合は、手動で[依存関係を追加](https://developer.android.com/google/play/billing/integrate#dependency)できます。 ::: :::info SDKのインストールは、Adaptyセットアップのステップ5です。アプリ内で課金が機能するようにするには、アプリをストアに接続し、Adapty ダッシュボードでプロダクト、ペイウォール、プレースメントを作成する必要があります。[クイックスタートガイド](quickstart)では、必要なすべての手順を説明しています。 ::: ## Adapty SDK のインストール \{#install-adapty-sdk\} [](https://github.com/adaptyteam/AdaptySDK-Flutter/releases) :::important 以下の手順では最新の安定版 SDK(3.x)をインストールします。[フロービルダー](adapty-flow-builder)に必要で[クイックスタート](flutter-quickstart-paywalls)で使用される v4 が必要な場合は、代わりに下の [Adapty SDK 4.0: Swift Package Manager](#adapty-sdk-40-swift-package-manager) の手順に従ってください。 ::: 1. `pubspec.yaml` ファイルに Adapty を追加します: ```yaml showLineNumbers title="pubspec.yaml" dependencies: adapty_flutter: ^
### ログイン・サインアップ時 \{#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テストの実施や異なるユーザーへの異なるペイウォール表示を可能にする
---
# File: adapty-sdk-integration-skill-flutter
---
---
title: "SDK統合スキルを使ってFlutterアプリにAdaptyを導入する"
description: "adapty-sdk-integrationスキルを使って、AIコーディングツールでFlutterアプリにAdapty SDKをエンドツーエンドで統合します。"
---
:::important
このスキルはベータ版です。処理が止まったり予期しない動作をした場合は、[ステップバイステップの統合ガイド](adapty-cursor-flutter)を参照してください。AIツールが各ステップを正しいドキュメントに沿って進められるよう案内しています。
:::
[adapty-sdk-integration スキル](https://github.com/adaptyteam/adapty-sdk-integration-skill)は、Adapty のインテグレーションをエンドツーエンドで自動化します。ダッシュボードのセットアップ、SDK のインストール、ペイウォール、各ステージの検証まで対応しています。プラットフォームを自動検出し、各ステージで関連する Adapty ドキュメントを取得します。
**対応ツール**: Claude Code、GitHub Copilot CLI、OpenAI Codex、Gemini CLI。
インストールするには、お使いのツールに対応したフォームを選択してください。全リストは[スキルの README](https://github.com/adaptyteam/adapty-sdk-integration-skill) にあります。
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex またはその他のツール** — [skills CLI](https://skills.sh) を使用してください(この方法でインストールしたスキルは自動更新されません):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
または、リポジトリをクローンして `skills/adapty-sdk-integration/` をお使いのツールのスキルディレクトリにコピーしてください。
インストール後、プロジェクトでスキルを実行します:
```
/adapty-sdk-integration
```
スキルがいくつかのセットアップに関する質問をした後、ダッシュボードのセットアップ、SDK のインストール、ペイウォール、検証の手順を案内します。
---
# File: adapty-cursor-flutter
---
---
title: "AIアシスタントを使ってAdaptyをFlutterアプリに統合する"
description: "Cursor、Context7、ChatGPT、Claude、その他のAIツールを使ってAdaptyをFlutterアプリに統合するステップバイステップガイド。"
---
このガイドでは、AIコーディングツールを使ってAdaptyをFlutterアプリにステップバイステップで統合する方法を説明します。適切なAdaptyドキュメントを正しい順序でAIに渡していきます。
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## 始める前に:ダッシュボードの設定 \{#before-you-start-dashboard-setup\}
AdaptyはSDKのコードを書く前に、ダッシュボードでいくつかの設定が必要です。インタラクティブなLLMスキルを使うか、ダッシュボードで手動設定するかを選べます。
### スキルを使う方法(推奨) \{#skill-approach-recommended\}
Adapty CLIスキルを使うと、LLMがダッシュボードを開かずに直接アプリ、プロダクト、アクセスレベル、ペイウォール、プレースメントを設定できます。必要なのは、ダッシュボードで[ストアを接続する](integrate-payments)ことだけです。
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
スキルを追加したら、エージェントで `/adapty-cli` を実行します。ダッシュボードでストアを接続するタイミングも含め、各ステップをガイドしてくれます。
### ダッシュボードを使う方法 \{#dashboard-approach\}
手動で設定したい場合は、コードを書く前に以下の手順を完了させてください。ダッシュボードの値はLLMが調べることはできないため、自分で用意する必要があります。
1. **ストアを接続する**: Adapty ダッシュボードで **App settings → General** に移動します。FlutterアプリがiOSとAndroidの両方を対象としている場合は、App StoreとGoogle Playの両方を接続してください。購入機能を動作させるために必要です。
[ストアを接続する](integrate-payments)
2. **Public SDKキーをコピーする**: Adapty ダッシュボードで **App settings → General** に移動し、**API keys** セクションを確認します。コードでは、このキーをAdapty設定に渡します。
3. **プロダクトを1つ以上作成する**: Adapty ダッシュボードで **Products** ページに移動します。コードでプロダクトを直接参照することはなく、Adaptyはペイウォールごしにプロダクトをデリバリーします。
[プロダクトを追加する](quickstart-products)
4. **ペイウォールとプレースメントを作成する**: Adapty ダッシュボードで **Paywalls** ページにペイウォールを作成し、**Placements** ページでプレースメントに割り当てます。コードでは、プレースメントIDを `Adapty().getPaywall()` に渡す文字列として使います。
[ペイウォールを作成する](quickstart-paywalls)
5. **アクセスレベルを設定する**: Adapty ダッシュボードの **Products** ページでプロダクトごとに設定します。コードでは `profile.accessLevels['premium']?.isActive` でチェックする文字列です。デフォルトの `premium` アクセスレベルはほとんどのアプリで使えます。プロダクトによって利用できる機能が異なる場合(たとえば `basic` プランと `pro` プラン)は、コーディングを始める前に[追加のアクセスレベルを作成](assigning-access-level-to-a-product)してください。
:::tip
この5つが揃えばコードを書く準備は完了です。LLMに「Public SDKキーはX、プレースメントIDはY」と伝えることで、正確な初期化とペイウォール取得コードを生成してもらえます。
:::
### 準備ができたら設定するもの \{#set-up-when-ready\}
これらはコーディングを始めるために必須ではありませんが、統合が進むにつれて必要になります。
- **A/Bテスト**: **Placements** ページで設定します。コードの変更は不要です。
[A/Bテスト](ab-tests)
- **追加のペイウォールとプレースメント**: 異なるプレースメントIDで `getPaywall` の呼び出しを追加します。
- **アナリティクス統合**: **Integrations** ページで設定します。統合によって手順が異なります。[アナリティクス統合](analytics-integration)および[アトリビューション統合](attribution-integration)を参照してください。
## AdaptyドキュメントをLLMに渡す \{#feed-adapty-docs-to-your-llm\}
### Context7を使う(推奨) \{#use-context7-recommended\}
[Context7](https://context7.com)は、LLMに最新のAdaptyドキュメントへの直接アクセスを提供するMCPサーバーです。質問内容に応じて適切なドキュメントをLLMが自動的に取得するため、URLを手動でペーストする必要はありません。
Context7は**Cursor**、**Claude Code**、**Windsurf**、その他のMCP対応ツールで動作します。セットアップするには次を実行します。
```
npx ctx7 setup
```
これにより、エディタを自動検出してContext7サーバーを設定します。手動でのセットアップは[Context7 GitHubリポジトリ](https://github.com/upstash/context7)を参照してください。
設定が完了したら、プロンプトでAdaptyライブラリを参照します。
```
Use the adaptyteam/adapty-docs library to look up how to install the Flutter SDK
```
:::warning
Context7を使えばドキュメントリンクを手動でペーストする必要はなくなりますが、実装の順序は重要です。すべてが正しく動作するよう、以下の[実装ウォークスルー](#implementation-walkthrough)をステップごとに進めてください。
:::
### プレーンテキストのドキュメントを使う \{#use-plain-text-docs\}
AdaptyのドキュメントはプレーンテキストのMarkdownとして取得できます。URLの末尾に `.md` を追加するか、記事タイトルの下にある **Copy for LLM** をクリックしてください。例: [adapty-cursor-flutter.md](https://adapty.io/docs/ja/adapty-cursor-flutter.md)
以下の[実装ウォークスルー](#implementation-walkthrough)の各ステージには「LLMに送る」ブロックがあり、ペーストできる `.md` リンクが含まれています。
まとめて多くのドキュメントが必要な場合は、以下の[インデックスファイルとプラットフォーム別サブセット](#plain-text-doc-index-files)を参照してください。
## 実装ウォークスルー \{#implementation-walkthrough\}
このガイドの残りの部分では、実装の順序でAdaptyの統合を進めます。各ステージには、LLMに送るドキュメント、完了時に確認できること、よくある問題が含まれています。
### 統合の計画を立てる \{#plan-your-integration\}
コードを書き始める前に、LLMにプロジェクトを分析させて実装計画を作成してもらいましょう。AIツールに計画モード(CursorやClaude Codeのプランモードなど)がある場合は活用してください。コードを書く前にLLMがプロジェクト構造とAdaptyドキュメントの両方を読めます。
購入に使うアプローチをLLMに伝えてください。これにより、参照するガイドが変わります。
- [**Adapty ペイウォールビルダー**](adapty-paywall-builder): Adaptyのノーコードビルダーでペイウォールを作成し、SDKが自動的にレンダリングします。
- [**手動作成のペイウォール**](flutter-making-purchases): 独自のペイウォールUIをコードで構築しつつ、プロダクトの取得と購入処理にAdaptyを使います。
- [**オブザーバーモード**](observer-vs-full-mode): 既存の購入インフラをそのまま使い、アナリティクスと統合にのみAdaptyを使います。
どれを選べばよいかわからない場合は、[クイックスタートの比較表](flutter-quickstart-paywalls)を参照してください。
### SDKのインストールと設定 \{#install-and-configure-the-sdk\}
`flutter pub add` でAdapty SDKの依存関係を追加し、Public SDKキーで有効化します。これが基盤となり、ここなしには何も動きません。
**ガイド:** [Adapty SDKのインストールと設定](sdk-installation-flutter)
LLMに送る内容:
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/ja/sdk-installation-flutter.md
```
:::tip[チェックポイント]
- **期待される結果:** アプリがiOSとAndroidの両方でビルド・起動する。デバッグコンソールにAdaptyのアクティベーションログが表示される。
- **注意点:** 「Public API key is missing」→ プレースホルダーをApp settingsの実際のキーに置き換えたか確認する。
:::
### ペイウォールの表示と購入の処理 \{#show-paywalls-and-handle-purchases\}
プレースメントIDでペイウォールを取得し、表示して、購入イベントを処理します。必要なガイドは購入の処理方法によって異なります。
進める中でサンドボックスでの購入テストを都度行ってください。最後まで待たないようにしましょう。設定手順は[サンドボックスで購入テストする](test-purchases-in-sandbox)を参照してください。
デフォルトでは、SDK はサーバーからデータの取得を試み、失敗した場合はキャッシュされたデータを返します。この方式を推奨しているのは、常に最新のデータをユーザーに届けられるためです。
ただし、ユーザーが不安定なインターネット環境を利用していると考えられる場合は、`.returnCacheDataElseLoad` を使用することを検討してください。キャッシュが存在する場合はそちらを返す方式です。この場合、ユーザーが最新データを受け取れないことがありますが、通信状況が不安定でも高速に読み込めます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける目的で使用しても安全です。
なお、キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はペイウォールを2つの層でローカルに保存しています。上述の定期更新されるキャッシュと、[フォールバックペイウォール](fallback-paywalls)です。また、ペイウォールをより高速に取得するために CDN を使用し、CDN に接続できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンのペイウォールを提供できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウトを制限する `Duration`。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。
なお、内部で複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間よりもわずかに遅れてタイムアウトすることがあります。
| レスポンスパラメータ: | パラメーター | 説明 | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Flow | フローの識別子(`instanceIdentity`、`variationId`)、名前、プレースメント、ペイウォールのバリアント(`paywalls`)、リモートコンフィグ(`remoteConfigs`)を含む `AdaptyFlow` オブジェクト。 | ## ビューの設定を取得する \{#fetch-the-view-configuration\} :::important ビルダーで **Show on device** トグルを有効にしてください。このオプションがオンになっていない場合、ビューの設定を取得できません。 ::: プレースメントが **Flow Builder** または **Paywall Builder** で設計されている場合、Adapty が UI をレンダリングします — 取得したフローの `hasViewConfiguration` プロパティが `true` になります。`createFlowView` でビューを作成し、[フローまたはペイウォールを表示](flutter-present-paywalls)してください。プレースメントがビルダー UI のないカスタムペイウォール(`hasViewConfiguration` が `false`)の場合は、代わりに[リモートコンフィグペイウォールとして処理](present-remote-config-paywalls-flutter)してください。 :::warning `createFlowView` メソッドの結果は一度しか表示できません。再度表示する必要がある場合は、`createFlowView` メソッドを新たに呼び出してください。 ::: ```dart showLineNumbers try { final view = await AdaptyUI().createFlowView(flow: flow); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` パラメーター: | パラメータ | 必須/任意 | 説明 | | :------------------- | :------- | :----------------------------------------------------------- | | **flow** | 必須 | 対象のフロー/ペイウォールのビューを取得するための `AdaptyFlow` オブジェクト。 | | **customTags** | 任意 | カスタムタグとその解決済みの値のマップを定義します。カスタムタグはコンテンツ内のプレースホルダーとして機能し、フロー/ペイウォール内でパーソナライズされたコンテンツを提供するために特定の文字列に動的に置き換えられます。詳細については、[ペイウォールビルダーのカスタムタグ](custom-tags-in-paywall-builder)を参照してください。 | | **preloadProducts** | 任意 | 画面上のプロダクト表示タイミングを最適化するために有効にします。`true` の場合、AdaptyUI は必要なプロダクトを自動的に取得します。デフォルト: `false`。 | | **loadTimeout** | 任意 | ビュー設定の読み込み時間を制限する `Duration`。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが使用されます。 | :::note 複数の言語を使用している場合は、[フローのローカリゼーション](add-paywall-locale-in-adapty-paywall-builder)の追加方法と、ロケールコードの正しい使い方を[こちら](flutter-localizations-and-locale-codes)でご確認ください。 ::: ビューを取得したら、[フロー/ペイウォールを表示](flutter-present-paywalls)してください。 ## デフォルトオーディエンスのフローまたはペイウォールを取得して高速化する \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} 通常、フローやペイウォールはほぼ即座に取得されるため、速度を気にする必要はありません。ただし、オーディエンスやプレースメントが多数あり、ユーザーのインターネット接続が不安定な場合は、取得に想定より時間がかかることがあります。そのような状況では、何も表示しないよりも、デフォルトのフローやペイウォールを表示してスムーズなユーザー体験を確保したい場合があるでしょう。 これに対処するには、`getFlowForDefaultAudience` メソッドを使用できます。このメソッドは、指定されたプレースメントの **All Users** オーディエンス向けのフローまたはペイウォールを取得します。ただし、推奨されるアプローチは [フロー/ペイウォールの取得](#fetch-flowpaywall) セクションで詳しく説明されている `getFlow` メソッドでフローまたはペイウォールを取得することであることを、ぜひ理解しておいてください。 :::warning `getFlow` を推奨する理由 `getFlowForDefaultAudience` メソッドにはいくつかの重大な欠点があります: - **後方互換性の問題**: 現在のバージョンと将来のバージョンで異なるペイウォールを表示する必要がある場合、課題が生じる可能性があります。現在の(レガシー)バージョンをサポートするペイウォールを設計するか、現在の(レガシー)バージョンのユーザーがレンダリングされないペイウォールに遭遇する可能性を受け入れるかのどちらかになります。 - **ターゲティングの喪失**: すべてのユーザーが **All Users** オーディエンス向けに設計された同じペイウォールを見ることになり、国、マーケティングアトリビューション、独自のカスタム属性に基づくパーソナライズされたターゲティングが失われます。 これらのデメリットを許容してでもフローやペイウォールの取得を高速化したい場合は、以下のように `getFlowForDefaultAudience` メソッドを使用してください。そうでない場合は、[上記](#fetch-flowpaywall)で説明した `getFlow` を使用してください。 ::: ```dart showLineNumbers try { final flow = await Adapty().getFlowForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID'); // the requested flow/paywall } on AdaptyError catch (adaptyError) { // handle error } catch (e) { // handle unknown error } ``` | パラメーター | 必須/任意 | 説明 | |---------|--------|-----------| | **placementId** | 必須 | [プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値を使用してください。 | | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方法を推奨します。ユーザーが常に最新のデータを取得できるためです。
ただし、ユーザーのインターネット環境が不安定だと考えられる場合は、`.returnCacheDataElseLoad` の使用を検討してください。キャッシュが存在する場合はキャッシュデータを返します。この場合、最新のデータが届かない可能性はありますが、接続状況に関わらず読み込みが速くなります。キャッシュはセッション中に定期的に更新されるため、ネットワークリクエストを減らす目的でキャッシュを利用しても問題ありません。
なお、キャッシュはアプリの再起動後も保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
| ## アセットのカスタマイズ \{#customize-assets\} フロー/ペイウォールの画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像と動画には、`hero_image` と `hero_video` という定義済みIDがあります。カスタムアセットバンドルでは、これらのIDを使って対象の要素を指定し、その動作をカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定](custom-media)する必要があります。 たとえば、以下のようなことができます。 - 特定のユーザーに別の画像や動画を表示する。 - リモートのメイン画像の読み込み中に、ローカルのプレビュー画像を表示する。 - 動画を再生する前にプレビュー画像を表示する。 Here's an example of how you can provide custom assets via a simple dictionary: ```dart final customAssets = { // Show a local image using a custom ID 'custom_image': AdaptyCustomAsset.localImageAsset( assetId: 'assets/images/image_name.png', ), // Show a local video with a preview image 'hero_video': AdaptyCustomAsset.localVideoAsset( assetId: 'assets/videos/custom_video.mp4', ), }; try { final view = await AdaptyUI().createFlowView( flow: flow, customAssets: customAssets, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` :::note アセットが見つからない場合、フロー/ペイウォールはデフォルトの外観にフォールバックします。 ::: ## カスタムタイマーの設定 \{#set-up-developer-defined-timers\} モバイルアプリでカスタムタイマーを使用するには、`customTimers` マップを `createFlowView` メソッドに渡します。マップの各キーはタイマー ID で、その値はタイマーの終了時刻を定義する `DateTime` オブジェクトです。以下に例を示します: ```dart showLineNumbers try { final view = await AdaptyUI().createFlowView( flow: flow, customTimers: { 'CUSTOM_TIMER_6H': DateTime.now().add(const Duration(seconds: 3600 * 6)), 'CUSTOM_TIMER_NY': DateTime(2027, 1, 1), // New Year 2027 }, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` この例では、`CUSTOM_TIMER_NY` と `CUSTOM_TIMER_6H` は、Adapty ダッシュボードで設定した開発者定義タイマーの **Timer ID** です。`customTimers` マップにより、アプリは各タイマーを正しい値で動的に更新します。例えば: - `CUSTOM_TIMER_NY`: 元日など、タイマーの終了時刻までの残り時間。 - `CUSTOM_TIMER_6H`: ユーザーがフローを開いてから始まった 6 時間の残り時間。任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-paywall-locale-in-adapty-paywall-builder)の識別子です。このパラメータは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードや推奨される使用方法については、[ローカライズとロケールコード](flutter-localizations-and-locale-codes)をご覧ください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、この方法を推奨します。
ただし、ユーザーのインターネット接続が不安定な場合は、`.returnCacheDataElseLoad` を使用してキャッシュが存在する場合はキャッシュデータを返すことも検討してください。この場合、ユーザーが最新のデータを受け取れないことがありますが、通信状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける目的で使用しても問題ありません。
キャッシュはアプリの再起動後も保持され、アプリの再インストール時または手動でのクリーンアップ時にのみクリアされます。
Adapty SDK はペイウォールをローカルに2つの層で保存します。1つは上記の定期更新キャッシュ、もう1つは[フォールバックペイウォール](fallback-paywalls)です。またCDNを使用してペイウォールの取得を高速化し、CDNが利用できない場合に備えたスタンドアロンのフォールバックサーバーも用意しています。このシステムにより、インターネット接続が不安定な状況でも確実に最新のペイウォールを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルフォールバックが返されます。
内部で複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間よりわずかに遅れてタイムアウトすることがあります。
Android の場合: 拡張関数(例: `5.seconds`、`.seconds` は `import com.adapty.utils.seconds` から)を使用して `TimeInterval` を作成するか、`TimeInterval.seconds(5)` を使用できます。制限を設けない場合は `TimeInterval.INFINITE` を使用してください。
| レスポンスパラメーター: | パラメータ | 説明 | | :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | プロダクト ID のリスト、ペイウォール識別子、リモートコンフィグ、およびその他のプロパティを含む [`AdaptyPaywall`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywall-class.html) オブジェクト。 | ## ペイウォールビルダーで作成したペイウォールのビュー設定を取得する \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important ペイウォールビルダーの **Show on device** トグルを有効にしてください。このオプションがオンになっていない場合、ビュー設定を取得できません。 ::: ペイウォールを取得したら、`ViewConfiguration` が含まれているかどうかを確認してください。これはペイウォールビルダーで作成されたことを示します。この情報をもとに、ペイウォールの表示方法を決定してください。`ViewConfiguration` が存在する場合はペイウォールビルダーのペイウォールとして扱い、存在しない場合は[リモートコンフィグのペイウォールとして処理してください](present-remote-config-paywalls-flutter)。 ```dart showLineNumbers try { final view = await AdaptyUI().createPaywallView( paywall: paywall, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` ビューを取得したら、[ペイウォールを表示](flutter-present-paywalls)してください。 ## デフォルトオーディエンス向けのペイウォールを取得して表示を高速化する \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} 通常、ペイウォールはほぼ瞬時に取得されるため、速度を気にする必要はありません。ただし、オーディエンスやペイウォールの数が多く、ユーザーのネット接続が遅い場合は、取得に予想以上の時間がかかることがあります。そのような状況では、ペイウォールを何も表示しないよりも、デフォルトのペイウォールを表示してスムーズなユーザー体験を保つほうが望ましいでしょう。 これに対処するには、`getPaywallForDefaultAudience` メソッドを使用できます。このメソッドは、指定されたプレースメントの **All Users** オーディエンスのペイウォールを取得します。ただし、推奨されるアプローチは `getPaywall` メソッドでペイウォールを取得することであり、詳細は上記の[ペイウォール情報の取得](flutter-get-pb-paywalls#fetch-paywall-designed-with-paywall-builder)セクションを参照してください。 :::warning `getPaywall` を推奨する理由 `getPaywallForDefaultAudience` メソッドにはいくつかの重大な欠点があります: - **後方互換性の問題**: 異なるアプリバージョン(現行バージョンと将来のバージョン)で異なるペイウォールを表示する必要がある場合、課題が生じる可能性があります。現行(レガシー)バージョンに対応したペイウォールを設計するか、現行(レガシー)バージョンのユーザーがペイウォールを表示できないという問題を受け入れるか、どちらかを選択する必要があります。 - **ターゲティングの喪失**: すべてのユーザーが **All Users** オーディエンス向けに設計された同じペイウォールを見ることになるため、パーソナライズされたターゲティング(国、マーケティングアトリビューション、独自のカスタム属性に基づくものを含む)が失われます。 これらのデメリットを受け入れてでもペイウォールの取得を高速化したい場合は、以下のように `getPaywallForDefaultAudience` メソッドを使用してください。そうでない場合は、[上記](#fetch-paywall-designed-with-paywall-builder)で説明した `getPaywall` を使用してください。 ::: ```dart showLineNumbers try { final paywall = await Adapty().getPaywallForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID'); } on AdaptyError catch (adaptyError) { // handle error } catch (e) { // handle unknown error } ``` :::note `getPaywallForDefaultAudience` メソッドは Flutter SDK バージョン 3.2.0 以降で利用可能です。 ::: | パラメータ | 必須/任意 | 説明 | |---------|--------|-----------| | **placementId** | 必須 | [プレースメント](placements)の識別子。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子。このパラメータは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードの詳細と推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、この設定を推奨します。
ただし、ユーザーのインターネット接続が不安定な場合は、`.returnCacheDataElseLoad` を使用して、キャッシュが存在する場合はキャッシュされたデータを返すことを検討してください。この場合、最新データが取得できないことがありますが、接続状況に関わらず高速な読み込みが可能になります。キャッシュはセッション中も定期的に更新されるため、ネットワークリクエストを減らす目的で安全に使用できます。
なお、キャッシュはアプリの再起動後も保持され、アプリの再インストールまたは手動でのクリーンアップ時にのみ削除されます。
| ## アセットのカスタマイズ \{#customize-assets\} ペイウォール内の画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像と動画には、あらかじめ `hero_image` および `hero_video` というIDが定義されています。カスタムアセットバンドルでは、これらのIDを使って各要素を指定し、動作をカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定](custom-media)する必要があります。 たとえば、次のようなことが可能です。 - 一部のユーザーに別の画像や動画を表示する。 - リモートのメイン画像の読み込み中に、ローカルのプレビュー画像を表示する。 - 動画を再生する前にプレビュー画像を表示する。 :::important この機能を使用するには、Adapty Flutter SDK をバージョン 3.8.0 以上にアップデートしてください。 ::: カスタムアセットをシンプルなディクショナリ形式で提供する例を以下に示します。 ```dart final customAssets = { // Show a local image using a custom ID 'custom_image': AdaptyCustomAsset.localImageAsset( assetId: 'assets/images/image_name.png', ), // Show a local video with a preview image 'hero_video': AdaptyCustomAsset.localVideoAsset( assetId: 'assets/videos/custom_video.mp4', ), }; try { final view = await AdaptyUI().createPaywallView( paywall: paywall, customAssets: customAssets, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` :::note アセットが見つからない場合、ペイウォールはデフォルトの外観にフォールバックします。 ::: ## カスタムタイマーの設定 \{#set-up-developer-defined-timers\} モバイルアプリでカスタムタイマーを使用するには、`createPaywallView` メソッドに `customTimers` マップを渡します。マップの各キーはタイマーIDで、その値はタイマーの終了時刻を定義する `DateTime` オブジェクトです。以下に例を示します。 ```dart showLineNumbers try { final view = await AdaptyUI().createPaywallView( paywall: paywall, customTimers: { 'CUSTOM_TIMER_6H': DateTime.now().add(const Duration(seconds: 3600 * 6)), 'CUSTOM_TIMER_NY': DateTime(2025, 1, 1), // New Year 2025 }, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` この例では、`CUSTOM_TIMER_NY` と `CUSTOM_TIMER_6H` は、Adapty ダッシュボードで設定した開発者定義タイマーの **Timer ID** です。`customTimers` マップにより、アプリは各タイマーを正しい値で動的に更新します。例: - `CUSTOM_TIMER_NY`: 元旦など、タイマーの終了時刻までの残り時間。 - `CUSTOM_TIMER_6H`: ユーザーがペイウォールを開いてから始まった6時間のうち、残りの時間。
## ペイウォールのビュー数が多すぎる \{#the-paywall-view-number-is-too-big\}
**問題**: ペイウォールのビュー数が想定の2倍になっている。
**原因**: ペイウォールビルダーまたはフローのビルダーを使用している場合に `logShowFlow`(Flutter SDK v4以降)/ `logShowPaywall` を呼び出すと、ビュー数が重複してしまいます。これらのツールで構築したフローやペイウォールでは、アナリティクスが自動的に計測されるため、このメソッドを呼び出す必要はありません。
**解決策**: ペイウォールビルダーまたはフローのビルダーを使用している場合は、コード内で `logShowFlow`(Flutter SDK v4以降)/ `logShowPaywall` を呼び出していないことを確認してください。
## その他の問題 \{#other-issues\}
**問題**: 上記では取り上げていないペイウォールビルダー関連の問題が発生している。
**解決策**: 必要に応じて[マイグレーションガイド](flutter-sdk-migration-guides)を参照し、SDKを最新バージョンに移行してください。多くの問題は新しいSDKバージョンで解決されています。
---
# File: flutter-present-flows-in-observer-mode
---
---
title: "FlutterのSDKでObserverモードのフローを表示する"
description: "FlutterアプリでObserverモードのフローとペイウォールビルダーのペイウォールを表示しながら、独自のコードで購入処理を行います。"
---
ビルダーを使ってフローやペイウォールをカスタマイズした場合、モバイルアプリのコード内でそれをレンダリングしてユーザーに表示する方法を気にする必要はありません。そのようなフローやペイウォールには、表示する内容と表示方法の両方が含まれています。
:::warning
このセクションは[オブザーバーモード](observer-vs-full-mode)専用の説明です。オブザーバーモードで作業していない場合は、[フローとペイウォールの表示](flutter-present-paywalls)のトピックを参照してください。
:::
:::info
この機能を利用するには Adapty Flutter SDK 4.0 以降が必要です。以前はネイティブの iOS および Android SDK でのみ利用可能でした。アップグレードするには[移行ガイド](migration-to-flutter-sdk-v4)をご参照ください。
:::
デフォルトでは、SDK はサーバーからデータを取得しようとし、失敗した場合はキャッシュされたデータを返します。この方法を推奨します。ユーザーが常に最新のデータを受け取れるためです。
ただし、ユーザーがインターネット接続の不安定な環境にいると考えられる場合は、`.returnCacheDataElseLoad` の使用を検討してください。これはキャッシュが存在する場合にそのデータを返します。この場合、ユーザーは最新データを取得できないことがありますが、接続状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける目的で安全に使用できます。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でクリアした場合にのみ削除されます。
Adapty SDK はペイウォールを 2 層で保存しています。1 つは上述の定期更新されるキャッシュ、もう 1 つは[フォールバックペイウォール](flutter-use-fallback-paywalls)です。また、ペイウォールをより速く取得するために CDN を使用し、CDN に到達できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な状況でも確実に最新バージョンのペイウォールを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5 秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。
なお、このメソッドは内部で複数のリクエストを行う場合があるため、`loadTimeout` で指定した時間よりわずかに遅れてタイムアウトするケースがまれにあります。
| :::note v4 では、`getFlow` は `locale` パラメーターを受け取りません。カスタムペイウォールの場合、利用可能なすべてのローカライズがフローのリモートコンフィグ(`flow.remoteConfigs`)として返されるので、ユーザーのデバイスまたはアプリ設定に合ったものを選択してください。詳しくは[ローカライズとロケールコード](flutter-localizations-and-locale-codes)をご覧ください。 ::: レスポンスパラメーター: | パラメーター | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | フローの識別子(`instanceIdentity`、`variationId`)、名前、プレースメント、ペイウォールのバリアント(`paywalls`)、リモートコンフィグ(`remoteConfigs`)を含む `AdaptyFlow` オブジェクト。 | ## プロダクトの取得 \{#fetch-products\} フローを取得したら、それに対応するプロダクトの配列を取得できます。 ```dart showLineNumbers try { final products = await Adapty().getPaywallProducts(flow: flow); // the requested products array } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { // handle the error } ``` レスポンスパラメーター: | パラメータ | 説明 | | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Products | [`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html) オブジェクトのリスト。プロダクト識別子、プロダクト名、価格、通貨、サブスクリプション期間、その他のプロパティが含まれます。 | 独自のペイウォールデザインを実装する際、[`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html) オブジェクトの以下のプロパティが必要になることがあります。よく使われるプロパティを以下に示しますが、利用可能なすべてのプロパティの詳細については、リンク先のドキュメントをご参照ください。 | プロパティ | 説明 | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | プロダクトのタイトルを表示するには、`product.localizedTitle` を使用します。なお、ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づいて行われます。 | | **Price** | ローカライズされた価格を表示するには、`product.price.localizedString` を使用します。このローカライズはデバイスのロケール情報に基づきます。`product.price.amount` を使用すると数値として価格を取得することもできます。値はローカル通貨で提供されます。関連する通貨記号を取得するには、`product.price.currencySymbol` を使用します。 | | **Subscription Period** | 期間(週、月、年など)を表示するには、`product.subscription?.localizedPeriod` を使用します。このローカライズはデバイスのロケールに基づきます。サブスクリプション期間をプログラムで取得するには、`product.subscription?.period` を使用します。ここから `unit` 列挙型にアクセスして、長さ(day、week、month、year、または unknown)を取得できます。`numberOfUnits` の値は期間ユニット数を返します。例えば、四半期サブスクリプションの場合、unit プロパティには `AdaptyPeriodUnit.month`、numberOfUnits プロパティには `3` が設定されます。 | | **Introductory Offer** | サブスクリプションに初回オファーが含まれているかどうかをバッジなどで表示するには、`product.subscription?.offer?.phases` プロパティを確認してください。これはリストで、フリートライアルフェーズと初回価格フェーズの最大2つの割引フェーズを含めることができます。各フェーズオブジェクトには以下の便利なプロパティがあります:デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。このオプションを推奨します。ユーザーが常に最新のデータを受け取れるためです。
ただし、ユーザーがネットワーク接続が不安定な環境にいることが多いと想定される場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在する場合にそれを返すことを検討してください。この場合、最新のデータが届かない可能性はありますが、ネットワーク状況に関わらず読み込みを高速化できます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを抑える目的で使用しても安全です。
なお、キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
|任意
デフォルト: `en`
|[ペイウォールのローカライゼーション](add-remote-config-locale)の識別子です。このパラメーターは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードである必要があります。最初のサブタグは言語を、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよびその推奨使用方法については、[ローカライゼーションとロケールコード](flutter-localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、この設定を推奨します。
ただし、ユーザーがネットワークの不安定な環境にいることが多いと判断した場合は、`.returnCacheDataElseLoad` を使用してキャッシュが存在するときにキャッシュデータを返すことを検討してください。この場合、最新データを取得できないことがありますが、ネットワーク状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリのアンインストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はペイウォールを2層で保存します。1つは上記の定期更新されるキャッシュ、もう1つは[フォールバックペイウォール](flutter-use-fallback-paywalls)です。また、ペイウォールをより速く取得するためにCDNを使用し、CDNが利用できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新のペイウォールを取得できるように設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト時間を制限します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
内部で複数のリクエストが実行される場合があるため、まれに `loadTimeout` で指定した時間よりわずかに遅れてタイムアウトすることがあります。
| プロダクトIDをハードコードしないでください!ペイウォールはリモートで設定されるため、利用可能なプロダクト、プロダクト数、特典(無料トライアルなど)は随時変更される可能性があります。これらのシナリオにコードが対応できるようにしてください。 たとえば、最初に2つのプロダクトを取得した場合、アプリはその2つを表示します。しかし、後で3つのプロダクトを取得した場合は、コードを変更することなく3つすべてを表示できるようにする必要があります。ハードコードが必要なのはプレースメントIDだけです。 レスポンスパラメータ: | パラメータ | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | [`AdaptyPaywall`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywall-class.html) オブジェクト。プロダクト ID のリスト、ペイウォール識別子、リモートコンフィグ、その他いくつかのプロパティを含みます。 | ## プロダクトを取得する \{#fetch-products\} ペイウォールを取得したら、それに対応するプロダクトの配列を取得できます: ```dart showLineNumbers try { final products = await Adapty().getPaywallProducts(paywall: paywall); // the requested products array } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` レスポンスパラメーター: | パラメーター | 説明 | | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Products | [`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html) オブジェクトのリスト。プロダクト識別子、プロダクト名、価格、通貨、サブスクリプション期間、その他複数のプロパティを含みます。 | 独自のペイウォールデザインを実装する際、[`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html) オブジェクトから以下のプロパティにアクセスする必要があります。よく使われるプロパティを以下に示しますが、利用可能なすべてのプロパティの詳細については、リンク先のドキュメントを参照してください。 | プロパティ | 説明 | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **タイトル** | プロダクトのタイトルを表示するには、`product.localizedTitle` を使用します。ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づいています。 | | **価格** | ローカライズされた価格を表示するには、`product.price.localizedString` を使用します。このローカライズはデバイスのロケール情報に基づいています。`product.price.amount` を使用して価格を数値として取得することもできます。値はローカル通貨で提供されます。関連する通貨記号を取得するには、`product.price.currencySymbol` を使用します。 | | **サブスクリプション期間** | 期間(週、月、年など)を表示するには、`product.subscription?.localizedPeriod` を使用します。このローカライズはデバイスのロケールに基づいています。サブスクリプション期間をプログラムで取得するには、`product.subscription?.period` を使用します。そこから `unit` 列挙型にアクセスして長さ(day、week、month、year、または unknown)を取得できます。`numberOfUnits` の値で期間の単位数を取得できます。たとえば、四半期ごとのサブスクリプションの場合、unit プロパティに `AdaptyPeriodUnit.month`、numberOfUnits プロパティに `3` が表示されます。 | | **初回オファー** | サブスクリプションに初回オファーが含まれていることを示すバッジやインジケーターを表示するには、`product.subscription?.offer?.phases` プロパティを確認します。これは最大2つの割引フェーズ(無料トライアルフェーズと初回価格フェーズ)を含むリストです。各フェーズオブジェクトには以下の便利なプロパティが含まれています:任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子です。このパラメーターは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードである必要があります。最初のサブタグは言語を、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよびその推奨される使用方法については、[ローカライズとロケールコード](flutter-localizations-and-locale-codes)をご覧ください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方法はユーザーが常に最新のデータを取得できるため、推奨します。
ただし、ユーザーがインターネット接続の不安定な環境にいる場合は、`.returnCacheDataElseLoad` の使用を検討してください。これはキャッシュが存在する場合にキャッシュデータを返します。この場合、最新のデータが取得できないこともありますが、接続状況に関わらず読み込みが速くなります。キャッシュはセッション中に定期的に更新されるため、ネットワークリクエストを避ける目的でキャッシュを利用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップ時にのみ消去されます。
|リクエストが成功した場合、レスポンスにはこのオブジェクトが含まれます。[AdaptyProfile](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyProfile-class.html) オブジェクトは、アプリ内のユーザーのアクセスレベル、サブスクリプション、および買い切り購入に関する包括的な情報を提供します。
アクセスレベルのステータスを確認して、ユーザーがアプリに必要なアクセス権を持っているかどうかを確かめてください。
| :::warning **注意:** Apple の StoreKit バージョンが v2.0 未満、かつ Adapty SDK バージョンが v2.9.0 未満の場合は、代わりに [Apple App Store 共有シークレット](app-store-connection-configuration#step-5-enter-app-store-shared-secret) を指定する必要があります。この方法は現在 Apple により非推奨とされています。 ::: ## 購入時にサブスクリプションを変更する \{#change-subscription-when-making-a-purchase\} ユーザーが現在のサブスクリプションを更新するのではなく、新しいサブスクリプションを選択した場合の動作は、アプリストアによって異なります。 - App Store の場合、サブスクリプションはサブスクリプショングループ内で自動的に更新されます。ユーザーがすでに別のグループのサブスクリプションを持っている状態で、あるグループのサブスクリプションを購入した場合、両方のサブスクリプションが同時にアクティブになります。 - Google Play の場合、サブスクリプションは自動的に更新されません。以下で説明するように、モバイルアプリのコードで切り替えを管理する必要があります。 Androidでサブスクリプションを別のものに切り替えるには、追加パラメータを指定して `.makePurchase()` メソッドを呼び出します。 ```dart showLineNumbers try { final subscriptionUpdateParams = AdaptyAndroidSubscriptionUpdateParameters( 'OLD_PRODUCT_ID', AdaptyAndroidSubscriptionUpdateReplacementMode.immediateWithTimeProration, ); final result = await Adapty().makePurchase( product: product, parameters: AdaptyPurchaseParameters( subscriptionUpdateParams: subscriptionUpdateParams, ), ); // successful cross-grade } on AdaptyError catch (adaptyError) { // Handle the error } catch (e) { // Handle the error } ``` 追加のリクエストパラメーター: | パラメーター | 必須/任意 | 説明 | | :--------------------------- | :------- |:--------------------------------------------------------------------------------------------------------| | **parameters** | required | `subscriptionUpdateParams` フィールドに [`AdaptyAndroidSubscriptionUpdateParameters`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyAndroidSubscriptionUpdateParameters-class.html) オブジェクトを設定した `AdaptyPurchaseParameters` オブジェクト。 | Googleデベロッパードキュメントで、サブスクリプションと置き換えモードについて詳しく確認できます: - [置き換えモードについて](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [置き換えモードに関するGoogleの推奨事項](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - 置き換えモード [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE())。注意: このメソッドはサブスクリプションのアップグレードにのみ使用できます。ダウングレードはサポートされていません。 - 置き換えモード [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED())。注意: 実際のサブスクリプション変更は、現在のサブスクリプションの請求期間が終了したときにのみ行われます。 ## iOS でオファーコードを使用する \{#redeem-offer-codes-in-ios\}[`AdaptyProfile`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyProfile-class.html) オブジェクト。このモデルには、アクセスレベル、サブスクリプション、非サブスクリプション購入に関する情報が含まれています。
ユーザーがアプリにアクセスできるかどうかを確認するには、**アクセスレベルのステータス**を確認してください。
| :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: --- # File: implement-observer-mode-flutter --- --- title: "Flutter SDKにObserverモードを実装する" description: "Flutter SDKでAdaptyのオブザーバーモードを実装して、ユーザーのサブスクリプションイベントを追跡する方法を説明します。" --- すでに独自の購入インフラを持っており、Adapty への完全移行をすぐには行えない場合は、[オブザーバーモード](observer-vs-full-mode)を検討してください。基本的な使い方として、オブザーバーモードは高度なアナリティクスや、アトリビューション・アナリティクスシステムとのシームレスな連携を提供します。 これがニーズに合っている場合は、以下の手順に従ってください: 1. Adapty SDK を設定する際に `observerMode` パラメータを `true` に設定してオンにします。[Flutter](sdk-installation-flutter#activate-adapty-module-of-adapty-sdk) のセットアップ手順に従ってください。 2. 既存の購入インフラから Adapty へ[トランザクションを報告](report-transactions-observer-mode-flutter)します。 ## オブザーバーモードの設定 \{#observer-mode-setup\} 購入処理やサブスクリプションのステータス管理を自前で行い、サブスクリプションイベントの送信とアナリティクスにのみ Adapty を使用する場合は、オブザーバーモードを有効にしてください。 :::important オブザーバーモードで動作する場合、Adapty SDK はトランザクションをクローズしません。トランザクションの処理は必ずご自身で行ってください。 ::: ```dart showLineNumbers title="main.dart" await Adapty().activate( configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY') ..withObserverMode(true) // Enable observer mode ..withLogLevel(AdaptyLogLevel.verbose), ); ``` パラメーター: | パラメータ | 説明 | | --------------------------- | ------------------------------------------------------------ | | observerMode | [オブザーバーモード](observer-vs-full-mode)を制御するboolean値。デフォルト値は`false`です。 | ## Observer ModeでAdaptyのペイウォールを使用する \{#using-adapty-paywalls-in-observer-mode\} ペイウォールやA/Bテスト機能も利用したい場合は、Observerモードで追加の設定が必要です。上記の手順に加えて、以下の対応が必要です。 1. [リモートコンフィグペイウォール](present-remote-config-paywalls-flutter)の場合は、通常どおりペイウォールを表示します。 3. 購入トランザクションに[ペイウォールを紐付ける](report-transactions-observer-mode-flutter)。 :::tip SDK v4では、ObserverモードでAdaptyがレンダリングするフローやペイウォールを表示することもできます。ユーザーが対応するボタンをタップしたときに、独自のコードで購入または復元を行うために`AdaptyUIObserverModeResolver`を登録してください。詳しくは[Observerモードでのフローの表示](flutter-present-flows-in-observer-mode)をご覧ください。 ::: --- # File: report-transactions-observer-mode-flutter --- --- title: "Flutter SDKでオブザーバーモードのトランザクションを報告する" description: "Adaptyオブザーバーモードで購入トランザクションを報告し、ユーザーインサイトと収益トラッキングをFlutter SDKで行います。" ---phoneNumber
firstName
lastName
| String | | gender | 列挙型。使用できる値: `female`、`male`、`other` | | birthday | Date | ### カスタムユーザー属性 \{#custom-user-attributes\} カスタム属性を独自に設定できます。通常はアプリの使用状況に関連するもので、たとえばフィットネスアプリなら週あたりのエクササイズ回数、語学学習アプリならユーザーの習熟度レベルなどが該当します。カスタム属性はセグメントで活用してターゲットを絞ったペイウォールやオファーを作成したり、アナリティクスでどのプロダクト指標が収益に最も影響するかを分析したりするのに役立ちます。 ```dart showLineNumbers try { final builder = AdaptyProfileParametersBuilder() ..setCustomStringAttribute('value1', 'key1') ..setCustomDoubleAttribute(1.0, 'key2'); await Adapty().updateProfile(builder.build()); } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` 既存のキーを削除するには、`.withRemoved(customAttributeForKey:)` メソッドを使用してください: ```dart showLineNumbers try { final builder = AdaptyProfileParametersBuilder() ..removeCustomAttribute('key1') ..removeCustomAttribute('key2'); await Adapty().updateProfile(builder.build()); } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` すでに設定されているカスタム属性を確認したい場合は、`AdaptyProfile` オブジェクトの `customAttributes` フィールドを使用してください。 :::warning `customAttributes` の値は最新でない可能性があることに注意してください。ユーザー属性はいつでも異なるデバイスから送信されるため、最後の同期以降にサーバー上の属性が変更されている場合があります。 ::: ### 制限事項 \{#limits\} - ユーザーあたり最大30件のカスタム属性 - キー名は最大30文字。キー名には英数字と次の文字を使用できます: `_` `-` `.` - 値は50文字以内の文字列または浮動小数点数。 --- # File: flutter-listen-subscription-changes --- --- title: "Flutter SDKでサブスクリプションステータスを確認する" description: "Adaptyでユーザーのサブスクリプションステータスをトラッキングおよび管理し、Flutterアプリのカスタマーリテンションを向上させましょう。" --- Adaptyを使えば、サブスクリプションのステータス管理が簡単になります。コードにプロダクトIDを手動で埋め込む必要はありません。アクティブな[アクセスレベル](access-level)を確認するだけで、ユーザーのサブスクリプション状態を手軽に把握できます。[AdaptyProfile](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyProfile-class.html) オブジェクト。通常、ユーザーがアプリのプレミアムアクセスを持っているかどうかを判断するには、プロファイルのアクセスレベルのステータスのみを確認すれば十分です。
`.getProfile` メソッドは常に API へのクエリを試みるため、最新の結果を返します。何らかの理由(例:インターネット接続がない場合など)で Adapty SDK がサーバーから情報を取得できない場合は、キャッシュのデータが返されます。また、Adapty SDK は `AdaptyProfile` のキャッシュを定期的に更新し、情報をできる限り最新の状態に保つことも重要なポイントです。
| `.getProfile()` メソッドを使用すると、アクセスレベルのステータスを取得できるユーザープロファイルを取得できます。アプリごとに複数のアクセスレベルを設定することも可能です。例えば、ニュースアプリで異なるトピックのサブスクリプションを独立して販売する場合、"sports" や "science" といったアクセスレベルを作成できます。ただし、ほとんどの場合はアクセスレベルが1つあれば十分なので、デフォルトの "premium" アクセスレベルをそのまま使えます。 デフォルトの "premium" アクセスレベルを確認する例を以下に示します: ```dart showLineNumbers try { final profile = await Adapty().getProfile(); if (profile?.accessLevels['premium']?.isActive ?? false) { // grant access to premium features } } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` ### サブスクリプションステータス更新のリッスン \{#listening-for-subscription-status-updates\} ユーザーのサブスクリプションが変更されるたびに、Adaptyはイベントを発火します。 Adaptyからメッセージを受け取るには、追加の設定が必要です。 ```dart showLineNumbers Adapty().didUpdateProfileStream.listen((profile) { // handle any changes to subscription state }); ``` Adaptyはアプリ起動時にもイベントを発火します。この場合、キャッシュされたサブスクリプションステータスが渡されます。 ### サブスクリプションステータスのキャッシュ \{#subscription-status-cache\} Adapty SDK に実装されたキャッシュは、プロファイルのサブスクリプションステータスを保存します。つまり、サーバーが利用できない場合でも、キャッシュされたデータにアクセスしてプロファイルのサブスクリプションステータスに関する情報を取得できます。 ただし、キャッシュへの直接データリクエストはできません。SDKは1分ごとに定期的にサーバーへ問い合わせを行い、プロファイルに関する更新や変更がないかを確認します。新しいトランザクションやその他の更新など変更があった場合は、キャッシュデータに反映され、サーバーとの同期が維持されます。 --- # File: flutter-deal-with-att --- --- title: "Flutter SDK での ATT の処理" description: "Flutter で Adapty を使い始めて、サブスクリプションの設定と管理を効率化しましょう。" --- アプリが AppTrackingTransparency フレームワークを使用しており、ユーザーにアプリのトラッキング認可リクエストを表示する場合は、[認可ステータス](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/)を Adapty に送信する必要があります。 ```dart showLineNumbers final builder = AdaptyProfileParametersBuilder() ..setAppTrackingTransparencyStatus(AdaptyIOSAppTrackingTransparencyStatus.authorized); try { await Adapty().updateProfile(builder.build()); } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { // handle unknown error } ``` :::warning この値は変更されたときにできるだけ早く送信することを強くおすすめします。そうすることで、設定済みのインテグレーションにデータがタイムリーに送信されます。 ::: --- # File: kids-mode-flutter --- --- title: "Flutter SDKのキッズモード" description: "AppleとGoogleのポリシーに準拠するためにキッズモードを簡単に有効化。Flutter SDKではIDFA、GAID、広告データを収集しません。" --- Flutterアプリが子ども向けの場合、[Apple](https://developer.apple.com/kids/)および[Google](https://support.google.com/googleplay/android-developer/answer/9893335)のポリシーに従う必要があります。Adapty SDKを使用している場合、いくつかの簡単な手順でこれらのポリシーに準拠するよう設定し、アプリストアの審査を通過できます。 ## 何が必要ですか? \{#whats-required\} 以下の情報収集を無効にするよう、Adapty SDK を設定する必要があります。 - [IDFA(広告識別子)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers)(iOS) - [Android 広告 ID(AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248)(Android) - [IP アドレス](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) さらに、カスタマーユーザーIDの扱いには十分注意することをお勧めします。`任意
デフォルト: `en`
|オンボーディングのローカライズ識別子です。このパラメータは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグからなる言語コードである必要があります。最初のサブタグは言語、2番目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、このオプションを推奨します。
ただし、ユーザーのインターネット接続が不安定な場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在する場合に返すことを検討してください。この場合、ユーザーが最新のデータを取得できないことがありますが、接続状態に関わらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける目的での使用は安全です。
キャッシュはアプリを再起動しても保持され、アプリのアンインストール時または手動でクリーンアップした場合にのみ削除されます。
Adapty SDK はオンボーディングをローカルに2層で保存します。1つは上記の定期更新されるキャッシュ、もう1つはフォールバックオンボーディングです。また、CDN を使用してオンボーディングを高速に取得し、CDN に接続できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンのオンボーディングを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。
内部で複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間よりもわずかに遅れてタイムアウトすることがあります。
| レスポンスパラメーター: | パラメータ | 説明 | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | [`AdaptyOnboarding`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyOnboarding-class.html) オブジェクト。オンボーディングの識別子と設定、リモートコンフィグ、およびその他のプロパティを含みます。 | ## デフォルトオーディエンスのオンボーディングでフェッチを高速化する \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} 通常、オンボーディングはほぼ瞬時にフェッチされるため、このプロセスの高速化を気にする必要はありません。ただし、オーディエンスやオンボーディングの数が多く、ユーザーのインターネット接続が遅い場合、オンボーディングのフェッチに想定より時間がかかることがあります。そのような場合は、オンボーディングをまったく表示しないよりも、デフォルトのオンボーディングを表示してスムーズなユーザー体験を確保したいところです。 この問題を解決するには、`getOnboardingForDefaultAudience` メソッドを使用できます。このメソッドは、指定したプレースメントの **All Users** オーディエンス向けのオンボーディングを取得します。ただし、推奨されるアプローチは [オンボーディングの取得](#fetch-onboarding) セクションで説明している `getOnboarding` メソッドでオンボーディングを取得することである点を必ず理解しておいてください。 :::warning `getOnboardingForDefaultAudience` の代わりに `getOnboarding` の使用を検討してください。前者には重要な制限があります: - **互換性の問題**: 複数のアプリバージョンをサポートする際に問題が生じる可能性があり、後方互換性のある設計が必要になるか、古いバージョンが正しく表示されないことを許容しなければなりません。 - **パーソナライズなし**: 「すべてのユーザー」オーディエンス向けのコンテンツのみ表示され、国・アトリビューション・カスタム属性などによるターゲティングは利用できません。 これらのデメリットよりも高速なフェッチが優先される場合は、以下のように `getOnboardingForDefaultAudience` を使用してください。それ以外の場合は、[上記](#fetch-onboarding)で説明している `getOnboarding` を使用してください。 ::: ```dart showLineNumbers try { final onboarding = await Adapty().getOnboardingForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID'); } on AdaptyError catch (adaptyError) { // handle error } catch (e) { // handle unknown error } ``` パラメーター: | パラメーター | 必須/任意 | 説明 | |-----------------|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | 必須 | 対象の[プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
|オンボーディングのローカライゼーション識別子です。このパラメーターは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目のサブタグはリージョンを表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。このオプションを推奨するのは、ユーザーが常に最新のデータを取得できることが保証されるためです。
ただし、ユーザーが不安定なインターネット環境にある場合は、`.returnCacheDataElseLoad` を使用してキャッシュが存在する場合はキャッシュデータを返すことを検討してください。この場合、ユーザーが最新データを取得できないことがありますが、接続が不安定でも読み込み時間が短縮されます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるためにキャッシュを使用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリの再インストール時またはキャッシュを手動でクリアした場合にのみ削除されます。
Adapty SDK はオンボーディングをローカルに2層で保存しています。1つは上記の定期更新されるキャッシュ、もう1つはフォールバックオンボーディングです。また、オンボーディングをより高速に取得するためにCDNを使用し、CDNが利用できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常にオンボーディングの最新バージョンを取得できるよう設計されています。
| --- # File: flutter-present-onboardings --- --- title: "Flutter SDKでオンボーディングを表示する" description: "オンボーディングを効果的に表示してコンバージョンを高める方法を学びましょう。" --- :::warning **オンボーディングは SDK v4 で非推奨となり、将来のリリースで削除される予定です。** バグ修正や改善は行われません。代わりに [フロー](flutter-get-pb-paywalls) を使用してください。オンボーディングが WebView 内で動作するのとは異なり、フローはデバイス上でネイティブにレンダリングされるため、スムーズなアニメーション、一貫したネイティブの外観、高速な読み込み、そして WebView ランタイムへの依存がありません。開始するには [フローとペイウォールの取得](flutter-get-pb-paywalls) および [フローとペイウォールの表示](flutter-present-paywalls) を参照してください。 ::: ビルダーを使用してオンボーディングをカスタマイズした場合、Flutterアプリのコードでレンダリングする必要はありません。そのようなオンボーディングには、表示する内容と表示方法の両方が含まれています。 始める前に、以下を確認してください: 1. [Adapty Flutter SDK](sdk-installation-flutter) 3.8.0以降をインストールしていること。 2. [オンボーディングを作成](create-onboarding)していること。 3. オンボーディングを[プレースメント](placements)に追加していること。 Adapty Flutter SDKには、オンボーディングを表示する方法が2つあります: - **スタンドアロン画面** - **埋め込みウィジェット** ## スタンドアロンスクリーンとして表示する \{#present-as-standalone-screen\} オンボーディングをスタンドアロンスクリーンとして表示するには、`createOnboardingView` メソッドで作成した `onboardingView` に対して `onboardingView.present()` メソッドを呼び出します。各 `view` は一度しか使用できません。オンボーディングを再度表示する必要がある場合は、`createOnboardingView` をもう一度呼び出して新しい `onboardingView` インスタンスを作成してください。 :::warning 同じ `onboardingView` を再作成せずに再利用すると、`AdaptyUIError.viewAlreadyPresented` エラーが発生する場合があります。 ::: ```dart showLineNumbers title="Flutter" try { await onboardingView.present(); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` ### オンボーディングを閉じる \{#dismiss-the-onboarding\} プログラムでオンボーディングを閉じる必要がある場合は、`dismiss()` メソッドを使用します: ```dart showLineNumbers title="Flutter" try { await onboardingView.dismiss(); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` ### iOS の表示スタイルを設定する \{#configure-ios-presentation-style\} `present()` メソッドに `iosPresentationStyle` パラメータを渡すことで、iOS でのオンボーディングの表示方法を設定できます。このパラメータには `AdaptyUIIOSPresentationStyle.fullScreen`(デフォルト)または `AdaptyUIIOSPresentationStyle.pageSheet` を指定できます。 ```dart showLineNumbers try { await onboardingView.present(iosPresentationStyle: AdaptyUIIOSPresentationStyle.pageSheet); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` ## ウィジェット階層への埋め込み \{#embed-in-widget-hierarchy\} 既存のウィジェットツリーにオンボーディングを埋め込むには、Flutterのウィジェット階層に`AdaptyUIOnboardingPlatformView`ウィジェットを直接使用します。 ```dart showLineNumbers title="Flutter" AdaptyUIOnboardingPlatformView( onboarding: onboarding, // The onboarding object you fetched onDidFinishLoading: (meta) { }, onDidFailWithError: (error) { }, onCloseAction: (meta, actionId) { }, onPaywallAction: (meta, actionId) { }, onCustomAction: (meta, actionId) { }, onStateUpdatedAction: (meta, elementId, params) { }, onAnalyticsEvent: (meta, event) { }, ) ``` :::note Android のプラットフォームビューを動作させるには、`MainActivity` が `FlutterFragmentActivity` を継承していることを確認してください: ```kotlin showLineNumbers title="Kotlin" class MainActivity : FlutterFragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } } ``` ::: ## オンボーディング中のローダー \{#loader-during-onboarding\} オンボーディングを表示する際、スプラッシュ画面とオンボーディングの間に、基盤となるビューの初期化中に短いローディング画面が表示されることがあります。これはニーズに応じてさまざまな方法で対処できます。 #### onDidFinishLoading を使用したスプラッシュ画面の制御 \{#control-splash-screen-using-ondidfinishloading\} :::note このアプローチは、オンボーディングをウィジェットとして埋め込む場合にのみ使用できます。スタンドアロン画面として表示する場合は使用できません。 ::: 推奨されるクロスプラットフォームのアプローチは、オンボーディングが完全に読み込まれるまでスプラッシュスクリーンやカスタムオーバーレイを表示したままにしておき、その後手動で非表示にすることです。 埋め込みウィジェットを使用する場合は、その上に独自のウィジェットをオーバーレイし、`onDidFinishLoading` が発火したタイミングでオーバーレイを非表示にします: ```dart showLineNumbers title="Flutter" AdaptyUIOnboardingPlatformView( onboarding: onboarding, onDidFinishLoading: (meta) { // Hide your custom splash screen or overlay here }, // ... other callbacks ) ``` ### ネイティブローダーをカスタマイズする \{#customize-native-loader\} :::important このアプローチはプラットフォーム固有であり、ネイティブ UI コードのメンテナンスが必要です。アプリで既に別のネイティブレイヤーをメンテナンスしている場合を除き、推奨しません。 ::: デフォルトのローダー自体をカスタマイズしたい場合は、プラットフォーム固有のレイアウトに置き換えることができます。このアプローチでは、Android と iOS それぞれに個別の実装が必要です: - **iOS**: Xcode プロジェクトに `AdaptyOnboardingPlaceholderView.xib` を追加する - **Android**: `res/layout` に `adapty_onboarding_placeholder_view.xml` を作成し、プレースホルダーを定義する ## オンボーディング内リンクの開き方をカスタマイズする \{#customize-how-links-open-in-onboardings\} :::important オンボーディング内リンクの開き方のカスタマイズは、Adapty SDK v3.15.1 以降でサポートされています。 ::: デフォルトでは、オンボーディング内のリンクはアプリ内ブラウザで開きます。これにより、ユーザーがアプリを切り替えることなく Web ページを閲覧できるシームレスな体験が提供されます。 外部ブラウザでリンクを開くように変更したい場合は、`externalUrlsPresentation` パラメータを `AdaptyWebPresentation.externalBrowser` に設定することでこの動作をカスタマイズできます。
ユーザーがカスタムボタン(**Login** や **Allow notifications** など)をタップすると、デリゲートメソッド `onboardingController` が `.custom(id:)` ケースでトリガーされ、`actionId` パラメーターにはビルダーで設定した **Action ID** が渡されます。このIDをコード内で使用して、カスタムアクションとして処理できます。IDは「allowNotifications」のように自由に設定できます。
```dart
// Full-screen presentation
void onboardingViewOnCustomAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
String actionId,
) {
switch (actionId) {
case 'login':
_login();
break;
case 'allow_notifications':
_allowNotifications();
break;
}
}
// Embedded widget
onCustomAction: (meta, actionId) {
_handleCustomAction(actionId);
}
```
:::important
ユーザーがオンボーディングを閉じたときの動作は、ご自身で管理する必要があります。たとえば、オンボーディング自体の表示を停止する処理が必要です。
:::
```dart showLineNumbers title="Flutter"
// Full-screen presentation
void onboardingViewOnCloseAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
String actionId,
) {
await view.dismiss();
}
// Embedded widget
onCloseAction: (meta, actionId) {
Navigator.of(context).pop();
}
```
2. サブスクリプショングループ名をクリックすると、**Subscriptions** セクションにプロダクトの一覧が表示されます。
3. テスト対象のプロダクトが **Ready to Submit** になっていることを確認します。
4. テーブルのプロダクト ID と Adapty ダッシュボードの [**Products**](https://app.adapty.io/products) タブのプロダクト ID を比較します。ID が一致しない場合は、テーブルからプロダクト ID をコピーし、Adapty ダッシュボードでそれを使って[プロダクトを作成](create-product)してください。
## ステップ 3. プロダクトの販売状況を確認する \{#step-4-check-product-availability\}
1. **App Store Connect** に戻り、同じ **Subscriptions** セクションを開きます。
2. サブスクリプショングループ名をクリックしてプロダクト一覧を表示します。
3. テスト対象のプロダクトを選択します。
4. **Availability** セクションまでスクロールし、必要な国と地域がすべて表示されていることを確認します。
## ステップ 4. プロダクトの価格を確認する \{#step-5-check-product-prices\}
1. **App Store Connect** の **Monetization** → **Subscriptions** セクションに移動します。
2. サブスクリプショングループ名をクリックします。
3. テスト対象のプロダクトを選択します。
4. **Subscription Pricing** までスクロールし、**Current Pricing for New Subscribers** セクションを展開します。
5. 必要な価格がすべて表示されていることを確認します。
## ステップ 5. アプリの有料ステータス、銀行口座、税務フォームがアクティブであることを確認する \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. [**App Store Connect**](https://appstoreconnect.apple.com/) のホームページで **Business** をクリックします。
2. 会社名を選択します。
3. スクロールして、**Paid Apps Agreement**、**Bank Account**、**Tax forms** がいずれも **Active** になっていることを確認します。
以上の手順を実施することで、`InvalidProductIdentifiers` 警告を解消し、プロダクトをストアで公開できるようになります。
## ステップ 6. 解決しない場合はプロダクトを作り直す \{#step-6-recreate-the-product-if-its-stuck\}
ステップ 1〜5 をすべてクリアしても — ステータスが `Approved`、バンドル ID が一致、API キーが有効 — SDK が依然として `1000 noProductIDsFound` を返す場合があります。この場合、プロダクトが Apple のレジストリで詰まっている可能性があります。App Store Connect の UI 上にはプロダクトが存在しているにもかかわらず、StoreKit のルックアップパスに公開されていない状態になることがあります。
App Store Connect でそのプロダクトを削除し、同じプロダクト ID で再作成してください。再作成後、反映されるまで最大 24 時間かかる場合があります。
---
# File: cantMakePayments-flutter
---
---
title: "Flutter SDKにおけるコード1003 cantMakePaymentエラーの修正"
description: "Adaptyでサブスクリプションをサブスクリプションをサブスクリプションをサブスクリプションをサブスクリプションを管理する際のアプリ内課金エラーを解消します。"
---
1003エラー(`cantMakePayments`)は、このデバイスでアプリ内課金ができないことを示しています。
`cantMakePayments`エラーが発生している場合、通常は以下のいずれかの原因が考えられます:
- デバイスの制限:このエラーはAdaptyとは無関係です。以下の解決方法を参照してください。
- オブザーバーモードの設定:`makePurchase`メソッドとオブザーバーモードは同時に使用できません。以下のセクションを参照してください。
## 問題:デバイスの制限 \{#issue-device-restrictions\}
| 問題 | 解決方法 |
|-----------------------------|---------------------------------------------------------|
| スクリーンタイムの制限 | [スクリーンタイム](https://support.apple.com/en-us/102470)でアプリ内課金の制限を無効にする |
| アカウントの停止 | Appleサポートに連絡してアカウントの問題を解決する |
| 地域の制限 | 対応地域のApp Storeアカウントを使用する |
## 問題:オブザーバーモードとmakePurchaseの併用 \{#issue-using-both-observer-mode-and-makepurchase\}
購入処理に`makePurchase`を使用している場合、オブザーバーモードを使用する必要はありません。[オブザーバーモード](observer-vs-full-mode)が必要なのは、購入ロジックを自分で実装する場合のみです。
したがって、`makePurchase`を使用している場合は、SDK有効化コードからオブザーバーモードの有効化を安全に削除できます。
---
# File: migration-to-flutter-sdk-v4
---
---
title: "Adapty Flutter SDK を v. 4.0 へ移行する"
description: "ペイウォール API をフロー API に置き換えることで Adapty Flutter SDK v4.0 へ移行します。Flow Builder と Paywall Builder の両方に対応しています。"
---
Adapty Flutter SDK 4.0 ではフローが導入され、ペイウォール API の名称が変更されました。新しい API は新しい Flow Builder と既存の Paywall Builder の両方に対応しており、Adapty ダッシュボード側の設定変更は不要です。
## クイックリファレンス \{#quick-reference\}
| v3 | v4 |
|---|---|
| `Adapty().getPaywall(placementId: id)` | `Adapty().getFlow(placementId: id)` |
| `Adapty().getPaywallForDefaultAudience(placementId: id)` | `Adapty().getFlowForDefaultAudience(placementId: id)` |
| `Adapty().getPaywallProducts(paywall: paywall)` | `Adapty().getPaywallProducts(flow: flow)` |
| `Adapty().logShowPaywall(paywall: paywall)` | `Adapty().logShowFlow(flow: flow)` |
| `AdaptyPaywall`(型) | `AdaptyFlow` |
| `AdaptyPaywallFetchPolicy`(型) | `AdaptyFlowFetchPolicy` |
| `AdaptyUI().createPaywallView(paywall: paywall)` | `AdaptyUI().createFlowView(flow: flow)` |
| `AdaptyUIPaywallView`(型) | `AdaptyUIFlowView` |
| `AdaptyUIPaywallPlatformView`(ウィジェット) | `AdaptyUIFlowPlatformView` |
| `AdaptyUI().presentPaywallView(view)` / `dismissPaywallView(view)` | `AdaptyUI().presentFlowView(view)` / `dismissFlowView(view)` |
| `AdaptyUIPaywallsEventsObserver` | `AdaptyUIFlowsEventsObserver` |
| `AdaptyUI().setPaywallsEventsObserver(observer)` | `AdaptyUI().setFlowsEventsObserver(observer)` |
| `paywallViewDid*` コールバック | `flowViewDid*` コールバック |
| `paywallViewDidFailRendering` | `flowViewDidReceiveError` |
`AdaptyPaywallProduct` はそのまま名前が変わりません。プロダクトは引き続きフローに属しており、`getPaywallProducts` は `AdaptyFlow` を受け取るようになりました。フローを取得する際に `locale` を渡す必要はなくなりました。購入とプロファイル関連のAPI(`makePurchase`、`restorePurchases`、`getProfile`、`identify` など)は変更なし、ビューメソッド(`present`、`dismiss`、`showDialog`)も変わりません。一部のデフォルト動作が変更されています。詳しくは[デフォルト動作の変更](#default-behavior-changes)をご覧ください。
## 最小バージョン \{#minimum-versions\}
Adapty Flutter SDK 4.0 では、最小要件が引き上げられました:
- **iOS 15.0** — iOS の最小デプロイメントターゲット(iOS 13.0 から引き上げ)。
- **Xcode 26** 以降 — ネイティブ iOS SDK は Swift tools 6.2 を使用します。
- **Flutter 3.32.0**(Dart 3.8.0)以降。
## インストール \{#installation\}
### パッケージを更新する \{#update-the-package\}
インストールするパッケージは、アプリがキッズモードを使用しているかどうかによって異なります。
ほとんどのアプリでは、`pubspec.yaml` の `adapty_flutter` を v4.0 に更新します:
```yaml showLineNumbers title="pubspec.yaml"
dependencies:
adapty_flutter: 4.0.0
```
アプリがキッズモードを使用している場合は、代わりに `adapty_flutter_kids` を指定します:
```yaml showLineNumbers title="pubspec.yaml"
dependencies:
adapty_flutter_kids: 4.0.0
```
これは**スタンドアロン**パッケージで、IDFAおよび広告トラッキングコードを削除してApp Storeの要件に準拠します。Dartのインポートパスを`package:adapty_flutter_kids/adapty_flutter.dart`に更新してください。それ以外の移行手順は通常パッケージとまったく同じです。
キッズモードでは、Adapty ダッシュボードでIPアドレス収集を無効にする必要があります。詳細なセットアップ手順は[キッズモード](kids-mode-flutter)を参照してください。
### iOS:ネイティブSDKはSwift Package Manager経由で配布されるようになりました \{#ios-native-sdks-now-come-through-swift-package-manager\}
[CocoaPodsのスペックリポジトリは2026年12月に読み取り専用になります](https://blog.cocoapods.org/CocoaPods-Specs-Repo/)。そのため、v4からはネイティブiOS SDKの**CocoaPodsによる配布が終了**し、プラグインは**Swift Package Manager**のみを通じて配布されます。
Flutter 3.32〜3.43をお使いの場合は、Swift Package Managerのサポートを一度有効化してください:
```bash
flutter config --enable-swift-package-manager
```
Flutter 3.44以降ではSwift Package Managerがデフォルトで有効になっているため、特別な操作は不要です。
## フローの取得 \{#fetching-flows\}
### getPaywall → getFlow
返り値の型が `AdaptyPaywall` から `AdaptyFlow` に変わり、`locale` を渡す必要がなくなりました — フローをレンダリングする際にローカライズは自動的に解決され、カスタムペイウォールの場合はすべての設定済みロケールが `flow.remoteConfigs` に返されます。
```diff showLineNumbers
- final paywall = await Adapty().getPaywall(placementId: 'YOUR_PLACEMENT_ID', locale: 'en');
+ final flow = await Adapty().getFlow(placementId: 'YOUR_PLACEMENT_ID');
```
`getPaywallForDefaultAudience` も同様にリネームされています。
```diff showLineNumbers
- final paywall = await Adapty().getPaywallForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID', locale: 'en');
+ final flow = await Adapty().getFlowForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID');
```
フェッチポリシーの型名が `AdaptyPaywallFetchPolicy` から `AdaptyFlowFetchPolicy` に変更されました。オプション(`reloadRevalidatingCacheData`、`returnCacheDataElseLoad`、`returnCacheDataIfNotExpiredElseLoad`)は変更ありません。
### getPaywallProducts(paywall) → getPaywallProducts(flow)
`getPaywallProducts` は名前はそのままですが、`flow` パラメーターで `AdaptyFlow` を受け取るようになりました:
```diff showLineNumbers
- final products = await Adapty().getPaywallProducts(paywall: paywall);
+ final products = await Adapty().getPaywallProducts(flow: flow);
```
## データモデル \{#data-model\}
`getFlow` は `AdaptyPaywall` の代わりに `AdaptyFlow` を返し、オブジェクトの構造が変わりました。
| v3 `AdaptyPaywall` メンバー | v4 `AdaptyFlow` メンバー | アクション |
|---|---|---|
| `remoteConfig`(単一、nullable) | `remoteConfigs`(リスト) | フローは設定された言語ごとに1つのリモートコンフィグを持ちます。`remoteConfig` ゲッターは引き続き存在し、最初のエントリを返します。特定の言語を選択するには、`remoteConfigs` を `locale` で検索してください。 |
| `productIdentifiers` | `productIdentifiers` | 維持されていますが、フローのすべてのペイウォールバリエーションを横断して収集されるようになりました。バリエーションごとの識別子は `flow.paywalls[i].productIdentifiers` に格納されています。 |
| `hasViewConfiguration` | `hasViewConfiguration` | 変更なし。 |
| `placementId`(非推奨) | 削除済み | `flow.placement.id` を使用してください。 |
| `revision`(非推奨) | 削除済み | `flow.placement.revision` を使用してください。 |
| `vendorProductIds`(非推奨) | 削除済み | `productIdentifiers` を使用してください。 |
| _(新規)_ | `paywalls`(`AdaptyFlowPaywall` のリスト) | 各エントリはフロー内の1つのペイウォールバリエーションで、独自の `name`、`variationId`、および `productIdentifiers` を持ちます。 |
`AdaptyPaywallViewConfiguration` は非公開になりました — ビュー設定は不透明になりました。この型への参照をすべて削除してください。
## Webペイウォールメソッド \{#web-paywall-methods\}
`openWebPaywall` と `createWebPaywallUrl` の名前はそのままですが、`paywall` パラメータは `AdaptyPaywall` の代わりに `AdaptyFlowPaywall`(フローのバリアント)を受け取るようになりました。引き続き `AdaptyPaywallProduct` を渡すこともできます。
```diff showLineNumbers
final flow = await Adapty().getFlow(placementId: 'YOUR_PLACEMENT_ID');
- await Adapty().openWebPaywall(paywall: paywall);
+ if (flow.paywalls.isNotEmpty) {
+ await Adapty().openWebPaywall(paywall: flow.paywalls[0]);
+ }
```
## フローのビュー数を追跡する \{#tracking-flow-views\}
### logShowPaywall → logShowFlow
`logShowPaywall` は `logShowFlow` に名前が変更され、`AdaptyFlow` を受け取るようになりました。イベントは引き続き同じバリアントに対して記録されるため、既存のファネルおよび A/B テストの指標はダッシュボードの変更なしにそのまま機能します。
```diff showLineNumbers
- await Adapty().logShowPaywall(paywall: paywall);
+ await Adapty().logShowFlow(flow: flow);
```
v3 と同様に、[フロービルダー](adapty-flow-builder) または [ペイウォールビルダー](adapty-paywall-builder) でレンダリングされたフローやペイウォールを表示する際には、このメソッドを呼び出す必要はありません。Adapty がそれらのビューを自動的にトラッキングします。
## フローの表示 \{#displaying-flows\}
### createPaywallView → createFlowView
メソッド名を変更し、`AdaptyFlow` を `flow` パラメータで渡します。その他のパラメータ(`loadTimeout`、`preloadProducts`、`customTags`、`customTimers`、`customAssets`、`productPurchaseParams`)や、ビューのメソッド(`present`、`dismiss`、`showDialog`)は変更ありません:
```diff showLineNumbers
- final view = await AdaptyUI().createPaywallView(paywall: paywall);
+ final view = await AdaptyUI().createFlowView(flow: flow);
await view.present();
```
### AdaptyUIPaywallView → AdaptyUIFlowView
ビュータイプの名前が変更されました。非推奨の `paywallVariationId` プロパティは削除されました — 代わりに `variationId` を使用してください:
```diff showLineNumbers
- void flowViewDidAppear(AdaptyUIPaywallView view) {
+ void flowViewDidAppear(AdaptyUIFlowView view) {
```
### AdaptyUIPaywallPlatformView → AdaptyUIFlowPlatformView
ウィジェットツリーにビューをウィジェットとして埋め込む場合は、名前を変更して `flow` パラメータを渡してください。イベントコールバック(`onDidAppear`、`onDidFinishPurchase` など)は名前がそのまま引き継がれます:
```diff showLineNumbers
- AdaptyUIPaywallPlatformView(
- paywall: paywall,
+ AdaptyUIFlowPlatformView(
+ flow: flow,
onDidFinishPurchase: (view, product, purchaseResult) { /* … */ },
)
```
:::note
`createFlowView` で作成したフロービューは使い捨てです。`dismiss()` を呼び出すと、ビューはメモリから解放され、再表示できなくなります。フローをもう一度表示するには、再度 `createFlowView` を呼び出してください。
:::
## イベントの処理 \{#handling-events\}
オブザーバークラスは `AdaptyUIPaywallsEventsObserver` から `AdaptyUIFlowsEventsObserver` へ、登録メソッドは `setPaywallsEventsObserver` から `setFlowsEventsObserver` へ、そしてすべての `paywallViewDid*` コールバックは `flowViewDid*` へとそれぞれリネームされました。
```diff showLineNumbers
- class MyObserver extends AdaptyUIPaywallsEventsObserver {
+ class MyObserver extends AdaptyUIFlowsEventsObserver {
@override
- void paywallViewDidPerformAction(AdaptyUIPaywallView view, AdaptyUIAction action) {
+ void flowViewDidPerformAction(AdaptyUIFlowView view, AdaptyUIAction action) {
// …
}
}
- AdaptyUI().setPaywallsEventsObserver(this);
+ AdaptyUI().setFlowsEventsObserver(this);
```
次の3つのコールバックは**必須**です — これらがないとオブザーバーはコンパイルエラーになります:
- **`flowViewDidFinishPurchase`**: v3 ではオプションで、デフォルトでは購入後にビューが閉じられていました。現在は、フローを続けるか `view.dismiss()` を呼び出すかを自分で決定します。
- **`flowViewDidFinishRestore`**: v3 と同様に必須です。
- **`flowViewDidReceiveError`**: `paywallViewDidFailRendering` を置き換え、その他のビューエラーも受け取るようになりました。
その他の小さな変更点が 2 つあります:
- `setFlowsEventsObserver`(および `setOnboardingsEventsObserver`)が `null` を受け付けるようになり、設定済みのオブザーバーを取り外せるようになりました。これにより、SDK がオブザーバーを保持し続けることがなくなります。
- 新しいオプションの `flowViewDidReceiveAnalyticEvent` コールバックは、フローからのカスタム分析イベント用に予約されています。現時点ではフローからこのコールバックがコードに送出されることはないため、実装する必要はありません。
v4 ではオプトインで利用できる新機能も追加されています。
- `AdaptyUI().setObserverModeResolver(...)` と `AdaptyUIObserverModeResolver` — SDKが[オブザーバーモード](implement-observer-mode-flutter)で動作中に、フローから開始された購入やリストアを処理します。以前はネイティブのiOSおよびAndroid SDKでのみ利用可能でした。[オブザーバーモードでフローを表示する](flutter-present-flows-in-observer-mode)を参照してください。
- `AdaptyUI().setSystemRequestsHandler(...)` と `AdaptyUISystemRequestsHandler` — フローからのシステムリクエスト(OSの権限プロンプトやApp Storeのレビューリクエスト)用に予約されています。フローはまだこれらのリクエストをトリガーしないため、ハンドラーを登録する必要はありません。
## 削除された API \{#removed-apis\}
これらのシンボルは 3.x で非推奨となり、v4 では削除されています:
### setFallbackPaywalls → setFallback
```diff showLineNumbers
- await Adapty().setFallbackPaywalls(assetId);
+ await Adapty().setFallback(assetId);
```
### withIdfaCollectionDisabled → withAppleIdfaCollectionDisabled
```diff showLineNumbers
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
- ..withIdfaCollectionDisabled(true),
+ ..withAppleIdfaCollectionDisabled(true),
```
### その他の削除されたメンバー \{#other-removed-members\}
- **`AdaptyPurchaseResultSuccess.jwsTransaction`**: `appleJwsTransaction` を使用してください。
- **`AdaptyUIFlowView.paywallVariationId`**: `variationId` を使用してください。
- **`AdaptyUIObserver` と `AdaptyUI().setObserver(...)`**: `AdaptyUIFlowsEventsObserver` と `setFlowsEventsObserver(...)` を使用してください。
## デフォルト動作の変更 \{#default-behavior-changes\}
これらの変更はコンパイルエラーを引き起こしませんが、実行時にテストしてください:
- **購入成功時**: v3 では `paywallViewDidFinishPurchase` のデフォルト動作でビューが閉じられていましたが、v4 では `flowViewDidFinishPurchase` が必須となり、デフォルトの動作はありません。ビューを閉じたい場合は自分でその処理を実装してください。
- **Android システムの戻るボタン**: デフォルトではフローを閉じなくなりました。このアクションは `AndroidSystemBackAction` として `flowViewDidPerformAction` に渡されるため、戻るボタンでフローを閉じたい場合はそこで処理してください。
- **URL を開く処理**: `flowViewDidPerformAction` のデフォルト動作が変更され、`CloseAction` 時のビュー閉鎖に加え、`OpenUrlAction` をネイティブに処理する(ダッシュボードで設定されたアプリ内ブラウザまたは外部ブラウザの設定に従う)ようになりました。URL を独自に処理したい場合はコールバックをオーバーライドしてください。
- **ビューのエラー**: `flowViewDidReceiveError` が必須となり、ビューを閉じるかどうかはご自身の実装次第です。v3 でレンダリングエラー時に自動的にビューが閉じられる動作に依存していた場合は、このコールバック内で `view.dismiss()` を呼び出してください。
- **ビューのライフサイクル**: フローまたはオンボーディングのビューを閉じると、そのビューはメモリから解放されます。一度閉じたビューは再表示できないため、新しいビューを作成してください。
## オンボーディング API の廃止 \{#onboarding-api-deprecation\}
レガシーオンボーディング API は v4.0 で廃止され、[Flow Builder](adapty-flow-builder) に移行されました。引き続き動作しますが、`@Deprecated` アノテーションにより IDE が廃止シンボルをフラグとして表示します(ランタイム警告は発生しません)。これらのシンボルは将来のリリースで削除される予定ですので、オンボーディングの Flow Builder への移行を計画してください。
非推奨のシンボル: `getOnboarding`、`getOnboardingForDefaultAudience`、`createOnboardingView`、`presentOnboardingView`、`dismissOnboardingView`、`setOnboardingsEventsObserver`、`AdaptyOnboarding`、`AdaptyUIOnboardingView`、`AdaptyUIOnboardingPlatformView`、`AdaptyUIOnboardingsEventsObserver`、およびオンボーディングの状態・入力・アナリティクスモデル。
---
# File: flutter-migration-guide-310
---
---
title: "Flutter Adapty SDK 3.10.0 への移行ガイド"
description: ""
---
Adapty SDK 3.10.0 はメジャーリリースであり、いくつかの改善が含まれていますが、移行作業が必要になる場合があります。
1. `makePurchase` メソッドを、個別のパラメーターの代わりに `AdaptyPurchaseParameters` を使用するように更新する。
2. `AdaptyPaywall` モデル内の `vendorProductIds` を `productIdentifiers` に置き換える。
## makePurchase メソッドの更新 \{#update-makepurchase-method\}
`makePurchase` メソッドは、個別の `subscriptionUpdateParams` および `isOfferPersonalized` 引数の代わりに `AdaptyPurchaseParameters` を使用するようになりました。これにより、型の安全性が向上し、将来的に購入パラメーターを拡張しやすくなります。
```diff showLineNumbers
- final purchaseResult = await adapty.makePurchase(
- product: product,
- subscriptionUpdateParams: subscriptionUpdateParams,
- isOfferPersonalized: true,
- );
+ final parameters = AdaptyPurchaseParametersBuilder()
+ ..setSubscriptionUpdateParams(subscriptionUpdateParams)
+ ..setIsOfferPersonalized(true)
+ ..setObfuscatedAccountId('your-account-id')
+ ..setObfuscatedProfileId('your-profile-id');
+ final purchaseResult = await adapty.makePurchase(
+ product: product,
+ parameters: parameters.build(),
+ );
```
追加のパラメーターが不要な場合は、次のようにシンプルに記述できます。
```dart showLineNumbers
final purchaseResult = await adapty.makePurchase(
product: product,
);
```
## AdaptyPaywall モデルの使用方法の更新 \{#update-adaptypaywall-model-usage\}
`vendorProductIds` プロパティは非推奨となり、`productIdentifiers` が推奨されるようになりました。新しいプロパティは、単純な文字列の代わりに `AdaptyProductIdentifier` オブジェクトを返すため、プロダクト情報がより構造化されています。
```diff showLineNumbers
- paywall.vendorProductIds.map((vendorId) =>
- ListTextTile(title: vendorId)
- ).toList()
+ paywall.productIdentifiers.map((productId) =>
+ ListTextTile(title: productId.vendorProductId)
+ ).toList()
```
`AdaptyProductIdentifier` オブジェクトは `vendorProductId` プロパティを通じてベンダープロダクト ID にアクセスでき、同等の機能を維持しながら将来の拡張に向けてより良い構造を提供します。
## 後方互換性 \{#backward-compatibility\}
どちらの変更も後方互換性を維持しています。
- `makePurchase` の旧パラメーターは非推奨ですが、引き続き機能します
- `vendorProductIds` プロパティは非推奨ですが、引き続きアクセス可能です
- 既存のコードは動作し続けますが、非推奨の警告が表示されます
新しい API を使用するようにコードを更新することを推奨します。これにより、将来の互換性が確保され、改善された型の安全性と拡張性のメリットを活用できます。
---
# File: flutter-migration-guide-38
---
---
title: "Adapty Flutter SDK を v3.8 へ移行する"
description: "Adapty Flutter SDK v3.8 へ移行して、パフォーマンス向上と新しいマネタイズ機能を利用しましょう。"
---
Adapty SDK 3.8.0 はメジャーリリースで、いくつかの改善が加えられています。ただし、移行作業が必要になる場合があります。
1. オブザーバークラスとメソッド名を更新する。
2. フォールバックペイウォールのメソッド名を更新する。
3. イベントハンドリングメソッドのビュークラス名を更新する。
## オブザーバークラスとメソッド名を更新する \{#update-observer-class-and-method-names\}
オブザーバークラスとその登録メソッドの名前が変更されました:
```diff showLineNumbers
- class MyObserver extends AdaptyUIObserver {
+ class MyObserver extends AdaptyUIPaywallsEventsObserver {
@override
void paywallViewDidPerformAction(AdaptyUIView view, AdaptyUIAction action) {
// Handle action
}
}
// Register observer
- AdaptyUI().setObserver(this);
+ AdaptyUI().setPaywallsEventsObserver(this);
```
## フォールバックペイウォールのメソッド名を更新する \{#update-fallback-paywalls-method-name\}
フォールバックペイウォールを設定するメソッドが簡略化されました:
```diff showLineNumbers
try {
- await Adapty.setFallbackPaywalls(assetId);
+ await Adapty.setFallback(assetId);
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
// handle the error
}
```
## イベントハンドリングメソッドのビュークラス名を更新する \{#update-view-class-name-in-event-handling-methods\}
すべてのイベントハンドリングメソッドで、`AdaptyUIView` の代わりに新しい `AdaptyUIPaywallView` クラスが使用されるようになりました:
```diff showLineNumbers
- void paywallViewDidPerformAction(AdaptyUIView view, AdaptyUIAction action)
+ void paywallViewDidPerformAction(AdaptyUIPaywallView view, AdaptyUIAction action)
- void paywallViewDidSelectProduct(AdaptyUIView view, AdaptyPaywallProduct product)
+ void paywallViewDidSelectProduct(AdaptyUIPaywallView view, AdaptyPaywallProduct product)
- void paywallViewDidStartPurchase(AdaptyUIView view, AdaptyPaywallProduct product)
+ void paywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product)
- void paywallViewDidFinishPurchase(AdaptyUIView view, AdaptyPaywallProduct product, AdaptyProfile profile)
+ void paywallViewDidFinishPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyProfile profile)
- void paywallViewDidFailPurchase(AdaptyUIView view, AdaptyPaywallProduct product, AdaptyError error)
+ void paywallViewDidFailPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyError error)
- void paywallViewDidFinishRestore(AdaptyUIView view, AdaptyProfile profile)
+ void paywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile)
- void paywallViewDidFailRestore(AdaptyUIView view, AdaptyError error)
+ void paywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error)
- void paywallViewDidFailLoadingProducts(AdaptyUIView view, AdaptyIOSProductsFetchPolicy? fetchPolicy, AdaptyError error)
+ void paywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyIOSProductsFetchPolicy? fetchPolicy, AdaptyError error)
- void paywallViewDidFailRendering(AdaptyUIView view, AdaptyError error)
+ void paywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error)
```
---
# File: migration-to-flutter-sdk-34
---
---
title: "Adapty Flutter SDK を v3.4 に移行する"
description: "パフォーマンス向上と新しいマネタイズ機能のために Adapty Flutter SDK v3.4 に移行します。"
---
Adapty SDK 3.4.0 はメジャーリリースであり、お客様側での移行手順が必要な改善が含まれています。
## フォールバックペイウォールファイルを更新する \{#update-fallback-paywall-files\}
新しい SDK バージョンとの互換性を確保するため、フォールバックペイウォールファイルを更新してください。
1. Adapty ダッシュボードから[更新されたフォールバックペイウォールファイルをダウンロード](fallback-paywalls)します。
2. モバイルアプリ内の既存のフォールバックペイウォールを[新しいファイルに置き換え](flutter-use-fallback-paywalls)ます。
## オブザーバーモードの実装を更新する \{#update-implementation-of-observer-mode\}
オブザーバーモードを使用している場合は、その実装を更新してください。
以前は、トランザクションを Adapty に報告するために異なるメソッドが使用されていました。新しいバージョンでは、Android と iOS の両方で `reportTransaction` メソッドを一貫して使用する必要があります。このメソッドは各トランザクションを Adapty に明示的に報告し、認識されることを保証します。ペイウォールが使用された場合は、バリエーション ID を渡してトランザクションをペイウォールに紐付けてください。
:::warning
**トランザクションの報告をスキップしないでください!**
`reportTransaction` を呼び出さない場合、Adapty はトランザクションを認識せず、アナリティクスに表示されず、インテグレーションにも送信されません。
:::
```diff showLineNumbers
- // every time when calling transaction.finish()
- if (Platform.isAndroid) {
- try {
- await Adapty().restorePurchases();
- } on AdaptyError catch (adaptyError) {
- // handle the error
- } catch (e) {
- }
- }
try {
// every time when calling transaction.finish()
await Adapty().reportTransaction(
"YOUR_TRANSACTION_ID",
variationId: "PAYWALL_VARIATION_ID", // optional
);
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
// handle the error
}
```
---
# File: migration-to-flutter330
---
---
title: "Adapty Flutter SDK を v3.3 に移行する"
description: "パフォーマンス向上と新しいマネタイズ機能のために Adapty Flutter SDK v3.3 に移行します。"
---
Adapty SDK 3.3.0 はメジャーリリースであり、いくつかの改善が加えられましたが、移行作業が必要になる場合があります。
1. フォールバックペイウォールを提供するメソッドを更新する。
2. `getProductsIntroductoryOfferEligibility` メソッドを削除する。
3. Adjust、AirBridge、Amplitude、AppMetrica、Appsflyer、Branch、Facebook Ads、Firebase and Google Analytics、Mixpanel、OneSignal、Pushwoosh のインテグレーション設定を更新する。
4. Observer モードの実装を更新する。
## フォールバックペイウォールを提供するメソッドを更新する \{#update-method-for-providing-fallback-paywalls\}
以前は、メソッドにフォールバックペイウォールを JSON 文字列(`jsonString`)として渡していましたが、現在はローカルのフォールバックファイルへのパス(`assetId`)を渡すように変更されました。
```diff showLineNumbers
import 'dart:async' show Future;
import 'dart:io' show Platform;
-import 'package:flutter/services.dart' show rootBundle;
-final filePath = Platform.isIOS ? 'assets/ios_fallback.json' : 'assets/android_fallback.json';
-final jsonString = await rootBundle.loadString(filePath);
+final assetId = Platform.isIOS ? 'assets/ios_fallback.json' : 'assets/android_fallback.json';
try {
- await adapty.setFallbackPaywalls(jsonString);
+ await adapty.setFallbackPaywalls(assetId);
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
}
```
完全なコード例については、[フォールバックペイウォールを使用する](flutter-use-fallback-paywalls)ページをご覧ください。
## `getProductsIntroductoryOfferEligibility` メソッドを削除する \{#remove-getproductsintroductoryoffereligibility-method\}
Adapty iOS SDK 3.3.0 より前は、ユーザーが適格かどうかに関わらず、プロダクトオブジェクトには常にオファーが含まれていました。そのため、オファーを使用する前に適格性を手動で確認する必要がありました。
現在は、ユーザーが適格な場合にのみプロダクトオブジェクトにオファーが含まれます。つまり、適格性を確認する必要がなくなりました。オファーが存在していれば、ユーザーは適格です。
## サードパーティインテグレーションの SDK 設定を更新する \{#update-third-party-integration-sdk-configuration\}
Adapty Flutter SDK 3.3.0 以降でインテグレーションが正しく動作するよう、以下のセクションに従って各インテグレーションの SDK 設定を更新してください。
### Adjust
以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[Adjust インテグレーションの SDK 設定](adjust#connect-your-app-to-adjust)をご覧ください。
```diff showLineNumbers
import 'package:adjust_sdk/adjust.dart';
import 'package:adjust_sdk/adjust_config.dart';
try {
final adid = await Adjust.getAdid();
if (adid == null) {
// handle the error
}
+ await Adapty().setIntegrationIdentifier(
+ key: "adjust_device_id",
+ value: adid,
+ );
final attributionData = await Adjust.getAttribution();
var attribution = Map[オブザーバーモード](observer-vs-full-mode)を制御する真偽値です。購入とサブスクリプションの状態を自分で管理し、サブスクリプションイベントの送信と分析に Adapty を使用する場合は有効にしてください。
デフォルト値は `false` です。
🚧 オブザーバーモードで動作している場合、Adapty SDK はトランザクションをクローズしないため、自前で処理する必要があります。
| | **withCustomerUserId** | 任意 | 自社システムにおけるユーザーの識別子です。サブスクリプションおよび分析イベントに含めて送信し、イベントを正しいプロファイルに紐付けます。[**Profiles and Segments**](https://app.adapty.io/profiles/users) メニューで `customerUserId` によるユーザー検索も可能です。 | | **withIdfaCollectionDisabled** | 任意 |IDFA の収集と共有を無効にするには `true` を設定します。
ユーザーの IP アドレス共有も無効になります。
デフォルト値は `false` です。
IDFA 収集の詳細については、[Analytics integration](analytics-integration#disable-collection-of-advertising-identifiers) セクションをご参照ください。
| | **withIpAddressCollectionDisabled** | 任意 |ユーザーの IP アドレスの収集と共有を無効にするには `true` を設定します。
デフォルト値は `false` です。
| ### Adapty SDK の AdaptyUI モジュールをアクティベートする \{#activate-adaptyu-module-of-adapty-sdk\} AdaptyUI モジュールの設定が必要なのは、[ペイウォールビルダー](adapty-paywall-builder)を使用する予定がある場合のみです。 ```dart showLineNumbers title="Dart" try { final mediaCache = AdaptyUIMediaCacheConfiguration( memoryStorageTotalCostLimit: 100 * 1024 * 1024, // 100MB memoryStorageCountLimit: 2147483647, // 2^31 - 1, max int value in Dart diskStorageSizeLimit: 100 * 1024 * 1024, // 100MB ); await AdaptyUI().activate( configuration: AdaptyUIConfiguration(mediaCache: mediaCache), observer:
### ログイン/サインアップ時 \{#during-loginsignup\}
アプリ起動後にユーザーを識別する場合(たとえば、アプリへのログイン後やサインアップ後)、`identify`メソッドを使用してカスタマーユーザーIDを設定します。
- **このカスタマーユーザーIDを以前使用したことがない**場合、Adaptyは自動的に現在のプロファイルに紐付けます。
- **このカスタマーユーザーIDでユーザーを以前識別したことがある**場合、AdaptyはそのカスタマーユーザーIDに紐付いたプロファイルに切り替えます。
:::important
カスタマーユーザーIDはユーザーごとに一意である必要があります。パラメーター値をハードコードすると、すべてのユーザーが同一として扱われます。
:::
他のSDKメソッドを呼び出す前に、必ず`identify`を`await`してください。並列呼び出しを行うと`#3006 profileWasChanged`が発生するか、匿名プロファイルが対象になります。詳細は[iOS SDKの呼び出し順序](ios-sdk-call-order)を参照してください。
デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュデータを返します。この方法を推奨するのは、ユーザーが常に最新のデータを受け取れるためです。
ただし、ユーザーが不安定なインターネット環境を利用していると想定される場合は、`.returnCacheDataElseLoad` を使用することを検討してください。これにより、キャッシュが存在する場合はキャッシュデータを返します。この場合、最新のデータが取得できないことがありますが、通信環境に左右されずに読み込み時間を短縮できます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けたい場面での使用も安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストールや手動でのクリアを行った場合にのみ削除されます。
Adapty SDK はペイウォールをローカルに2つの層で保存しています。1つは上記の定期更新キャッシュ、もう1つは[フォールバックペイウォール](fallback-paywalls)です。また、CDN を使用してペイウォールをより高速に取得し、CDN に接続できない場合のスタンドアロンフォールバックサーバーも用意しています。このシステムは、常にペイウォールの最新バージョンを取得しつつ、インターネット接続が不安定な場合でも信頼性を確保するよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
まれに、内部で複数のリクエストが発生する場合があるため、`loadTimeout` に指定した時間よりわずかに遅くタイムアウトすることがあります。
| レスポンスパラメーター: | パラメーター | 説明 | | :-------- | :---------- | | Flow | プレースメント、識別子(`id`、`variationId`)、名前、リモートコンフィグ、およびフローにビュー設定が含まれるかどうかを示す `hasViewConfiguration` フラグを含む `AdaptyFlow` オブジェクトです。プリロード、カスタム UI、またはプログラムによるチェック用に実際のプロダクトを取得するには、`getPaywallProducts(flow:)` を呼び出してください。 | ## ビュー設定の取得 \{#fetch-the-view-configuration\} フローまたはペイウォールを取得したら、`flow.hasViewConfiguration` を使ってビュー設定が含まれているかどうかを確認します。このフラグは、Adapty ダッシュボードでプレースメントがどのように設計されたかを示します。 - **`true`** — プレースメントが **Flow Builder**(フロー)または **Paywall Builder**(ペイウォール)で設計されています。Adapty が UI をレンダリングします。以降の手順に従い、ビュー設定を取得して[フローまたはペイウォールを表示](ios-present-paywalls)してください。 - **`false`** — プレースメントはビルダー UI を持たないカスタムペイウォールです。 `getFlowConfiguration` メソッドを使用してビュー設定を読み込みます。 ```swift showLineNumbers guard flow.hasViewConfiguration else { // handle as remote config paywall return } let flowConfiguration = try await AdaptyUI.getFlowConfiguration(forFlow: flow) ``` パラメーター: | パラメーター | 必須/任意 | 説明 | | :----------------------- | :------------- | :---------- | | **forFlow** | 必須 | `Adapty.getFlow` で取得した `AdaptyFlow` オブジェクト。 | | **locale** |任意
デフォルト: `nil`
| [ペイウォールのローカライズ](add-paywall-locale-in-adapty-paywall-builder)の識別子。`-` で区切られた1つまたは2つのサブタグを持つ言語コードで指定します(例: `en`、`pt-br`)。詳細は[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。 | | **loadTimeout** | デフォルト: 5秒 | このメソッドのタイムアウトを制限する値です。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。内部で複数のリクエストが発生する場合があるため、`loadTimeout` で指定した時間よりわずかに遅れてタイムアウトすることがあります。 | | **products** | 任意 | 画面上のプロダクト表示タイミングを最適化するために、`AdaptyPaywallProduct` オブジェクトの配列を指定します。`nil` を渡すと、AdaptyUI が必要なプロダクトを自動的に取得します。 | | **systemRequestsHandler** | 任意 | フローのアクションによってトリガーされるシステムの権限リクエストやレビューリクエストを処理する、`AdaptySystemRequestsHandler` に準拠したオブジェクト。フローにそのようなアクションが含まれる場合にのみ必要です。 | | **assetsResolver** | 任意 | フロー/ペイウォール内の画像や動画を上書きする `[String: AdaptyCustomAsset]` 辞書。詳細は[アセットのカスタマイズ](#customize-assets)を参照してください。 | | **timerResolver** | 任意 | 開発者が定義したタイマーの終了日時を提供する、`AdaptyTimerResolver` に準拠したオブジェクト。詳細は[開発者定義タイマーの設定](#set-up-developer-defined-timers)を参照してください。 | 読み込みが完了したら、[フロー/ペイウォールを表示](ios-present-paywalls)します。 ## デフォルトオーディエンスのフローまたはペイウォールを取得して高速化する \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} 通常、フローやペイウォールはほぼ瞬時に取得されるため、このプロセスの高速化を特に気にする必要はありません。ただし、オーディエンスやプレースメントが多数あり、ユーザーのインターネット接続が不安定な場合は、フローやペイウォールの取得に想定以上の時間がかかることがあります。そのような状況では、何も表示しないよりもスムーズなユーザー体験を提供するために、デフォルトのフローまたはペイウォールを表示したいと思うかもしれません。 これに対処するために、`getFlowForDefaultAudience` メソッドを使用できます。このメソッドは、指定されたプレースメントの **All Users** オーディエンス向けのフローまたはペイウォールを取得します。ただし、推奨されるアプローチは `getFlow` メソッドでフローまたはペイウォールを取得することであり、詳細は上記の[ペイウォール情報の取得](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder)セクションをご覧ください。 :::warning `getFlow` を推奨する理由 `getFlowForDefaultAudience` メソッドにはいくつかの重大な欠点があります: - **後方互換性の問題**: 異なるアプリバージョン(現在と将来)で別々のペイウォールを表示する必要がある場合、課題が生じる可能性があります。現在の(レガシー)バージョンに対応したペイウォールを設計するか、現在の(レガシー)バージョンのユーザーがレンダリングされないペイウォールで問題が発生することを許容するかのどちらかを選択することになります。 - **ターゲティングの喪失**: すべてのユーザーに **All Users** オーディエンス向けに設計された同じペイウォールが表示されるため、パーソナライズされたターゲティング(国、マーケティングアトリビューション、独自のカスタム属性に基づくものを含む)が失われます。 これらのデメリットを許容してでもフローやペイウォールの取得を高速化したい場合は、以下のように `getFlowForDefaultAudience` メソッドを使用してください。それ以外の場合は、[上記](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder)で説明した `getFlow` を使用してください。 ::: ```swift showLineNumbers Adapty.getFlowForDefaultAudience(placementId: "YOUR_PLACEMENT_ID") { result in switch result { case let .success(flow): // the requested flow case let .failure(error): // handle the error } } ``` | パラメーター | 必須/任意 | 説明 | |---------|--------|-----------| | **placementId** | 必須 | [プレースメント](placements)の識別子。Adapty ダッシュボードでプレースメントを作成した際に指定した値です。 | | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方式はユーザーが常に最新のデータを受け取れるため、こちらをお勧めします。
ただし、ユーザーのインターネット接続が不安定だと思われる場合は、`.returnCacheDataElseLoad` を使用すると、キャッシュが存在する場合にそれを返すことができます。この場合、ユーザーが最新データを取得できないことがありますが、接続状況に関わらず読み込みが速くなります。キャッシュはセッション中でも定期的に更新されるため、ネットワークリクエストを避ける目的でのキャッシュ使用は安全です。
なお、キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップ時にのみ削除されます。
| ## アセットのカスタマイズ \{#customize-assets\} ペイウォール/フローの画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像と動画には事前定義済みのID(`hero_image`と`hero_video`)が割り当てられています。カスタムアセットバンドルでは、これらのIDを使って各要素を指定し、動作をカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定する](custom-media)必要があります。 たとえば、次のようなことができます。 - 一部のユーザーに別の画像や動画を表示する。 - リモートのメイン画像の読み込み中に、ローカルのプレビュー画像を表示する。 - 動画を再生する前にプレビュー画像を表示する。 - 動画が読み込まれる前にプレイヤーがレイアウトスペースを確保できるよう、動画のピクセル解像度を指定する(アスペクト比 = `width / height`)。スキップするには `nil` を渡す。 カスタムアセットをシンプルな辞書で提供する方法の例を以下に示します: ```swift showLineNumbers let customAssets: [String: AdaptyCustomAsset] = [ // Show a local image using a custom ID "custom_image": .image( .uiImage(value: UIImage(named: "image_name")!) ), // Show a local preview image while a remote main image is loading "hero_image": .image( .remote( url: URL(string: "https://example.com/image.jpg")!, preview: UIImage(named: "preview_image") ) ), // Show a local video with a preview image and a known resolution "hero_video": .video( .file( url: Bundle.main.url(forResource: "custom_video", withExtension: "mp4")!, preview: .uiImage(value: UIImage(named: "video_preview")!), resolution: CGSize(width: 1080, height: 1920) ) ), ] let flowConfig = try await AdaptyUI.getFlowConfiguration( forFlow: flow, assetsResolver: customAssets ) ``` :::note アセットが見つからない場合、ペイウォール/フローはデフォルトの外観にフォールバックします。 ::: ## 開発者定義タイマーの設定 \{#set-up-developer-defined-timers\} モバイルアプリでカスタムタイマーを使用するには、`AdaptyTimerResolver` プロトコルに準拠したオブジェクトを作成します。このオブジェクトは、各カスタムタイマーのレンダリング方法を定義します。必要であれば、このプロトコルにすでに準拠している `[String: Date]` ディクショナリを直接使用することもできます。以下に例を示します: ```swift showLineNumbers @MainActor struct AdaptyTimerResolverImpl: AdaptyTimerResolver { func timerEndAtDate(for timerId: String) -> Date { switch timerId { case "CUSTOM_TIMER_6H": Date(timeIntervalSinceNow: 3600.0 * 6.0) // 6 hours case "CUSTOM_TIMER_NY": Calendar.current.date(from: DateComponents(year: 2025, month: 1, day: 1)) ?? Date(timeIntervalSinceNow: 3600.0) default: Date(timeIntervalSinceNow: 3600.0) // 1 hour } } } ``` この例では、`CUSTOM_TIMER_NY` と `CUSTOM_TIMER_6H` は、Adapty ダッシュボードで設定した開発者定義タイマーの **Timer ID** です。`timerResolver` により、アプリは各タイマーを正しい値で動的に更新できます。例えば: - `CUSTOM_TIMER_NY`: 元日など、タイマーの終了までの残り時間。 - `CUSTOM_TIMER_6H`: ユーザーがペイウォールを開いてから始まった6時間のうち、残りの時間。任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-paywall-locale-in-adapty-paywall-builder)の識別子です。このパラメータは、マイナス(**-**)で区切られた1つまたは2つのサブタグで構成された言語コードを指定します。最初のサブタグは言語、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードの詳細と推奨される使い方については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるようになるため、この設定を推奨します。
ただし、ユーザーの通信環境が不安定な場合は、`.returnCacheDataElseLoad` を使用してキャッシュが存在する場合はキャッシュデータを返すことを検討してください。この設定では最新データが取得できないことがありますが、通信が不安定な環境でも読み込みが速くなります。キャッシュはセッション中に定期的に更新されるため、ネットワークリクエストを減らす目的でキャッシュを利用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリアによってのみ削除されます。
Adapty SDK はペイウォールをローカルに2層で保存します。1つは上記の定期更新キャッシュ、もう1つは[フォールバックペイウォール](fallback-paywalls)です。また、ペイウォールをより速く取得するために CDN を使用し、CDN に接続できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、通信環境が悪い場合でも常にペイウォールの最新バージョンを確実に取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルのフォールバックが返されます。
内部的に複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間よりもわずかに遅くタイムアウトすることがあります。
| レスポンスパラメーター: | パラメーター | 説明 | | :-------- | :---------- | | Paywall | プロダクトIDのリスト、ペイウォール識別子、リモートコンフィグ、その他いくつかのプロパティを含む [`AdaptyPaywall`](https://swift.adapty.io/documentation/adapty/adaptypaywall) オブジェクト。 | ## ペイウォールビルダーで作成したペイウォールのビュー設定を取得する \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important ペイウォールビルダーで **Show on device** トグルを有効にしてください。このオプションがオンになっていない場合、ビュー設定を取得できません。 ::: ペイウォールを取得したら、ビュー設定が含まれているかどうかを確認してください。ビュー設定が存在する場合は、そのペイウォールがペイウォールビルダーで作成されたことを意味します。これにより、ペイウォールの表示方法が決まります。ビュー設定がある場合はペイウォールビルダーのペイウォールとして扱い、ない場合は[リモートコンフィグのペイウォールとして処理してください](present-remote-config-paywalls)。 `getPaywallConfiguration` メソッドを使って、ビュー設定を読み込みます。 ```swift showLineNumbers guard paywall.hasViewConfiguration else { // use your custom logic return } do { let paywallConfiguration = try await AdaptyUI.getPaywallConfiguration( forPaywall: paywall, products: products ) // use loaded configuration } catch { // handle the error } ``` パラメーター: | パラメータ | 必須/任意 | 説明 | | :----------------------- | :------------- | :---------- | | **paywall** | 必須 | 対象のペイウォールのコントローラーを取得するための `AdaptyPaywall` オブジェクト。 | | **loadTimeout** | デフォルト: 5秒 | このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。内部で複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間よりもわずかに遅れてタイムアウトすることがあります。 | | **products** | 任意 | 画面上でのプロダクト表示タイミングを最適化するために、`AdaptyPaywallProduct` オブジェクトの配列を指定します。`nil` を渡した場合、AdaptyUI が自動的に必要なプロダクトを取得します。 | :::note 複数の言語を使用している場合は、[ペイウォールビルダーのローカライゼーションを追加する方法](add-paywall-locale-in-adapty-paywall-builder)と、ロケールコードを正しく使用する方法を[こちら](localizations-and-locale-codes)でご確認ください。 ::: 読み込みが完了したら、[ペイウォールを表示](ios-present-paywalls)してください。 ## デフォルトオーディエンス向けペイウォールを取得してより速く表示する \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} 通常、ペイウォールはほぼ瞬時に取得されるため、速度を気にする必要はありません。ただし、オーディエンスやペイウォールの数が多く、ユーザーのインターネット接続が不安定な場合は、ペイウォールの取得に想定以上の時間がかかることがあります。そのような状況では、ペイウォールをまったく表示しないよりも、デフォルトのペイウォールを表示してスムーズなユーザー体験を提供することを検討するとよいでしょう。 この問題に対処するために、`getPaywallForDefaultAudience` メソッドを使用できます。このメソッドは、指定されたプレースメントの **All Users** オーディエンス向けペイウォールを取得します。ただし、推奨されるアプローチは `getPaywall` メソッドでペイウォールを取得することであり、詳細は上記の [ペイウォール情報の取得](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder) セクションをご覧ください。 :::warning `getPaywall` を推奨する理由 `getPaywallForDefaultAudience` メソッドにはいくつかの重大な欠点があります: - **後方互換性の問題**: 異なるアプリバージョン(現行バージョンと将来のバージョン)に対して異なるペイウォールを表示する必要がある場合、課題が生じる可能性があります。現行(レガシー)バージョンに対応したペイウォールを設計するか、現行(レガシー)バージョンのユーザーがレンダリングされないペイウォールに遭遇するリスクを許容するかのどちらかを選択しなければなりません。 - **ターゲティングの喪失**: すべてのユーザーが **All Users** オーディエンス向けに設計された同じペイウォールを見ることになるため、パーソナライズされたターゲティング(国、マーケティングアトリビューション、独自のカスタム属性に基づくものを含む)が失われます。 これらのデメリットを受け入れてでもペイウォールの取得を高速化したい場合は、以下のように `getPaywallForDefaultAudience` メソッドを使用してください。そうでない場合は、[上記](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder)で説明した `getPaywall` を使用してください。 ::: ```swift showLineNumbers Adapty.getPaywallForDefaultAudience(placementId: "YOUR_PLACEMENT_ID", locale: "en") { result in switch result { case let .success(paywall): // the requested paywall case let .failure(error): // handle the error } } ``` :::note `getPaywallForDefaultAudience` メソッドは iOS SDK バージョン 2.11.2 以降で利用可能です。 ::: | パラメーター | 必須/任意 | 説明 | |---------|--------|-----------| | **placementId** | 必須 | [プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子です。このパラメーターは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードである必要があります。最初のサブタグは言語、2番目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよび推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、この設定を推奨します。
ただし、ユーザーが不安定なインターネット環境にある場合は、`.returnCacheDataElseLoad` の使用を検討してください。キャッシュが存在する場合はキャッシュデータを返すため、最新データが得られない場合もありますが、接続状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを減らす目的で安全に利用できます。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップ時にのみ削除されます。
| ## アセットのカスタマイズ \{#customize-assets\} ペイウォールの画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像と動画には、`hero_image` と `hero_video` という定義済みIDがあります。カスタムアセットバンドルでは、これらのIDを使って各要素を指定し、動作をカスタマイズできます。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定](custom-media)する必要があります。 たとえば、次のようなことができます。 - 一部のユーザーに別の画像や動画を表示する。 - リモートのメイン画像の読み込み中に、ローカルのプレビュー画像を表示する。 - 動画を再生する前にプレビュー画像を表示する。 :::important この機能を使用するには、Adapty iOS SDK をバージョン 3.7.0 以上にアップデートしてください。 ::: カスタムアセットをシンプルな辞書形式で提供する方法の例を示します: ```swift showLineNumbers let customAssets: [String: AdaptyCustomAsset] = [ // Show a local image using a custom ID "custom_image": .image( .uiImage(value: UIImage(named: "image_name")!) ), // Show a local preview image while a remote main image is loading "hero_image": .image( .remote( url: URL(string: "https://example.com/image.jpg")!, preview: UIImage(named: "preview_image") ) ), // Show a local video with a preview image "hero_video": .video( .file( url: Bundle.main.url(forResource: "custom_video", withExtension: "mp4")!, preview: .uiImage(value: UIImage(named: "video_preview")!) ) ), ] let paywallConfig = try await AdaptyUI.getPaywallConfiguration( forPaywall: paywall, assetsResolver: customAssets ) ``` :::note アセットが見つからない場合、ペイウォールはデフォルトの外観にフォールバックします。 ::: ## デベロッパー定義タイマーの設定 \{#set-up-developer-defined-timers\} モバイルアプリでカスタムタイマーを使用するには、`AdaptyTimerResolver` プロトコルに準拠したオブジェクトを作成します。このオブジェクトは、各カスタムタイマーのレンダリング方法を定義します。`[String: Date]` ディクショナリはすでにこのプロトコルに準拠しているため、直接使用することもできます。以下に例を示します。 ```swift showLineNumbers @MainActor struct AdaptyTimerResolverImpl: AdaptyTimerResolver { func timerEndAtDate(for timerId: String) -> Date { switch timerId { case "CUSTOM_TIMER_6H": Date(timeIntervalSinceNow: 3600.0 * 6.0) // 6 hours case "CUSTOM_TIMER_NY": Calendar.current.date(from: DateComponents(year: 2025, month: 1, day: 1)) ?? Date(timeIntervalSinceNow: 3600.0) default: Date(timeIntervalSinceNow: 3600.0) // 1 hour } } } ``` この例では、`CUSTOM_TIMER_NY` と `CUSTOM_TIMER_6H` は、Adapty ダッシュボードで設定した開発者定義タイマーの **Timer ID** です。`timerResolver` により、アプリは各タイマーを正しい値で動的に更新できます。例えば: - `CUSTOM_TIMER_NY`: 元日など、タイマー終了までの残り時間。 - `CUSTOM_TIMER_6H`: ユーザーがペイウォールを開いてから始まった6時間のうち、残り時間。
## ペイウォールの表示回数が多すぎる \{#the-paywall-view-number-is-too-big\}
**問題**: ペイウォールの表示回数が想定の2倍になっている。
**原因**: コード内で `logShowFlow`(iOS SDK v4+)/ `logShowPaywall` を呼び出している可能性があります。ペイウォールビルダーやフロービルダーで作成したペイウォール・フローを使用している場合、アナリティクスは自動的に記録されるため、このメソッドを呼び出すと表示回数が重複します。
**解決策**: ペイウォールビルダーまたはフロービルダーを使用している場合は、コード内で `logShowFlow`(iOS SDK v4+)/ `logShowPaywall` を呼び出していないことを確認してください。
## その他の問題 \{#other-issues\}
**問題**: 上記に該当しないペイウォールビルダー関連の問題が発生している。
**解決策**: 必要に応じて[マイグレーションガイド](ios-sdk-migration-guides)を参照し、SDKを最新バージョンに移行してください。多くの問題は新しいSDKバージョンで修正されています。
---
# File: ios-present-paywall-builder-paywalls-in-observer-mode
---
---
title: "iOS SDKのObserverモードでPaywall Builderのペイウォールを表示する"
description: "オブザーバーモードでPBペイウォールを表示して、より詳細なインサイトを得る方法を学びます。"
---
ペイウォールビルダーを使用してペイウォールをカスタマイズした場合、それをユーザーに表示するためにモバイルアプリのコードでレンダリングする必要はありません。このようなペイウォールには、ペイウォール内に表示する内容とその表示方法の両方が含まれています。
:::warning
このセクションは[オブザーバーモード](observer-vs-full-mode)専用です。オブザーバーモードで作業していない場合は、[iOS - ペイウォールビルダーのペイウォールを表示する](ios-present-paywalls)を参照してください。
:::
デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。この設定を推奨します。ユーザーが常に最新のデータを取得できるためです。
ただし、ユーザーのインターネット接続が不安定な場合は、`.returnCacheDataElseLoad` を使用することを検討してください。キャッシュが存在する場合はキャッシュデータを返します。この場合、最新データが得られないことがありますが、接続状況にかかわらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために活用しても安全です。
キャッシュはアプリの再起動後も保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はフローとペイウォールを 2 つのレイヤーで保存しています。上記の定期更新されるキャッシュと[フォールバックペイウォール](fallback-paywalls)です。また、フローとペイウォールをより速く取得するために CDN を使用し、CDN が利用できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。
| | **loadTimeout** | デフォルト: 5 秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
まれに、内部で複数のリクエストが行われるため、`loadTimeout` で指定した時間よりわずかに遅れてタイムアウトする場合があります。
| :::note v4 では、`locale` パラメータは `getFlow` から移動し、`getFlowConfiguration`(AdaptyUI でレンダリングする場合のみ使用)に設定するようになりました。カスタムペイウォールの場合、利用可能なすべてのロケールは `flow.remoteConfigs` にまとめて返されるため、ユーザーのデバイスまたはアプリの設定に合ったロケールを選んでください。 ::: プロダクトIDをハードコードしないでください!フローはリモートで設定されるため、利用可能なプロダクト、プロダクトの数、特典(無料トライアルなど)は随時変更される可能性があります。こうしたシナリオに対応できるようコードを作成してください。 たとえば、最初に2つのプロダクトを取得した場合、アプリはそれら2つを表示します。しかし後に3つのプロダクトを取得した場合は、コードを変更することなく3つすべてを表示できる必要があります。ハードコードが必要なのはプレースメントIDだけです。 レスポンスパラメーター: | パラメーター | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | `AdaptyFlow` オブジェクト。プレースメント、識別子(`id`、`variationId`)、名前、設定済みロケールごとのエントリを含む `remoteConfigs` 配列、および `hasViewConfiguration` フラグを保持します。フローのプロダクトを取得するには `getPaywallProducts(flow:)` を呼び出してください。 | ## プロダクトを取得する \{#fetch-products\} フローを取得したら、そのフローに対応するプロダクトの配列を取得できます:デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方式はユーザーが常に最新のデータを取得できるため、推奨しています。
ただし、ユーザーがネットワークの不安定な環境にいると想定される場合は、`.returnCacheDataElseLoad` の使用を検討してください。キャッシュが存在する場合はキャッシュされたデータを返します。この場合、最新のデータが届かない可能性はありますが、ネットワーク状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために活用しても安全です。
なお、キャッシュはアプリを再起動しても保持され、アプリのアンインストール時または手動でクリアした場合にのみ削除されます。
|任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子。このパラメーターは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードである必要があります。最初のサブタグは言語を表し、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードの詳細とその推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方法を推奨します。ユーザーが常に最新のデータを取得できるからです。
ただし、ユーザーが不安定なインターネット環境を使用していると思われる場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在すればそれを返すことを検討してください。この場合、ユーザーは最新のデータを取得できないことがありますが、インターネット接続が不安定な場合でも読み込み時間が短縮されます。キャッシュは定期的に更新されるため、ネットワークリクエストを避けるためにセッション中に使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップによってのみ消去されます。
Adapty SDK はペイウォールを2つの層に保存します:上記の定期的に更新されるキャッシュと[フォールバックペイウォール](fallback-paywalls)です。また、ペイウォールをより速く取得するために CDN を使用し、CDN が到達不能な場合に備えてスタンドアローンのフォールバックサーバーも使用しています。このシステムは、インターネット接続が限られている状況でも信頼性を確保しながら、常に最新バージョンのペイウォールを取得できるように設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。
まれに、このメソッドが `loadTimeout` で指定した時間よりもわずかに遅くタイムアウトすることがあります。これは、処理内部で複数のリクエストが実行される場合があるためです。
| プロダクトIDをハードコードしないでください!ペイウォールはリモートで設定されるため、利用可能なプロダクト、プロダクト数、特典(無料トライアルなど)は随時変更される可能性があります。これらのシナリオに対応できるよう、コードを実装してください。 たとえば、最初に2つのプロダクトを取得した場合、アプリはその2つのプロダクトを表示する必要があります。その後3つのプロダクトを取得した場合は、コードを変更することなく3つすべてを表示できなければなりません。ハードコードが必要なのはプレースメントIDのみです。 レスポンスのパラメーター: | パラメーター | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | プロダクトIDのリスト、ペイウォールの識別子、リモートコンフィグなどのプロパティを含む [`AdaptyPaywall`](https://swift.adapty.io/documentation/adapty/adaptypaywall) オブジェクト。 | ## プロダクトを取得する \{#fetch-products\} ペイウォールを取得したら、それに対応するプロダクトの配列をクエリできます:任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子。このパラメータは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードです。最初のサブタグは言語、2番目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードと推奨される使い方については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、この設定を推奨します。
ただし、ユーザーがネットワークの不安定な環境にいると想定される場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在すればそれを返すことも検討してください。この場合、最新データが取得できないことがありますが、接続状況に左右されず読み込みが速くなります。キャッシュはセッション中も定期的に更新されるため、ネットワークリクエストを減らす目的で安全に使用できます。
キャッシュはアプリの再起動後も保持され、アプリの再インストールまたは手動でのクリア時にのみ削除されます。
|リクエストが成功した場合、レスポンスにはこのオブジェクトが含まれます。[AdaptyProfile](https://swift.adapty.io/documentation/adapty/adaptyprofile) オブジェクトは、アプリ内でのユーザーのアクセスレベル、サブスクリプション、非サブスクリプション購入に関する包括的な情報を提供します。
ユーザーがアプリへの必要なアクセス権を持っているかどうかを確認するために、アクセスレベルのステータスをチェックしてください。
| :::warning **注意:** Apple の StoreKit バージョンが v2.0 未満、かつ Adapty SDK バージョンが v2.9.0 未満の場合は、代わりに [Apple App Store 共有シークレット](app-store-connection-configuration#step-5-enter-app-store-shared-secret)を提供する必要があります。このメソッドは現在 Apple によって非推奨とされています。 ::: ## App Store からのアプリ内課金 \{#in-app-purchases-from-the-app-store\} ユーザーが App Store で購入を開始し、トランザクションがアプリに引き継がれる場合、2つの選択肢があります: - **トランザクションを即座に処理する:** `shouldAddStorePayment` で `true` を返します。これにより、Apple の購入システム画面がすぐに表示されます。 - **後処理のためにプロダクトオブジェクトを保存する:** `shouldAddStorePayment` で `false` を返し、後で保存したプロダクトを使って `makePurchase` を呼び出します。購入をトリガーする前にユーザーにカスタム画面を表示したい場合に便利です。 完全なコード例を以下に示します: ```swift showLineNumbers title="Swift" final class YourAdaptyDelegateImplementation: AdaptyDelegate { nonisolated func shouldAddStorePayment(for product: AdaptyDeferredProduct) -> Bool { // 1a. // Return `true` to continue the transaction in your app. The Apple purchase system screen will show automatically. // 1b. // Store the product object and return `false` to defer or cancel the transaction. false } // 2. Continue the deferred purchase later on by passing the product to `makePurchase` when the timing is appropriate func continueDeferredPurchase() async { let storedProduct: AdaptyDeferredProduct = // get the product object from 1b. do { try await Adapty.makePurchase(product: storedProduct) } catch { // handle the error } } } ``` ## iOS でオファーコードを利用する \{#redeem-offer-codes-in-ios\}[`AdaptyProfile`](https://swift.adapty.io/documentation/adapty/adaptyprofile) オブジェクト。このモデルには、アクセスレベル、サブスクリプション、および非サブスクリプション購入に関する情報が含まれます。
ユーザーがアプリへのアクセス権を持っているかどうかを確認するには、**アクセスレベルのステータス**を確認してください。
| :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: --- # File: ios-transaction-management --- --- title: "iOS SDKにおける高度なトランザクション管理" description: "Adapty SDKを使用してiOSアプリでトランザクションを手動で完了する方法を説明します。" --- :::note 高度なトランザクション管理は、Adapty iOS SDK バージョン3.12以降でサポートされています。 ::: Adaptyの高度なトランザクション管理を使用すると、トランザクションの処理、検証、完了をより細かく制御できます。 高度なトランザクション管理には、連携して動作する3つのオプション機能が含まれています。 | 機能 | 目的 | |-------------------------------------------------------------|----------| | [`appAccountToken`](#assign-appaccounttoken) | Appleのトランザクションを内部ユーザーIDに紐付ける | | [`jwsTransaction`](#access-the-jws-representation) | バリデーション用にAppleの署名済みトランザクションペイロードを提供する | | [手動完了](#control-transaction-finishing-behavior) | バックエンドが成功を確認した後にのみトランザクションを完了できる | これらのツールを組み合わせることで、AdaptyがバックエンドとのトランザクションSync機能を維持しながら、堅牢なカスタムバリデーションフローを構築できます。 :::important ほとんどのアプリにはこの機能は不要です。 デフォルトでは、AdaptyはStoreKitトランザクションを自動的に検証・完了します。 このガイドは、独自のバックエンドバリデーションを実行する場合や、購入ライフサイクルを完全に制御したい場合にのみ使用してください。 ::: ## `appAccountToken`を設定する \{#assign-appaccounttoken\} [`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`と一緒に渡す必要があります。 トークンのみを渡した場合、トランザクションに含まれません。 :::StoreKit 1の場合:[SKPaymentTransaction](https://developer.apple.com/documentation/storekit/skpaymenttransaction)オブジェクト。
StoreKit 2の場合:[Transaction](https://developer.apple.com/documentation/storekit/transaction)オブジェクト。
|phoneNumber
firstName
lastName
| String | | gender | 列挙型。使用できる値: `female`、`male`、`other` | | birthday | Date | ### カスタムユーザー属性 \{#custom-user-attributes\} 独自のカスタム属性を設定できます。カスタム属性は通常、アプリの使用状況に関連したものです。たとえば、フィットネスアプリなら週あたりの運動回数、語学学習アプリならユーザーの習熟度などが考えられます。カスタム属性をセグメントで活用して、ターゲットを絞ったペイウォールやオファーを作成したり、どのプロダクト指標が収益に最も影響するかをアナリティクスで分析したりできます。 ```swift showLineNumbers do { builder = try builder.with(customAttribute: "value1", forKey: "key1") } catch { // handle key/value validation error } ``` 既存のキーを削除するには、`.withRemoved(customAttributeForKey:)` メソッドを使用します。 ```swift showLineNumbers do { builder = try builder.withRemoved(customAttributeForKey: "key2") } catch { // handle error } ``` 事前にどのカスタム属性が設定されているかを確認したい場合は、`AdaptyProfile` オブジェクトの `customAttributes` フィールドを使用してください。 :::warning `customAttributes` の値は最新でない場合があります。ユーザー属性は異なるデバイスからいつでも送信される可能性があるため、最後の同期後にサーバー上の属性が変更されている場合があります。 ::: ### 制限事項 \{#limits\} - ユーザーあたりのカスタム属性は最大30個まで - キー名は最大30文字。キー名に使用できる文字は英数字と以下の記号です: `_` `-` `.` - 値は文字列または浮動小数点数で、50文字以内 --- # File: subscription-status --- --- title: "iOS SDK でサブスクリプションのステータスを確認する" description: "Adapty でユーザーのサブスクリプションステータスを追跡・管理して、顧客維持率を向上させましょう。" --- Adapty を使えば、サブスクリプションのステータス管理が簡単になります。プロダクト ID をコードに手動で埋め込む必要はなく、アクティブな[アクセスレベル](access-level)を確認するだけで、ユーザーのサブスクリプションステータスをスムーズに把握できます。 サブスクリプションのステータス確認を始める前に、[App Store サーバー通知](enable-app-store-server-notifications)を設定してください。 ## アクセスレベルと AdaptyProfile オブジェクト \{#access-level-and-the-adaptyprofile-object\} アクセスレベルは [AdaptyProfile](https://swift.adapty.io/documentation/adapty/adaptyprofile) オブジェクトのプロパティです。アプリ起動時([ユーザーを識別する](identifying-users#set-customer-user-id-on-configuration)タイミングなど)にプロファイルを取得し、変更が発生したときに更新することをおすすめします。こうすることで、都度リクエストを送ることなくプロファイルオブジェクトを活用できます。 プロファイルの更新通知を受け取るには、以下の[サブスクリプションステータスの更新をリッスンする](subscription-status#listening-for-subscription-status-updates)セクションで説明している方法でプロファイルの変更を監視してください。 :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: ## サーバーからアクセスレベルを取得する \{#retrieving-the-access-level-from-the-server\} サーバーからアクセスレベルを取得するには、`.getProfile()` メソッドを使用します。[AdaptyProfile](https://swift.adapty.io/documentation/adapty/adaptyprofile) オブジェクト。通常、ユーザーがプレミアムアクセスを持っているかどうかを判断するには、プロファイルのアクセスレベルのステータスだけを確認すれば十分です。
`.getProfile` メソッドは常に API へのクエリを試みるため、最新の結果を返します。何らかの理由(インターネット接続がないなど)で Adapty SDK がサーバーから情報を取得できない場合は、キャッシュのデータが返されます。また、Adapty SDK は `AdaptyProfile` キャッシュを定期的に更新し、情報をできる限り最新の状態に保ちます。
| `.getProfile()` メソッドはユーザープロファイルを返し、そこからアクセスレベルのステータスを取得できます。アプリごとに複数のアクセスレベルを設定することも可能です。たとえばニュースアプリで複数のトピックのサブスクリプションを独立して販売する場合、「sports」や「science」といったアクセスレベルを作成できます。ただし、ほとんどの場合はアクセスレベルは 1 つで十分なので、デフォルトの「premium」アクセスレベルをそのまま使用できます。 デフォルトの「premium」アクセスレベルを確認する例を示します。任意
デフォルト: `en`
|オンボーディングのローカライズ識別子。このパラメーターは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成された言語コードを指定します。最初のサブタグは言語、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよび推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。このオプションを推奨します。ユーザーが常に最新のデータを取得できるためです。
ただし、ユーザーのインターネット接続が不安定な場合は、`.returnCacheDataElseLoad` を使用してキャッシュが存在する場合はキャッシュデータを返すことを検討してください。この場合、最新データが取得できないことがありますが、接続状況に関わらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、ネットワークリクエストを減らす目的でセッション中に使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はオンボーディングをローカルに2層構造で保存します。上述の定期更新キャッシュとフォールバックオンボーディングです。また、オンボーディングをより高速に取得するためにCDNを使用し、CDNが利用できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンのオンボーディングを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
内部的に複数のリクエストで構成される場合があるため、稀にこのメソッドが `loadTimeout` で指定した時間をわずかに超えてタイムアウトすることがあります。
| レスポンスパラメーター: | パラメーター | 説明 | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | [`AdaptyOnboarding`](https://swift.adapty.io/documentation/adapty/adaptyonboarding) オブジェクト。オンボーディングの識別子と設定、リモートコンフィグ、その他のプロパティを含みます。 | ## デフォルトオーディエンスのオンボーディングでフェッチを高速化する \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} 通常、オンボーディングはほぼ瞬時にフェッチされるため、このプロセスの高速化を心配する必要はありません。ただし、オーディエンスやオンボーディングが多数存在し、ユーザーのインターネット接続が弱い場合、オンボーディングのフェッチに予想以上の時間がかかることがあります。そのような状況では、オンボーディングをまったく表示しないのではなく、デフォルトのオンボーディングを表示することで、スムーズなユーザー体験を確保したい場合があるでしょう。 `getOnboardingForDefaultAudience` メソッドを使用することで、指定したプレースメントの **All Users** オーディエンス向けオンボーディングを取得できます。ただし、推奨されるアプローチは `getOnboarding` メソッドでオンボーディングを取得することであり、詳細は上記の[オンボーディングの取得](#fetch-onboarding)セクションをご覧ください。 :::warning `getOnboardingForDefaultAudience` の代わりに `getOnboarding` の使用を検討してください。前者には以下の重要な制限があります: - **互換性の問題**: 複数のアプリバージョンをサポートする際に問題が生じる可能性があり、後方互換性のある設計が必要になるか、古いバージョンが正しく表示されない可能性を受け入れる必要があります。 - **パーソナライズなし**: 「すべてのユーザー」オーディエンスのコンテンツのみを表示するため、国、アトリビューション、カスタム属性に基づいたターゲティングができません。 取得の高速化がこれらのデメリットを上回るユースケースの場合は、以下に示すように `getOnboardingForDefaultAudience` を使用してください。それ以外の場合は、[上記](#fetch-onboarding)で説明している `getOnboarding` を使用してください。 ::: ```swift showLineNumbers Adapty.getOnboardingForDefaultAudience(placementId: "YOUR_PLACEMENT_ID") { result in switch result { case let .success(onboarding): // the requested onboarding case let .failure(error): // handle the error } } ``` パラメーター: | パラメーター | 必須/任意 | 説明 | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | 必須 | 対象の[プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
|オンボーディングのローカライズの識別子です。このパラメーターは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードである必要があります。最初のサブタグは言語、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードとその推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるよう、このオプションを推奨します。
ただし、ユーザーがインターネット接続の不安定な環境を使用していると思われる場合は、`.returnCacheDataElseLoad` の使用を検討してください。これにより、キャッシュが存在する場合はキャッシュされたデータを返します。この場合、ユーザーは最新のデータを取得できないことがありますが、インターネット接続の品質に関わらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、ネットワークリクエストを避けるためにセッション中に使用しても安全です。
なお、キャッシュはアプリの再起動後も保持され、アプリのアンインストール時または手動でクリーンアップした場合にのみ消去されます。
Adapty SDK はオンボーディングをローカルに2層構造で保存します。上記の定期更新されるキャッシュと、フォールバックオンボーディングです。また、オンボーディングをより速く取得するためにCDNを使用し、CDNに到達できない場合に備えてスタンドアロンのフォールバックサーバーも使用しています。このシステムは、インターネット接続が不安定な場合でも信頼性を確保しながら、常に最新バージョンのオンボーディングを取得できるよう設計されています。
| --- # File: ios-present-onboardings --- --- title: "iOS SDKでオンボーディングを表示する" description: "iOSでオンボーディングを表示してコンバージョンと収益を向上させる方法をご紹介します。" --- :::tip **SDK v4以降**では、オンボーディングのより強力な代替手段として[フロー](get-pb-paywalls)を構築できます。オンボーディングがWebView内で動作するのに対し、フローはデバイス上でネイティブにレンダリングされます。これにより、よりスムーズなアニメーション、一貫したiOSのルック&フィール、高速な読み込み、WebViewランタイムへの依存がなくなるといったメリットが得られます。始めるには、[フローとペイウォールの取得](get-pb-paywalls)および[フローとペイウォールの表示](ios-present-paywalls)をご覧ください。 ::: ビルダーでオンボーディングをカスタマイズした場合、モバイルアプリのコードでレンダリングを意識する必要はありません。このようなオンボーディングには、表示する内容と表示方法の両方が含まれています。 始める前に、以下を確認してください: 1. [Adapty iOS SDK](sdk-installation-ios) 3.8.0 以降をインストール済みであること。 2. [オンボーディングを作成済み](create-onboarding)であること。 3. オンボーディングを[プレースメント](placements)に追加済みであること。 ## Swiftでのオンボーディングの表示 \{#present-onboardings-in-swift\} デバイス画面にビジュアルオンボーディングを表示するには、以下の手順に従ってください。 1. `.getOnboardingConfiguration` メソッドを使用して、オンボーディングのビュー設定を取得します。 2. `.onboardingController` メソッドを使用して、表示したいビジュアルオンボーディングを初期化します。 リクエストパラメーター: | パラメータ | 必須/任意 | 説明 | |:-----------------------------|:---------|:------------------------------------------------------------------------------------------------------------------------------------------------------------| | **onboarding configuration** | 必須 | すべてのオンボーディングプロパティを含む `AdaptyUI.OnboardingConfiguration` オブジェクト。`AdaptyUI.getOnboardingConfiguration` メソッドを使用して取得します。 | | **delegate** | 必須 | オンボーディングイベントを受け取るための `AdaptyOnboardingControllerDelegate`。 | 戻り値: | オブジェクト | 説明 | |:-------------------------------|:--------------------------------------------------------| | **AdaptyOnboardingController** | リクエストされたオンボーディング画面を表すオブジェクト | 3. オブジェクトが正常に作成されたら、デバイスの画面に表示できます: ```swift showLineNumbers title="Swift" import Adapty import AdaptyUI // 0. Get an onboarding if you haven't done it yet let onboarding = try await Adapty.getOnboarding(placementId: "YOUR_PLACEMENT_ID") // 1. Obtain the onboarding view configuration: let configuration = try AdaptyUI.getOnboardingConfiguration(forOnboarding: onboarding) // 2. Create Onboarding View Controller let onboardingController = try AdaptyUI.onboardingController( with: configuration, delegate:
その後、このIDをコードで使用してカスタムアクションとして処理できます。たとえば、ユーザーが**Login**や**Allow notifications**などのカスタムボタンをタップすると、デリゲートメソッド`onboardingController`が`.custom(id:)`ケースでトリガーされ、`actionId`パラメータはビルダーの**Action ID**になります。`"allowNotifications"`のように独自のIDを作成できます。
```swift showLineNumbers
func onboardingController(_ controller: AdaptyOnboardingController, onCustomAction action: AdaptyOnboardingsCustomAction) {
if action.actionId == "allowNotifications" {
// Request notification permissions
}
}
func onboardingController(_ controller: AdaptyOnboardingController, didFailWithError error: AdaptyUIError) {
// Handle errors
}
```
:::important
ユーザーがオンボーディングを閉じたときの動作は、アプリ側で管理する必要があります。たとえば、オンボーディング自体の表示を停止する処理が必要です。
:::
例:
```swift showLineNumbers
func onboardingController(_ controller: AdaptyOnboardingController, onCloseAction action: AdaptyOnboardingsCloseAction) {
controller.dismiss(animated: true)
}
```
2. サブスクリプショングループ名をクリックすると、**Subscriptions** セクションにプロダクトの一覧が表示されます。
3. テスト対象のプロダクトが **Ready to Submit** になっていることを確認してください。なっていない場合は、[App Store のプロダクト](app-store-products)ページの手順に従ってください。
4. テーブルに表示されているプロダクト ID と、Adapty ダッシュボードの [**Products**](https://app.adapty.io/products) タブに登録されているプロダクト ID を照合してください。ID が一致しない場合は、テーブルからプロダクト ID をコピーして、Adapty ダッシュボードで[プロダクトを作成](create-product)してください。
## ステップ 3. プロダクトの利用可能地域を確認する \{#step-4-check-product-availability\}
1. **App Store Connect** に戻り、同じ **Subscriptions** セクションを開きます。
2. サブスクリプショングループ名をクリックして、プロダクト一覧を表示します。
3. テスト対象のプロダクトを選択します。
4. **Availability** セクションまでスクロールし、必要な国と地域がすべて一覧に含まれていることを確認してください。
## ステップ 4. プロダクトの価格を確認する \{#step-5-check-product-prices\}
1. 再び **App Store Connect** の **Monetization** → **Subscriptions** セクションに移動します。
2. サブスクリプショングループ名をクリックします。
3. テスト対象のプロダクトを選択します。
4. **Subscription Pricing** までスクロールし、**Current Pricing for New Subscribers** セクションを展開します。
5. 必要な価格がすべて一覧に含まれていることを確認してください。
## ステップ 5. アプリの有料ステータス、銀行口座、税務フォームがアクティブであることを確認する \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. [**App Store Connect**](https://appstoreconnect.apple.com/) のホームページで **Business** をクリックします。
2. 会社名を選択します。
3. 下にスクロールして、**Paid Apps Agreement**、**Bank Account**、**Tax forms** がすべて **Active** になっていることを確認します。
以上の手順を実行することで、`InvalidProductIdentifiers` の警告を解消し、プロダクトをストアで公開できるようになります。
## ステップ 6. プロダクトがスタックしている場合は再作成する \{#step-6-recreate-the-product-if-its-stuck\}
ステップ 1〜5 がすべて問題なく通過している場合(`Approved` ステータス、Bundle ID の一致、有効な API キーなど)でも、SDK が `1000 noProductIDsFound` を返し続けることがあります。この場合、プロダクトが Apple のレジストリでスタックしている可能性があります。App Store Connect の UI 上にはプロダクトが存在していても、StoreKit のルックアップパスに公開されていない状態になることがあります。
App Store Connect でプロダクトを削除し、同じプロダクト ID で再作成してください。再作成後、反映されるまで最大 24 時間かかる場合があります。
---
# File: cantMakePayments
---
---
title: "Code-1003 cantMakePayment エラーの修正"
description: "Adapty でサブスクリプションを管理する際に発生する支払いエラーを解決します。"
---
1003エラー(`cantMakePayments`)は、このデバイスでアプリ内課金ができないことを示しています。
`cantMakePayments`エラーが発生している場合、通常は以下のいずれかの原因が考えられます:
- デバイスの制限:このエラーはAdaptyとは無関係です。以下の解決方法を参照してください。
- オブザーバーモードの設定:`makePurchase`メソッドとオブザーバーモードは同時に使用できません。以下のセクションを参照してください。
## 問題:デバイスの制限 \{#issue-device-restrictions\}
| 問題 | 解決方法 |
|-----------------------------|---------------------------------------------------------|
| スクリーンタイムの制限 | [スクリーンタイム](https://support.apple.com/en-us/102470)でアプリ内課金の制限を無効にする |
| アカウントの停止 | Appleサポートに連絡してアカウントの問題を解決する |
| 地域の制限 | 対応地域のApp Storeアカウントを使用する |
## 問題:オブザーバーモードとmakePurchaseの併用 \{#issue-using-both-observer-mode-and-makepurchase\}
購入処理に`makePurchase`を使用している場合、オブザーバーモードを使用する必要はありません。[オブザーバーモード](observer-vs-full-mode)が必要なのは、購入ロジックを自分で実装する場合のみです。
したがって、`makePurchase`を使用している場合は、SDK有効化コードからオブザーバーモードの有効化を安全に削除できます。
---
# File: migration-to-ios-sdk-v4
---
---
title: "Adapty iOS SDK v4.0への移行"
description: "ペイウォールAPIをフローAPIに置き換えてAdapty iOS SDK v4.0に移行します。フロービルダーとペイウォールビルダーの両方に対応しています。"
---
Adapty iOS SDK 4.0ではフローが導入され、それに合わせてペイウォールAPIの名称が変更されました。新しいAPIはフロービルダーと既存のペイウォールビルダーの両方で動作します。Adapty ダッシュボード側での設定変更は不要です。
## クイックリファレンス \{#quick-reference\}
| v3 | v4 |
|---|---|
| `Adapty.getPaywall(placementId:locale:)` | `Adapty.getFlow(placementId:)` |
| `AdaptyUI.getPaywallConfiguration(forPaywall:)` | `AdaptyUI.getFlowConfiguration(forFlow:locale:)` |
| `Adapty.getPaywallProducts(paywall:)` | `Adapty.getPaywallProducts(flow:)` |
| `Adapty.logShowPaywall(_:)` | `Adapty.logShowFlow(_:)` |
| `AdaptyPaywallController` | `AdaptyFlowController` |
| `AdaptyPaywallControllerDelegate` | `AdaptyFlowControllerDelegate` |
| `AdaptyUI.paywallController(with:delegate:)` | `AdaptyUI.flowController(with:delegate:)` |
| `.paywall()` (SwiftUI modifier) | `.flow()` |
| `AdaptyPaywallView` | `AdaptyFlowView` |
| `didFailRenderingWith:` / `didFailRendering:` | `didReceiveError:` |
| `didFinishPurchase`(オプション、成功時に自動で閉じる) | `didFinishPurchase`(必須、自動では閉じない) |
| `Adapty_KidsMode` / `AdaptyUI_KidsMode` パッケージプロダクト | `KidsMode` パッケージトレイト |
| `Adapty.updateAttribution(_:source:)` (`source: String`) | `Adapty.updateAttribution(_:source:)` (`source: AdaptyAttributionSource`) |
| `Adapty.setIntegrationIdentifier(key:value:)` | `Adapty.setIntegrationIdentifier(_:)` (`AdaptyIntegrationIdentifier`) |
## iOS 最小バージョン \{#minimum-ios-version\}
Adapty iOS SDK 4.0 では、最小デプロイメントターゲットが iOS 13.0 から **iOS 15.0** に引き上げられました。アップグレードの前に、プロジェクトの iOS Deployment Target を 15.0 以上に設定してください。
## インストール:CocoaPods のサポート終了 \{#installation-cocoapods-no-longer-supported\}
Adapty iOS SDK 4.0 では CocoaPods のサポートが廃止されました。SDK のインストールには [Swift Package Manager](sdk-installation-ios#install-adapty-sdk) をご利用ください。
プロジェクトで引き続き CocoaPods を使用している場合は、`Podfile` から `Adapty` および `AdaptyUI` の pod を削除し、`pod install` を実行してクリーンアップした後、Xcode の **File → Add Package Dependency** から `https://github.com/adaptyteam/AdaptySDK-iOS.git` を使ってパッケージを追加してください。
## キッズモード: 専用プロダクトからパッケージトレイトへ \{#kids-mode-separate-products-replaced-by-a-package-trait\}
v3 では、[キッズモード](kids-mode)を有効にするには、専用の **Adapty_KidsMode** および **AdaptyUI_KidsMode** パッケージプロダクトを選択し、import 文をリネームする必要がありました。v4.0 ではこれらのプロダクトが削除されました。キッズモードは、通常の Adapty パッケージ上の `KidsMode` という Swift パッケージトレイトとなり、有効にすると SDK 全体で IDFA および AdSupport がコンパイル時に除外されます。
移行手順:
1. **Choose Package Products** ウィンドウで、**Adapty_KidsMode** および **AdaptyUI_KidsMode** の代わりに、通常の **Adapty** および **AdaptyUI** プロダクトを選択します。
2. `KidsMode` トレイトを有効にします。Xcode 26.4 以降をお使いの場合は、プロジェクトの **Package Dependencies** ビューで AdaptySDK-iOS 依存関係に対して有効にしてください。`Package.swift` で Adapty を依存関係として追加する場合(`swift-tools-version` 6.1 以降が必要)は、そちらで有効にします:
```swift showLineNumbers title="Package.swift"
.package(
url: "https://github.com/adaptyteam/AdaptySDK-iOS.git",
from: "4.0.0",
traits: ["KidsMode"]
)
```
3. インポートを通常のモジュールに戻します:
```diff showLineNumbers
- import Adapty_KidsMode
- import AdaptyUI_KidsMode
+ import Adapty
+ import AdaptyUI
```
:::note
Xcode 26.4 より前のバージョンでは、UI からプロジェクトにトレイトを有効化できません。その場合は、`KidsMode` トレイトを有効にした Adapty に依存するローカルの Swift パッケージを作成し、アプリターゲットがそのパッケージに依存するように設定してください。
:::
## 削除された API \{#removed-apis\}
- **`Adapty.getPaywallProductsWithoutDeterminingOffer(paywall:)`** — 削除されました。すべてのプロダクトにオファー情報が含まれるようになったため、個別の対象資格確認パスは不要になりました。
- **`AdaptyPaywallProductWithoutDeterminingOffer`** — 削除されました。以前このタイプを渡していたコールバック(`didSelectProduct` など)は、今後 `AdaptyPaywallProduct` を渡すようになります。
## App Store プロモートアプリ内課金の一時的な削除 \{#app-store-promoted-in-app-purchases-temporarily-removed\}
StoreKit 2 への移行の一環として、Adapty iOS SDK 4.0 では App Store プロモートアプリ内課金のサポートが削除されました。`shouldAddStorePayment(for:)` デリゲートメソッドおよびそれが受け取る `AdaptyDeferredProduct` 型は、4.0 では使用できません。
:::warning
この削除は一時的なものです — プロモートアプリ内課金のサポートは、今後の 4.x リリースで復活する予定です。アプリがプロモートアプリ内課金に依存している場合は、サポートが戻るまで iOS SDK 3.x をご利用ください。
:::
## ペイウォールの取得 \{#fetching-paywalls\}
### getPaywall + getPaywallConfiguration → getFlow + getFlowConfiguration
返却される型は `AdaptyPaywall` / `AdaptyUI.PaywallConfiguration` から `AdaptyFlow` / `AdaptyUI.FlowConfiguration` に変わります。`locale` パラメータはフェッチ呼び出しから `getFlowConfiguration` に移動します。
```diff showLineNumbers
- let paywall = try await Adapty.getPaywall(placementId: "YOUR_PLACEMENT_ID", locale: "en")
- let paywallConfiguration = try await AdaptyUI.getPaywallConfiguration(forPaywall: paywall)
+ let flow = try await Adapty.getFlow(placementId: "YOUR_PLACEMENT_ID")
+ let flowConfiguration = try await AdaptyUI.getFlowConfiguration(forFlow: flow, locale: "en")
```
### getPaywallProducts(paywall:) → getPaywallProducts(flow:)
`getPaywallProducts` は、`Adapty.getFlow` によって返された `AdaptyFlow` を受け取るようになりました:
```diff showLineNumbers
- let products = try await Adapty.getPaywallProducts(paywall: paywall)
+ let products = try await Adapty.getPaywallProducts(flow: flow)
```
## ペイウォールの表示を記録する \{#tracking-paywall-views\}
### logShowPaywall(_:) → logShowFlow(_:)
`logShowPaywall` は `logShowFlow` にリネームされ、`AdaptyPaywall` の代わりに `AdaptyFlow` を受け取るようになりました。イベントは引き続き同じバリアントに対して記録されるため、既存のファネルや A/B テストの指標はダッシュボードの変更なしに引き続き機能します。
```diff showLineNumbers
- try await Adapty.logShowPaywall(paywall)
+ try await Adapty.logShowFlow(flow)
```
v3と同様に、[Flow Builder](adapty-flow-builder)や[Paywall Builder](adapty-paywall-builder)でレンダリングされたフローやペイウォールを表示する際には、このメソッドを呼び出す必要はありません。これらのビューはAdaptyが自動的にトラッキングします。
## didFinishPurchaseが必須になりました \{#didfinishpurchase-is-now-required\}
v3では、`didFinishPurchase`はオプションでした。実装しなかった場合、購入成功後にペイウォールが自動的に閉じられていました。v4.0では、この自動クローズのデフォルト実装が削除されました。これにより、購入成功後もフローを継続できます。たとえば、フローの残りのスクリーンを表示し続けることが可能です。購入後の動作はご自身で決定してください。スクリーンを閉じるか、何もせずにフローを継続させるかを選べます。
- **UIKit**: `AdaptyFlowControllerDelegate` の準拠者は `didFinishPurchase` を実装する必要があります。デフォルト実装は廃止されました。
- **SwiftUI**: `.flow(...)` および `AdaptyFlowView(...)` の `didFinishPurchase` クロージャが必須になりました。`didFailPurchase` および `didFinishRestore` と同様です。
v3 の動作を維持するには、自分で画面を閉じてください:
```swift showLineNumbers title="Swift"
func flowController(
_ controller: AdaptyFlowController,
didFinishPurchase product: AdaptyPaywallProduct,
purchaseResult: AdaptyPurchaseResult
) {
if !purchaseResult.isPurchaseCancelled {
controller.dismiss(animated: true)
}
}
```
## UIKit \{#uikit\}
### AdaptyPaywallController → AdaptyFlowController
コントローラーの型とファクトリーメソッドの名前を変更します:
```diff showLineNumbers
- let controller = try AdaptyUI.paywallController(
- with: paywallConfiguration,
- delegate: self
- )
+ let controller = try AdaptyUI.flowController(
+ with: flowConfiguration,
+ delegate: self
+ )
```
### AdaptyPaywallControllerDelegate → AdaptyFlowControllerDelegate
プロトコル名を変更し、すべてのメソッドシグネチャを更新してください。`didSelectProduct` が削除された `AdaptyPaywallProductWithoutDeterminingOffer` の代わりに `AdaptyPaywallProduct` を受け取るようになった点、および `didFinishPurchase` は[実装が必須になった](#didfinishpurchase-is-now-required)点(デフォルト実装がなくなりました)に注意してください。
```diff showLineNumbers
- class YourClass: AdaptyPaywallControllerDelegate {
+ class YourClass: AdaptyFlowControllerDelegate {
- func paywallControllerDidAppear(_ controller: AdaptyPaywallController) { }
+ func flowControllerDidAppear(_ controller: AdaptyFlowController) { }
- func paywallControllerDidDisappear(_ controller: AdaptyPaywallController) { }
+ func flowControllerDidDisappear(_ controller: AdaptyFlowController) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didPerform action: AdaptyUI.Action) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didPerform action: AdaptyUI.Action) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didSelectProduct product: AdaptyPaywallProductWithoutDeterminingOffer) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didSelectProduct product: AdaptyPaywallProduct) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didStartPurchase product: AdaptyPaywallProduct) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didStartPurchase product: AdaptyPaywallProduct) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFinishPurchase product: AdaptyPaywallProduct,
- purchaseResult: AdaptyPurchaseResult) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFinishPurchase product: AdaptyPaywallProduct,
+ purchaseResult: AdaptyPurchaseResult) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailPurchase product: AdaptyPaywallProduct,
- error: AdaptyError) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFailPurchase product: AdaptyPaywallProduct,
+ error: AdaptyError) { }
- func paywallControllerDidStartRestore(_ controller: AdaptyPaywallController) { }
+ func flowControllerDidStartRestore(_ controller: AdaptyFlowController) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFinishRestoreWith profile: AdaptyProfile) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFinishRestoreWith profile: AdaptyProfile) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailRestoreWith error: AdaptyError) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFailRestoreWith error: AdaptyError) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailRenderingWith error: AdaptyUIError) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didReceiveError error: AdaptyUIError) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailLoadingProductsWith error: AdaptyError) -> Bool { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFailLoadingProductsWith error: AdaptyError) -> Bool { }
- func paywallController(_ controller: AdaptyPaywallController,
- didPartiallyLoadProducts failedIds: [String]) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didPartiallyLoadProducts failedIds: [String]) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFinishWebPaymentNavigation product: AdaptyPaywallProduct?,
- error: AdaptyError?) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFinishWebPaymentNavigation product: AdaptyPaywallProduct?,
+ error: AdaptyError?) { }
}
```
## SwiftUI \{#swiftui\}
### .paywall() モディファイア → .flow() \{#paywall-modifier--flow\}
モディファイアの名前を変更し、設定パラメータ名を更新して、[必須となった](#didfinishpurchase-is-now-required) `didFinishPurchase` クロージャを追加します。
```diff showLineNumbers
@State var flowPresented = false // rename freely — the variable name is your choice
var body: some View {
Text("Hello, AdaptyUI!")
- .paywall(
+ .flow(
isPresented: $flowPresented,
- paywallConfiguration: paywallConfiguration,
+ flowConfiguration: flowConfiguration,
+ didFinishPurchase: { product, purchaseResult in /* dismiss, or do nothing to let the flow continue */ },
didFailPurchase: { product, error in /* handle the error */ },
didFinishRestore: { profile in /* check access level and dismiss */ },
didFailRestore: { error in /* handle the error */ },
- didFailRendering: { error in flowPresented = false }
+ didReceiveError: { error in flowPresented = false }
)
}
```
名前が変更されたコールバックは、`didFailRendering` が対応していたのと同じレンダリングエラーに加え、フロースクリプトの新しいランタイムエラー(`AdaptyUIError` コード `4105` — `.jsException` の JavaScript 例外)にも対応します。既存のハンドラー本体はコードを変更する必要はありません。パラメーターの名前を変更するだけです。
### AdaptyPaywallView → AdaptyFlowView
ビューの名前を変更し、設定パラメータを更新し、[現在必須となった](#didfinishpurchase-is-now-required) `didFinishPurchase` クロージャを追加して、`didSelectProduct` クロージャを更新してください。このクロージャは、削除された `AdaptyPaywallProductWithoutDeterminingOffer` の代わりに `AdaptyPaywallProduct` を受け取るようになりました。
```diff showLineNumbers
- AdaptyPaywallView(
- paywallConfiguration: paywallConfiguration,
- didSelectProduct: { product: AdaptyPaywallProductWithoutDeterminingOffer in /* handle */ },
+ AdaptyFlowView(
+ flowConfiguration: flowConfiguration,
+ didSelectProduct: { product: AdaptyPaywallProduct in /* handle */ },
+ didFinishPurchase: { product, purchaseResult in /* dismiss, or do nothing to let the flow continue */ },
didFailPurchase: { product, error in /* handle the error */ },
didFinishRestore: { profile in /* check access level and dismiss */ },
didFailRestore: { error in /* handle the error */ },
- didFailRendering: { error in /* handle the error */ }
+ didReceiveError: { error in /* handle the error */ }
)
```
## AdaptyUI カスタムアセット \{#adaptyui-custom-assets\}
### AdaptyUICustomVideoAsset
既存のすべての呼び出し箇所に影響する変更が2点あります。
- `.player` が `AVQueuePlayer` の代わりに `AVPlayer` を受け取るようになりました。
- すべてのケースに末尾の `resolution: CGSize?` パラメータが追加されました。現在の動作を維持するには `nil` を渡してください。動画が読み込まれる前にプレイヤーがレイアウトスペースを確保できるよう(アスペクト比 = `width / height`)、実際のピクセルサイズを渡すこともできます。
```diff showLineNumbers
- case file(url: URL, preview: AdaptyUICustomImageAsset?)
- case remote(url: URL, preview: AdaptyUICustomImageAsset?)
- case player(item: AVPlayerItem, player: AVQueuePlayer, preview: AdaptyUICustomImageAsset?)
+ case file(url: URL, preview: AdaptyUICustomImageAsset?, resolution: CGSize?)
+ case remote(url: URL, preview: AdaptyUICustomImageAsset?, resolution: CGSize?)
+ case player(item: AVPlayerItem, player: AVPlayer, preview: AdaptyUICustomImageAsset?, resolution: CGSize?)
```
## アトリビューションと連携識別子 \{#attribution-and-integration-identifiers\}
### updateAttribution(_:source:)
`source` パラメーターの型が `String` から新しい `AdaptyAttributionSource` 型に変更され、以前はネストされていた `AdaptyProfile.AttributionSource` がトップレベルの `AdaptyAttributionSource` に改名されました。定義済みのソースを使用するか、その他のソースには文字列リテラルを渡してください。`AdaptyAttributionSource` は `ExpressibleByStringLiteral` に準拠しているため、既存の文字列リテラルによる呼び出しはそのままコンパイルできます。
```diff showLineNumbers
- try await Adapty.updateAttribution(attribution, source: "adjust")
+ try await Adapty.updateAttribution(attribution, source: .adjust)
```
定義済みソース: `.appleAds`、`.adjust`、`.appsflyer`、`.branch`、`.tenjin`。ソースを `String` 変数で保持している場合は、`AdaptyAttributionSource(rawValue: yourSource)` でラップしてください。
### setIntegrationIdentifier(_:) \{#setintegrationidentifier\}
`setIntegrationIdentifier(key:value:)` は、1つ以上の `AdaptyIntegrationIdentifier` 値を受け取る可変長引数メソッドに置き換えられました。生の文字列キーの代わりに、定義済みのファクトリーメソッドを使用してください:
```diff showLineNumbers
- try await Adapty.setIntegrationIdentifier(key: "appsflyer_id", value: uid)
+ try await Adapty.setIntegrationIdentifier(.appsflyerId(uid))
```
1回の呼び出しで複数の識別子を設定できます:
```swift showLineNumbers
try await Adapty.setIntegrationIdentifier(
.appsflyerId(uid),
.adjustDeviceId(adid)
)
```
各古いキー文字列をそのファクトリーメソッドに置き換えます:
| v3 キー | v4 ファクトリー |
|---|---|
| `"adjust_device_id"` | `.adjustDeviceId(_:)` |
| `"airbridge_device_id"` | `.airbridgeDeviceId(_:)` |
| `"amplitude_user_id"` | `.amplitudeUserId(_:)` |
| `"amplitude_device_id"` | `.amplitudeDeviceId(_:)` |
| `"appmetrica_device_id"` | `.appmetricaDeviceId(_:)` |
| `"appmetrica_profile_id"` | `.appmetricaProfileId(_:)` |
| `"appsflyer_id"` | `.appsflyerId(_:)` |
| `"branch_id"` | `.branchId(_:)` |
| `"facebook_anonymous_id"` | `.facebookAnonymousId(_:)` |
| `"firebase_app_instance_id"` | `.firebaseAppInstanceId(_:)` |
| `"mixpanel_user_id"` | `.mixpanelUserId(_:)` |
| `"one_signal_subscription_id"` | `.oneSignalSubscriptionId(_:)` |
| `"one_signal_player_id"` | `.oneSignalPlayerId(_:)` |
| `"posthog_distinct_user_id"` | `.posthogDistinctUserId(_:)` |
| `"pushwoosh_hwid"` | `.pushwooshHWID(_:)` |
| `"tenjin_analytics_installation_id"` | `.tenjinAnalyticsInstallationId(_:)` |
---
# File: migration-to-ios-315
---
---
title: "Adapty iOS SDK を v3.15 に移行する"
description: "Adapty iOS SDK v3.15 に移行して、パフォーマンスの向上と新しいマネタイズ機能をご利用ください。"
---
[オブザーバーモード](observer-vs-full-mode)で[ペイウォールビルダー](adapty-paywall-builder)を使用している場合、iOS SDK 3.15 以降では新しいメソッド `observerModeDidInitiateRestorePurchases(onStartRestore:onFinishRestore:)` を実装する必要があります。このメソッドにより、リストアロジックをより細かく制御できるようになり、カスタムフローで購入のリストアを処理できます。実装の詳細については、[オブザーバーモードでペイウォールビルダーのペイウォールを表示する](ios-present-paywall-builder-paywalls-in-observer-mode)を参照してください。
```diff showLineNumbers
func observerMode(didInitiatePurchase product: AdaptyPaywallProduct,
onStartPurchase: @escaping () -> Void,
onFinishPurchase: @escaping () -> Void) {
// use the product object to handle the purchase
// use the onStartPurchase and onFinishPurchase callbacks to notify AdaptyUI about the process of the purchase
}
+ func observerModeDidInitiateRestorePurchases(onStartRestore: @escaping () -> Void,
+ onFinishRestore: @escaping () -> Void) {
+ // use the onStartRestore and onFinishRestore callbacks to notify AdaptyUI about the process of the restore
+ }
```
---
# File: migration-to-ios-sdk-34
---
---
title: "Adapty iOS SDK を v3.4 へ移行する"
description: "Adapty iOS SDK v3.4 に移行して、パフォーマンスの向上と新しいマネタイズ機能を活用しましょう。"
---
Adapty SDK 3.4.0 はメジャーリリースであり、お客様側での移行手順が必要な改善が含まれています。
## Adapty SDK のアクティベーションを更新する \{#update-adapty-sdk-activation\}
### ログイン/サインアップ時 \{#during-loginsignup\}
アプリ起動後にユーザーを識別する場合(たとえば、アプリへのログインやサインアップ後など)、`identify`メソッドを使用してカスタマーユーザーIDを設定します。
- **このカスタマーユーザーIDを以前に使用したことがない**場合、Adaptyは自動的に現在のプロファイルにリンクします。
- **このカスタマーユーザーIDでユーザーを以前に識別したことがある**場合、AdaptyはそのカスタマーユーザーIDに関連付けられたプロファイルを使用するよう切り替えます。
:::important
カスタマーユーザーIDは各ユーザーで一意である必要があります。パラメータの値をハードコードすると、すべてのユーザーが同一人物とみなされます。
:::
他のSDKメソッドを呼び出す前に、`identify`の完了(`onSuccess`コールバック)を待ってください。同時に呼び出すと、匿名プロファイルに処理が行われる可能性があります。[Kotlin Multiplatform SDKでの呼び出し順序](kmp-sdk-call-order)を参照してください。
```kotlin showLineNumbers
Adapty.identify("YOUR_USER_ID") // Unique for each user
.onSuccess {
// successful identify
}
.onError { error ->
// handle the error
}
```
### SDKアクティベーション時 \{#during-the-sdk-activation\}
SDKをアクティベートする際にすでにカスタマーユーザーIDが分かっている場合、`identify`を別途呼び出す代わりに`activate`メソッドで渡すことができます。
カスタマーユーザーIDが分かっているにもかかわらず、アクティベーション後にのみ設定した場合、アクティベーション時にAdaptyが新しい匿名プロファイルを作成し、`identify`を呼び出した後にのみ既存のプロファイルに切り替わることになります。
既存のカスタマーユーザーID(以前に使用したもの)でも新しいものでも渡すことができます。新しいものを渡した場合、アクティベーション時に作成された新しいプロファイルが自動的にそのカスタマーユーザーIDにリンクされます。
:::note
デフォルトでは、匿名プロファイルの作成はアナリティクスのダッシュボードに影響しません。インストール数はデバイスIDに基づいてカウントされるためです。
デバイスIDは、デバイス上のストアからのアプリの単一のインストールを表し、アプリが再インストールされた場合にのみ再生成されます。
初回インストールか再インストールか、または既存のカスタマーユーザーIDが使用されているかどうかには依存しません。
プロファイルの作成(SDKのアクティベーション時またはログアウト時)、ログイン、またはアプリを再インストールせずにアップグレードしても、追加のインストールイベントは生成されません。
デバイスではなくユニークユーザーに基づいてインストール数をカウントしたい場合は、**App settings**に移動して[**Installs definition for analytics**](general#4-installs-definition-for-analytics)を設定してください。
:::
```kotlin showLineNumbers
AdaptyConfig.Builder("PUBLIC_SDK_KEY")
.withCustomerUserId("user123") // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
.build()
```
### ユーザーのログアウト \{#log-users-out\}
ユーザーのログアウトボタンがある場合は、`logout`メソッドを使用します。
:::important
ユーザーをログアウトすると、そのユーザーのために新しい匿名プロファイルが作成されます。
:::
```kotlin showLineNumbers
Adapty.logout()
.onSuccess {
// successful logout
}
.onError { error ->
// handle the error
}
```
:::info
ユーザーをアプリに再度ログインさせるには、`identify`メソッドを使用します。
:::
### ログインなしでの購入を許可する \{#allow-purchases-without-login\}
ユーザーがアプリへのログイン前後の両方で購入できる場合、ログイン後もアクセスが維持されるように設定する必要があります。
1. ログアウト状態のユーザーが購入すると、Adaptyはその購入を匿名プロファイルIDに紐付けます。
2. ユーザーがアカウントにログインすると、Adaptyは識別済みプロファイルを使用するよう切り替わります。
- 新しいカスタマーユーザーIDの場合(たとえば、登録前に購入が行われた場合)、Adaptyは現在のプロファイルにカスタマーユーザーIDを割り当てるため、すべての購入履歴が維持されます。
- 既存のカスタマーユーザーIDの場合(カスタマーユーザーIDがすでにプロファイルにリンクされている場合)、プロファイルの切り替え後に実際のアクセスレベルを取得する必要があります。識別後すぐに[`getProfile`](kmp-check-subscription-status)を呼び出すか、[プロファイルの更新をリッスンする](kmp-check-subscription-status)ことでデータが自動的に同期されます。
## 次のステップ \{#next-steps\}
おめでとうございます!アプリにアプリ内課金のロジックが実装できました!アプリの収益化がうまくいくことを願っています!
Adaptyをさらに活用するために、以下のトピックも確認してください。
- [**テスト**](troubleshooting-test-purchases):すべてが期待どおりに動作することを確認する
- [**インテグレーション**](configuration):マーケティングアトリビューションや分析サービスとわずか1行のコードで連携する
- [**カスタムプロファイル属性の設定**](kmp-setting-user-attributes):ユーザープロファイルにカスタム属性を追加してセグメントを作成し、A/Bテストを実施したり、ユーザーに応じて異なるペイウォールを表示したりする
---
# File: adapty-sdk-integration-skill-kmp
---
---
title: "SDK統合スキルを使ってKotlin MultiplatformアプリにAdaptyを組み込む"
description: "adapty-sdk-integrationスキルを使用して、AIコーディングツールでKotlin MultiplatformアプリにAdapty SDKをエンドツーエンドで統合します。"
---
:::important
このスキルはベータ版です。処理が止まったり予期しない動作をした場合は、代わりに[ステップバイステップの統合ガイド](adapty-cursor-kmp)を参照してください。AIツールが各ステージを適切なドキュメントとともに順を追って進められるよう設計されています。
:::
[adapty-sdk-integration スキル](https://github.com/adaptyteam/adapty-sdk-integration-skill)は、Adapty のインテグレーションをエンドツーエンドで自動化します。ダッシュボードのセットアップ、SDK のインストール、ペイウォール、各ステージの検証まで対応しています。プラットフォームを自動検出し、各ステージで関連する Adapty ドキュメントを取得します。
**対応ツール**: Claude Code、GitHub Copilot CLI、OpenAI Codex、Gemini CLI。
インストールするには、お使いのツールに対応したフォームを選択してください。全リストは[スキルの README](https://github.com/adaptyteam/adapty-sdk-integration-skill) にあります。
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex またはその他のツール** — [skills CLI](https://skills.sh) を使用してください(この方法でインストールしたスキルは自動更新されません):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
または、リポジトリをクローンして `skills/adapty-sdk-integration/` をお使いのツールのスキルディレクトリにコピーしてください。
インストール後、プロジェクトでスキルを実行します:
```
/adapty-sdk-integration
```
スキルがいくつかのセットアップに関する質問をした後、ダッシュボードのセットアップ、SDK のインストール、ペイウォール、検証の手順を案内します。
---
# File: adapty-cursor-kmp
---
---
title: "AIアシスタンスを使ってAdaptyをKotlin Multiplatformアプリに統合する"
description: "Cursor、Context7、ChatGPT、Claude、またはその他のAIツールを使用して、Kotlin MultiplatformアプリにAdaptyを統合するためのステップバイステップガイド。"
---
このガイドでは、AIコーディングツールを使いながら、Kotlin MultiplatformアプリへのAdapty統合をステップバイステップで進めます。適切なAdaptyドキュメントを正しい順番でAIに渡していくことがポイントです。
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## はじめる前に:ダッシュボードの設定 \{#before-you-start-dashboard-setup\}
AdaptyのSDKコードを書く前に、ダッシュボードでいくつかの設定が必要です。インタラクティブなLLMスキルを使う方法と、ダッシュボードから手動で行う方法があります。
### スキルを使う方法(推奨) \{#skill-approach-recommended\}
Adapty CLIスキルを使うと、アプリ、プロダクト、アクセスレベル、ペイウォール、プレースメントの設定をLLMから直接行えます。ダッシュボードを都度開く必要がありません。必要なのは、ダッシュボードで[ストアを接続する](integrate-payments)ことだけです。
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
スキルを追加したら、エージェントで `/adapty-cli` を実行してください。各ステップを順番にガイドしてくれます。ストアの接続が必要なタイミングでは、ダッシュボードを開くよう案内されます。
### ダッシュボードを使う方法 \{#dashboard-approach\}
すべて手動で設定したい場合は、コードを書く前に以下の手順を完了してください。ダッシュボードの値はLLMが自動で取得することはできないため、自分で用意する必要があります。
1. **アプリストアを接続する**: Adapty ダッシュボードで **App settings → General** に移動し、KMPアプリがApp StoreとGoogle Play両方を対象とする場合は両方接続してください。これは購入機能を動作させるために必要です。
[アプリストアを接続する](integrate-payments)
2. **Public SDK keyをコピーする**: Adapty ダッシュボードで **App settings → General** に移動し、**API keys** セクションを確認してください。コード上では、Adaptyの設定ビルダーに渡す文字列です。
3. **プロダクトを少なくとも1つ作成する**: Adapty ダッシュボードの **Products** ページで作成してください。コードからプロダクトを直接参照することはなく、Adaptyはペイウォール経由でプロダクトを配信します。
[プロダクトを追加する](quickstart-products)
4. **ペイウォールとプレースメントを作成する**: Adapty ダッシュボードの **Paywalls** ページでペイウォールを作成し、**Placements** ページでプレースメントに割り当ててください。コード上では、`Adapty.getPaywall("YOUR_PLACEMENT_ID")` に渡す文字列がプレースメントIDです。
[ペイウォールを作成する](quickstart-paywalls)
5. **アクセスレベルを設定する**: Adapty ダッシュボードの **Products** ページで各プロダクトに対して設定してください。コード上では `profile.accessLevels["premium"]?.isActive` で確認する文字列です。デフォルトの `premium` アクセスレベルはほとんどのアプリで使えます。プロダクトによってアクセスできる機能が異なる場合(例: `basic` プランと `pro` プラン)は、コーディングを始める前に[追加のアクセスレベルを作成](assigning-access-level-to-a-product)してください。
:::tip
5つすべて揃ったら、コードを書く準備ができています。LLMに「Public SDK keyはX、プレースメントIDはY」と伝えることで、正確な初期化コードとペイウォール取得コードを生成してもらえます。
:::
### 準備が整ったら設定するもの \{#set-up-when-ready\}
コーディングを始めるのに必須ではありませんが、統合が進むにつれて必要になるものです:
- **A/B テスト**: **Placements** ページで設定できます。コードの変更は不要です。
[A/B テスト](ab-tests)
- **追加のペイウォールとプレースメント**: 異なるプレースメントIDを使って `getPaywall` の呼び出しを追加してください。
- **アナリティクス連携**: **Integrations** ページで設定します。連携方法は各サービスによって異なります。[アナリティクス連携](analytics-integration)と[アトリビューション連携](attribution-integration)を参照してください。
## AdaptyドキュメントをLLMに渡す \{#feed-adapty-docs-to-your-llm\}
### Context7を使う(推奨) \{#use-context7-recommended\}
[Context7](https://context7.com)は、LLMが最新のAdaptyドキュメントに直接アクセスできるMCPサーバーです。質問内容に応じて必要なドキュメントを自動的に取得するため、URLを手動で貼り付ける必要がありません。
Context7は **Cursor**、**Claude Code**、**Windsurf**、その他のMCP対応ツールで利用できます。設定するには次のコマンドを実行してください:
```
npx ctx7 setup
```
エディタを自動検出してContext7サーバーを設定します。手動でセットアップする場合は[Context7 GitHubリポジトリ](https://github.com/upstash/context7)を参照してください。
設定後は、プロンプトでAdaptyライブラリを参照できます:
```
Use the adaptyteam/adapty-docs library to look up how to install the Kotlin Multiplatform SDK
```
:::warning
Context7を使えばドキュメントのリンクを手動で貼る手間は省けますが、実装の順序は重要です。以下の[実装ウォークスルー](#implementation-walkthrough)をステップごとに進めて、確実に動作させてください。
:::
### プレーンテキストのドキュメントを使う \{#use-plain-text-docs\}
AdaptyのドキュメントはどれもプレーンテキストのMarkdownで取得できます。URLの末尾に `.md` を付けるか、記事タイトルの下にある **Copy for LLM** をクリックしてください。例: [adapty-cursor-kmp.md](https://adapty.io/docs/ja/adapty-cursor-kmp.md)
以下の[実装ウォークスルー](#implementation-walkthrough)の各ステップには、「LLMに送る内容」ブロックに `.md` リンクが含まれています。
まとめて複数のドキュメントを渡したい場合は、下記の[インデックスファイルとプラットフォーム別サブセット](#plain-text-doc-index-files)を参照してください。
## 実装ウォークスルー \{#implementation-walkthrough\}
このガイドの残りの部分では、実装順にAdaptyの統合を進めます。各ステップにはLLMに送るドキュメント、完了時の確認事項、よくある問題を記載しています。
### 統合を計画する \{#plan-your-integration\}
コードを書き始める前に、LLMにプロジェクトを分析させて実装計画を立てましょう。AIツールにプランニングモードがある場合(CursorやClaude Codeのプランモードなど)、それを使うことでLLMがプロジェクト構造とAdaptyドキュメントの両方を読んでからコードを書いてくれます。
購入の実装方法をLLMに伝えてください。選択によって参照すべきガイドが変わります:
- [**Adapty ペイウォールビルダー**](adapty-paywall-builder): Adaptyのノーコードビルダーでペイウォールを作成し、SDKが自動的にレンダリングします。
- [**手動作成のペイウォール**](kmp-making-purchases): 自分でペイウォールUIをコードで作成しますが、プロダクトの取得と購入処理にはAdaptyを使います。
- [**オブザーバーモード**](observer-vs-full-mode): 既存の購入インフラをそのまま使い、Adaptyはアナリティクスと連携のみに使います。
どれを選べばいいか迷ったら、[クイックスタートの比較表](kmp-quickstart-paywalls)を参照してください。
### SDKのインストールと設定 \{#install-and-configure-the-sdk\}
GradleでAdapty SDKの依存関係を追加し、Public SDK keyで有効化してください。これがすべての基盤になります。
**ガイド:** [Adapty SDKのインストールと設定](sdk-installation-kotlin-multiplatform)
LLMに送る内容:
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/ja/sdk-installation-kotlin-multiplatform.md
```
:::tip[チェックポイント]
- **期待される結果:** アプリがビルドされ、起動します。Logcat(Android)またはXcodeコンソール(iOS)にAdaptyの有効化ログが表示されます。
- **注意点:** 「Public API key is missing」→ プレースホルダーをApp settingsの実際のキーに置き換えたか確認してください。
:::
### ペイウォールの表示と購入処理 \{#show-paywalls-and-handle-purchases\}
プレースメントIDでペイウォールを取得し、表示して、購入イベントを処理します。必要なガイドは購入の実装方法によって異なります。
進めながら都度サンドボックスで購入をテストしてください。最後まで待たないようにしましょう。設定方法は[サンドボックスでの購入テスト](test-purchases-in-sandbox)を参照してください。
デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、この設定を推奨します。
ただし、ユーザーのインターネット接続が不安定な場合は、`AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` の使用を検討してください。これはキャッシュが存在する場合にキャッシュデータを返します。この場合、ユーザーが最新のデータを取得できないことがありますが、接続状況にかかわらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける用途では安全に使用できます。
キャッシュはアプリ再起動後も保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はフローとペイウォールをローカルに2つの層で保存します。上記の定期更新キャッシュと[フォールバックペイウォール](fallback-paywalls)です。また、より高速な取得のために CDN を使用し、CDN に到達できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定する値です。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
まれに、内部で複数のリクエストが発生するため、`loadTimeout` で指定した時間よりわずかに遅れてタイムアウトすることがあります。
Kotlin Multiplatform の場合: `5.seconds` のような拡張関数で `Duration` を作成できます。`.seconds` は `kotlin.time.Duration.Companion.seconds` によって提供されます。
| レスポンスパラメーター: | パラメーター | 説明 | | :-------- | :---------- | | Flow | プレースメント、識別子(`instanceIdentity`、`variationId`)、名前、ペイウォールのバリアント(`paywalls` — `AdaptyFlowPaywall` のリスト)、リモートコンフィグ(`remoteConfigs` — ロケールごとに1エントリのリスト)を含む `AdaptyFlow` オブジェクト。プリロード、カスタム UI、またはプログラムによる確認のために実際のプロダクトを取得するには、`getPaywallProducts(flow)` を呼び出してください。 | ## ビューの設定を取得する \{#fetch-the-view-configuration\} フローまたはペイウォールを取得したら、`createFlowView` メソッドを使ってビューの設定を読み込み、ビューを一度に作成します。確認が必要な別のフラグはありません。プレースメントが **Flow Builder**(フロー)または **Paywall Builder**(ペイウォール)で設計されている場合、`createFlowView` は表示準備の整ったビューを返します。プレースメントがビルダー UI のないカスタムペイウォールの場合、`createFlowView` は `AdaptyResult.Error` を返します。その場合は[リモートコンフィグペイウォールとして処理してください](present-remote-config-paywalls-kmp)。 :::important Flow Builderで **Show on device** トグルを必ず有効にしてください。このオプションがオンになっていない場合、ビュー設定を取得できません。 ::: ```kotlin showLineNumbers AdaptyUI.createFlowView( flow = flow, loadTimeout = 5.seconds, preloadProducts = true ).onSuccess { view -> // use view }.onError { error -> // the flow has no view configured, or view creation failed } ``` | パラメータ | 必須/任意 | 説明 | | :--------------------------- | :------------- | :----------------------------------------------------------- | | **flow** | 必須 | `Adapty.getFlow` で取得した `AdaptyFlow` オブジェクト。 | | **loadTimeout** | 任意 | このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルのフォールバックが返されます。内部的に複数のリクエストで構成される場合があるため、指定した `loadTimeout` より若干遅れてタイムアウトすることがあります。`kotlin.time.Duration.Companion` の `5.seconds` などの拡張関数を利用できます。 | | **preloadProducts** | 任意 | `true` に設定すると、パフォーマンス向上のためにプロダクトを事前読み込みします。有効にすると、プロダクトが事前に読み込まれ、フローやペイウォールの表示にかかる時間が短縮されます。 | | **productPurchaseParams** | 任意 | [`AdaptyProductIdentifier`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-product-identifier/) から [`AdaptyPurchaseParameters`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-purchase-parameters/) へのマップです。フローやペイウォール内の個々のプロダクトに対して、パーソナライズドオファーやサブスクリプション更新パラメータなど、購入固有のパラメータを設定するために使用します。 | :::note 複数の言語を使用している場合は、[ビルダーのローカライズ](add-paywall-locale-in-adapty-paywall-builder)の追加方法をご確認ください。 ::: 読み込みが完了したら、[フローまたはペイウォールを表示](kmp-present-paywalls)します。 ## デフォルトオーディエンス向けのフローまたはペイウォールを取得して高速化する \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} 通常、フローとペイウォールはほぼ即座に取得されるため、高速化を意識する必要はありません。ただし、オーディエンスやプレースメントが多数ある場合や、ユーザーのインターネット接続が不安定な場合は、フローやペイウォールの取得に予想以上の時間がかかることがあります。そのような状況では、何も表示しないよりも、デフォルトのフローまたはペイウォールを表示してスムーズなユーザー体験を確保したいと思うかもしれません。 これに対処するために、`getFlowForDefaultAudience` メソッドを使用できます。このメソッドは、**All Users** オーディエンス向けに指定されたプレースメントのフローまたはペイウォールを取得します。ただし、推奨されるアプローチは、上記の[フロー/ペイウォールの取得](#fetch-flowpaywall)セクションで詳しく説明されている `getFlow` メソッドでフローまたはペイウォールを取得することであると理解しておくことが重要です。 :::warning `getFlow` を推奨する理由 `getFlowForDefaultAudience` メソッドにはいくつかの重大な欠点があります: - **後方互換性の問題**: 現在のバージョンと将来のバージョンで異なるフローを表示する必要がある場合、課題が生じる可能性があります。現在の(レガシー)バージョンをサポートするフローを設計するか、現在の(レガシー)バージョンのユーザーがレンダリングされないフローで問題が発生することを受け入れるかのいずれかになります。 - **ターゲティングの喪失**: すべてのユーザーが **All Users** オーディエンス向けに設計された同一のフローを見ることになり、国、マーケティングアトリビューション、独自のカスタム属性に基づくパーソナライズされたターゲティングが失われます。 これらのデメリットを受け入れてでもフローやペイウォールのフェッチを高速化したい場合は、以下のように `getFlowForDefaultAudience` メソッドを使用してください。そうでない場合は、[上記](#fetch-flowpaywall)で説明した `getFlow` をご利用ください。 ::: ```kotlin showLineNumbers Adapty.getFlowForDefaultAudience( placementId = "YOUR_PLACEMENT_ID", fetchPolicy = AdaptyPaywallFetchPolicy.Default, ).onSuccess { flow -> // the requested flow }.onError { error -> // handle the error } ``` | パラメーター | 必須/任意 | 説明 | |---------|--------|-----------| | **placementId** | 必須 | [プレースメント](placements)の識別子。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **fetchPolicy** | デフォルト: `AdaptyPaywallFetchPolicy.Default` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。この方式では常に最新のデータをユーザーに提供できるため、こちらをお勧めします。
ただし、ユーザーのインターネット接続が不安定な場合は、`AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` の使用を検討してください。キャッシュが存在する場合はそのデータを返します。この場合、ユーザーが受け取るデータが最新でない可能性はありますが、接続状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける目的で使用しても問題ありません。
なお、キャッシュはアプリを再起動しても保持されます。クリアされるのは、アプリのアンインストール時または手動でクリーンアップした場合のみです。
| ## アセットのカスタマイズ \{#customize-assets\} フローまたはペイウォール内の画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像と動画には、事前に定義されたID(`hero_image` と `hero_video`)があります。カスタムアセットバンドルでは、これらのIDを使って各要素を指定し、動作をカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定](custom-media)する必要があります。 たとえば、次のことができます: - 一部のユーザーに別の画像や動画を表示する。 - リモートのメイン画像を読み込んでいる間、ローカルのプレビュー画像を表示する。 - 動画を再生する前にプレビュー画像を表示する。 カスタムアセットをマップ経由で提供する方法の例を示します。 :::info Kotlin Multiplatform SDK はローカルアセットのみをサポートしています。リモートコンテンツの場合は、カスタムアセットとして使用する前にアセットをダウンロードしてローカルにキャッシュしてください。 ::: ```kotlin showLineNumbers // Import generated Res class for accessing resources viewModelScope.launch { // Get URIs for bundled resources using Res.getUri() val heroImagePath = Res.getUri("files/images/hero_image.png") val demoVideoPath = Res.getUri("files/videos/demo_video.mp4") // Or read image as byte data val imageByteData = Res.readBytes("files/images/avatar.png") // Create custom assets map val customAssets: Map任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-paywall-locale-in-adapty-paywall-builder)の識別子。このパラメーターは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードである必要があります。最初のサブタグは言語、2番目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードとその推奨される使い方については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `AdaptyPaywallFetchPolicy.Default` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この設定を推奨します。ユーザーが常に最新のデータを受け取れるためです。
ただし、ユーザーが不安定なインターネット接続を使用していると考えられる場合は、`AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` の使用を検討してください。キャッシュが存在する場合はキャッシュされたデータを返します。この場合、ユーザーは必ずしも最新のデータを受け取れるわけではありませんが、接続状況に関わらず高速な読み込みを体験できます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても安全です。
アプリを再起動してもキャッシュは維持され、アプリの再インストールまたは手動でのクリア時にのみ削除されます。
Adapty SDK はペイウォールをローカルに2層で保存します: 上記の定期更新キャッシュと[フォールバックペイウォール](fallback-paywalls)です。また、ペイウォールをより高速に取得するために CDN を使用し、CDN が利用できない場合に備えてスタンドアロンのフォールバックサーバーも使用しています。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンのペイウォールを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。
なお、このメソッドは内部で複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間より若干遅れてタイムアウトすることがあります。
Kotlin Multiplatform の場合: 拡張関数(例: `5.seconds`、`.seconds` は `import com.adapty.utils.seconds` から)または `TimeInterval.seconds(5)` を使って `TimeInterval` を作成できます。制限なしに設定する場合は `TimeInterval.INFINITE` を使用してください。
| レスポンスパラメーター: | パラメーター | 説明 | | :-------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | プロダクトIDのリスト、ペイウォール識別子、リモートコンフィグ、その他のプロパティを含む [`AdaptyPaywall`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall/) オブジェクト。 | ## ペイウォールビルダーで作成したペイウォールのビュー設定を取得する \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important ペイウォールビルダーの **Show on device** トグルを有効にしてください。このオプションがオンになっていない場合、ビュー設定を取得できません。 ::: ペイウォールを取得したら、`ViewConfiguration` が含まれているかどうかを確認してください。これが含まれている場合、そのペイウォールはペイウォールビルダーで作成されたことを示します。`ViewConfiguration` が存在する場合はペイウォールビルダーのペイウォールとして扱い、存在しない場合は[リモートコンフィグのペイウォールとして処理してください](present-remote-config-paywalls-kmp)。 `createPaywallView` メソッドを使用して、ビューの設定を読み込みます。 ```kotlin showLineNumbers if (paywall.hasViewConfiguration) { AdaptyUI.createPaywallView( paywall = paywall, loadTimeout = 5.seconds, preloadProducts = true ).onSuccess { paywallView -> // use paywallView }.onError { error -> // handle the error } } else { // use your custom logic } ``` | パラメーター | 必須/任意 | 説明 | | :--------------------------- | :------------- | :----------------------------------------------------------- | | **paywall** | 必須 | 目的のペイウォールのコントローラーを取得するための `AdaptyPaywall` オブジェクト。 | | **loadTimeout** | 任意 | このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルのフォールバックが返されます。なお、このメソッドは内部で複数のリクエストを行う場合があるため、`loadTimeout` で指定した時間よりわずかに遅くタイムアウトすることがあります。`kotlin.time.Duration.Companion` の `5.seconds` のような拡張関数を使用できます。 | | **preloadProducts** | 任意 | プロダクトを事前読み込みしてパフォーマンスを向上させるには `true` に設定します。有効にすると、プロダクトが事前に読み込まれ、ペイウォールの表示に要する時間が短縮されます。 | | **productPurchaseParams** | 任意 | [`AdaptyProductIdentifier`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-product-identifier/) から [`AdaptyPurchaseParameters`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-purchase-parameters/) へのマップ。ペイウォール内の個々のプロダクトに対して、パーソナライズドオファーやサブスクリプション更新パラメーターなど、購入固有のパラメーターを設定するために使用します。 | :::note 複数の言語を使用している場合は、[ペイウォールビルダーのローカライゼーションの追加](add-paywall-locale-in-adapty-paywall-builder)方法をご確認ください。 ::: 読み込みが完了したら、[ペイウォールを表示](kmp-present-paywalls)してください。 ## デフォルトオーディエンス向けペイウォールを取得して表示を高速化する \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} 通常、ペイウォールはほぼ瞬時に取得されるため、この処理を高速化することを気にする必要はありません。ただし、オーディエンスやペイウォールの数が多く、ユーザーのインターネット接続が遅い場合、ペイウォールの取得に想定以上の時間がかかることがあります。そのような状況では、ペイウォールをまったく表示しないよりも、デフォルトのペイウォールを表示してスムーズなユーザー体験を確保したい場合があるでしょう。 この問題に対処するには、`getPaywallForDefaultAudience` メソッドを使用することで、**All Users** オーディエンスに対して指定プレースメントのペイウォールを取得できます。ただし、推奨される方法は `getPaywall` メソッドによるペイウォールの取得であることを理解しておくことが重要です。詳しくは上記の [ペイウォール情報の取得](#fetch-paywall-designed-with-paywall-builder) セクションをご覧ください。 :::warning `getPaywall` を推奨する理由 `getPaywallForDefaultAudience` メソッドにはいくつかの重大な欠点があります: - **潜在的な後方互換性の問題**: 異なるアプリバージョン(現在および将来)でそれぞれ異なるペイウォールを表示する必要がある場合、課題が生じる可能性があります。現在(レガシー)バージョンをサポートするペイウォールを設計するか、現在(レガシー)バージョンのユーザーがペイウォールを正常に表示できない可能性を許容するかのどちらかになります。 - **ターゲティングの喪失**: すべてのユーザーに **All Users** オーディエンス向けに設計された同一のペイウォールが表示されます。つまり、国、マーケティングのアトリビューション、独自のカスタム属性などに基づいたパーソナライズされたターゲティングが失われます。 デフォルトオーディエンス向けのペイウォール取得を高速化するメリットを優先する場合は、以下のように `getPaywallForDefaultAudience` メソッドを使用してください。そうでない場合は、[上記](#fetch-paywall-designed-with-paywall-builder)で説明した `getPaywall` を使用してください。 ::: ```kotlin showLineNumbers Adapty.getPaywallForDefaultAudience( placementId = "YOUR_PLACEMENT_ID", locale = "en", fetchPolicy = AdaptyPaywallFetchPolicy.Default, ).onSuccess { paywall -> // the requested paywall }.onError { error -> // handle the error } ``` | パラメーター | 必須/任意 | 説明 | |---------|--------|-----------| | **placementId** | 必須 | [プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子です。このパラメーターは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードとその推奨される使い方については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `AdaptyPaywallFetchPolicy.Default` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるようにするため、この設定を推奨します。
ただし、ユーザーが不安定なインターネット環境を利用していると考えられる場合は、`AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` の使用を検討してください。キャッシュが存在する場合にキャッシュされたデータを返します。この場合、最新のデータが得られないことがありますが、インターネット接続が不安定であっても読み込み時間が短くなります。キャッシュは定期的に更新されるため、ネットワークリクエストを避けるためにセッション中に使用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリア時にのみ削除されます。
| ## アセットのカスタマイズ \{#customize-assets\} ペイウォール内の画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像と動画には、あらかじめ定義されたID(`hero_image` と `hero_video`)があります。カスタムアセットバンドルでは、これらのIDを使って各要素を指定し、動作をカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定](custom-media)する必要があります。 たとえば、次のようなことができます: - 一部のユーザーに別の画像や動画を表示する。 - リモートのメイン画像の読み込み中に、ローカルのプレビュー画像を表示する。 - 動画を再生する前にプレビュー画像を表示する。 :::important この機能を使用するには、Adapty SDK をバージョン 3.7.0 以上にアップデートしてください。 ::: カスタムアセットをマップ経由で提供する方法の例を示します。 :::info Kotlin Multiplatform SDK はローカルアセットのみをサポートしています。リモートコンテンツを使用する場合は、カスタムアセットで使用する前にアセットをダウンロードしてローカルにキャッシュしてください。 ::: ```kotlin showLineNumbers // Import generated Res class for accessing resources viewModelScope.launch { // Get URIs for bundled resources using Res.getUri() val heroImagePath = Res.getUri("files/images/hero_image.png") val demoVideoPath = Res.getUri("files/videos/demo_video.mp4") // Or read image as byte data val imageByteData = Res.readBytes("files/images/avatar.png") // Create custom assets map val customAssets: Map
## ペイウォールのビュー数が多すぎる \{#the-paywall-view-number-is-too-big\}
**問題**: ペイウォールのビュー数が予想の2倍になっている。
**原因**: コード内で `logShowPaywall` を呼び出している可能性があります。ペイウォールビルダーを使用している場合、この呼び出しによってビュー数が重複します。ペイウォールビルダーで作成したペイウォールでは、アナリティクスが自動的に記録されるため、このメソッドを使用する必要はありません。
**解決策**: ペイウォールビルダーを使用している場合は、コード内で `logShowPaywall` を呼び出していないことを確認してください。
---
# File: kmp-implement-paywalls-manually
---
---
title: "Kotlin Multiplatform SDKでペイウォールを手動で実装する"
description: "Adapty SDKを使用してKotlin MultiplatformアプリにペイウォールをKotlin Multiplatformで手動実装する方法を学びましょう。"
---
## 購入の受け付け \{#accept-purchases\}
自分で実装したペイウォールを使用している場合、`makePurchase` メソッドを使って購入処理を Adapty に委譲できます。これにより、すべてのユーザーシナリオが自動的に処理され、あなたは購入結果のハンドリングだけに集中できます。
:::important
`makePurchase` は Adapty ダッシュボードで作成されたプロダクトと連携します。[クイックスタートガイド](quickstart)に従って、ダッシュボードでプロダクトの設定と取得方法を必ず構成してください。
:::
デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、この設定を推奨します。
ただし、ユーザーのインターネット接続が不安定だと考えられる場合は、`AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` を使用してキャッシュデータが存在する場合はそれを返すことを検討してください。この場合、ユーザーが受け取るデータが最新でない可能性はありますが、インターネット接続の状態にかかわらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、ネットワークリクエストを避けるためにセッション中に使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリーンアップした場合にのみ消去されます。
Adapty SDK はフローとペイウォールを 2 つの層に保存します。1 つ目は上述の定期更新キャッシュで、2 つ目は[フォールバックペイウォール](kmp-use-fallback-paywalls)です。また、フローとペイウォールをより速く取得するために CDN を使用し、CDN が利用できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が乏しい状況でも信頼性を確保しながら、常に最新バージョンのフローとペイウォールを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5 秒 |このメソッドのタイムアウトを制限する値です。タイムアウトに達した場合、キャッシュされたデータまたはローカルフォールバックが返されます。
内部では複数のリクエストで構成される場合があるため、まれに `loadTimeout` で指定した時間よりわずかに遅くタイムアウトすることがあります。
| プロダクトIDをハードコードしないでください!フローはリモートで設定されるため、利用可能なプロダクト、プロダクト数、特別オファー(無料トライアルなど)は随時変更される可能性があります。こうしたシナリオにコードが対応できるよう注意してください。 たとえば、最初に2つのプロダクトを取得した場合、アプリはその2つを表示する必要があります。その後3つのプロダクトを取得した場合、コードを変更することなく3つすべてを表示できる必要があります。ハードコードが必要なのはプレースメントIDのみです。 レスポンスパラメーター: | パラメーター | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | `AdaptyFlow` オブジェクト。フロー識別子、ペイウォールのバリアント(`paywalls` — それぞれに独自のプロダクト識別子を持つ)、設定されたロケールごとに1エントリの `remoteConfigs` リスト、およびその他のプロパティが含まれます。フローのプロダクトを取得するには、`getPaywallProducts(flow)` を呼び出してください。 | :::note v4 では、`getFlow` に `locale` パラメーターはありません。`createFlowView` でフローをレンダリングする際、ローカライズは自動的に解決されます。カスタムペイウォールの場合、利用可能なすべてのロケールが `flow.remoteConfigs` にまとめて返されます。ユーザーのデバイスまたはアプリの設定に合ったロケールを選択してください。詳細については、[ローカライズとロケールコード](kmp-localizations-and-locale-codes)をご覧ください。 ::: ## プロダクトの取得 \{#fetch-products\} フローを取得したら、それに対応するプロダクト配列を照会できます: ```kotlin showLineNumbers Adapty.getPaywallProducts(flow).onSuccess { products -> // the requested products }.onError { error -> // handle the error } ``` レスポンスパラメーター: | パラメータ | 説明 | | :-------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/) オブジェクトのリスト。プロダクト識別子、プロダクト名、価格、通貨、サブスクリプション期間、その他のプロパティが含まれます。 | 独自のフロー設計を実装する場合、[`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/) オブジェクトの以下のプロパティが必要になることがあります。よく使われるプロパティを以下に示しますが、利用可能なすべてのプロパティの詳細については、リンク先のドキュメントを参照してください。 | プロパティ | 説明 | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | プロダクトのタイトルを表示するには、`product.localizedTitle` を使用します。ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づいて行われます。 | | **Price** | ローカライズされた価格を表示するには、`product.price.localizedString` を使用します。このローカライズはデバイスのロケール情報に基づいています。`product.price.amount` を使用して価格を数値として取得することもできます。値はローカル通貨で提供されます。関連する通貨記号を取得するには、`product.price.currencySymbol` を使用します。 | | **Subscription Period** | 期間(週、月、年など)を表示するには、`product.subscriptionDetails?.localizedSubscriptionPeriod` を使用します。このローカライズはデバイスのロケールに基づいています。サブスクリプション期間をプログラムで取得するには、`product.subscriptionDetails?.subscriptionPeriod` を使用します。そこから `unit` 列挙型にアクセスして長さ(DAY、WEEK、MONTH、YEAR、または UNKNOWN)を取得できます。`numberOfUnits` の値で期間の単位数を取得できます。たとえば、四半期ごとのサブスクリプションの場合、unit プロパティには `MONTH`、numberOfUnits プロパティには `3` が表示されます。 | | **Introductory Offer** | サブスクリプションに初回オファーが含まれているかどうかを示すバッジやその他のインジケーターを表示するには、`product.subscriptionDetails?.introductoryOfferPhases` プロパティを確認してください。これは最大2つの割引フェーズ(無料トライアルフェーズと初回価格フェーズ)を含むリストです。各フェーズオブジェクトには以下の便利なプロパティが含まれています:デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方法を推奨します。ユーザーが常に最新のデータを受け取れるためです。
ただし、ユーザーのインターネット接続が不安定な場合は、`AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` の使用を検討してください。キャッシュが存在する場合はキャッシュを返します。この場合、最新データが届かないことがありますが、接続状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける目的で使用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップ時にのみ消去されます。
|任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子。マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。
例:`en` は英語、`pt-br` はブラジルポルトガル語を表します。
| | **fetchPolicy** | デフォルト: `AdaptyPaywallFetchPolicy.Default` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方法を推奨します。ユーザーが常に最新のデータを取得できるためです。
ただし、ユーザーのインターネット接続が不安定な場合は、`AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` を使用してキャッシュデータが存在する場合にそれを返すことを検討してください。この場合、ユーザーが最新のデータを取得できないことがありますが、接続状況に関わらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、セッション中のネットワークリクエストを避けるために安全に使用できます。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップ時のみクリアされます。
Adapty SDK はペイウォールを2つの層に保存します。上記の定期的に更新されるキャッシュと[フォールバックペイウォール](kmp-use-fallback-paywalls)です。また、ペイウォールをより高速に取得するためにCDNを使用し、CDNに到達できない場合に備えたスタンドアロンのフォールバックサーバーも使用します。このシステムは、インターネット接続が不安定な場合でも信頼性を確保しつつ、常に最新バージョンのペイウォールを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。
内部的に複数のリクエストで構成される場合があるため、まれに `loadTimeout` で指定した時間よりもわずかに遅れてタイムアウトすることがあります。
| プロダクトIDをハードコードしないでください!ペイウォールはリモートで設定されるため、利用可能なプロダクト、プロダクトの数、特別オファー(無料トライアルなど)は随時変更される可能性があります。こうしたシナリオにコードで対応できるようにしてください。 例えば、最初に2つのプロダクトを取得した場合、アプリはその2つを表示する必要があります。後で3つのプロダクトを取得した場合は、コードを変更することなく3つすべてを表示できる必要があります。ハードコードする必要があるのはプレースメントIDだけです。 レスポンスパラメーター: | パラメータ | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | プロダクトIDのリスト、ペイウォールの識別子、リモートコンフィグ、その他のプロパティを持つ [`AdaptyPaywall`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall/) オブジェクト。 | ## プロダクトの取得 \{#fetch-products\} ペイウォールを取得したら、それに対応するプロダクトの配列を取得できます: ```kotlin showLineNumbers Adapty.getPaywallProducts(paywall).onSuccess { products -> // the requested products }.onError { error -> // handle the error } ``` レスポンスパラメーター: | パラメーター | 説明 | | :-------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | プロダクト識別子、プロダクト名、価格、通貨、サブスクリプション期間、その他のプロパティを含む [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/) オブジェクトのリスト。 | 独自のペイウォールデザインを実装する際、[`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/) オブジェクトから以下のプロパティを参照することになるでしょう。よく使われるプロパティを以下に示しますが、利用可能なすべてのプロパティの詳細については、リンク先のドキュメントを参照してください。 | プロパティ | 説明 | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | プロダクトのタイトルを表示するには、`product.localizedTitle` を使用します。ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づいて行われます。 | | **Price** | ローカライズされた価格を表示するには、`product.price.localizedString` を使用します。このローカライズはデバイスのロケール情報に基づきます。`product.price.amount` を使用すると、価格を数値として取得することもできます。値はローカル通貨で提供されます。対応する通貨記号を取得するには、`product.price.currencySymbol` を使用します。 | | **Subscription Period** | 期間(週、月、年など)を表示するには、`product.subscriptionDetails?.localizedSubscriptionPeriod` を使用します。このローカライズはデバイスのロケールに基づきます。プログラムでサブスクリプション期間を取得するには、`product.subscriptionDetails?.subscriptionPeriod` を使用します。`unit` 列挙型から期間の長さ(DAY、WEEK、MONTH、YEAR、または UNKNOWN)を取得できます。`numberOfUnits` の値は期間の単位数を返します。例えば、四半期サブスクリプションの場合、unit プロパティには `MONTH`、numberOfUnits プロパティには `3` が表示されます。 | | **Introductory Offer** | サブスクリプションに初回オファーが含まれているかどうかをバッジなどで表示するには、`product.subscriptionDetails?.introductoryOfferPhases` プロパティを確認します。これは最大2つの割引フェーズ(無料トライアルフェーズと初回価格フェーズ)を含むリストです。各フェーズオブジェクトには以下のプロパティが含まれます:任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子。このパラメータはマイナス(**-**)文字で区切られた1つ以上のサブタグで構成された言語コードである必要があります。最初のサブタグは言語、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
| | **fetchPolicy** | デフォルト: `AdaptyPaywallFetchPolicy.Default` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、この設定を推奨します。
ただし、ユーザーのインターネット接続が不安定な場合は、`AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` を使用してキャッシュデータが存在する場合にそれを返すことを検討してください。この場合、ユーザーは最新のデータを取得できないことがありますが、インターネット接続の状態に関わらず、より速い読み込みを体験できます。キャッシュは定期的に更新されるため、ネットワークリクエストを減らすためにセッション中に使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストールや手動でのクリーンアップによってのみ削除されます。
|リクエストが成功した場合、レスポンスにはこのオブジェクトが含まれます。[AdaptyProfile](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-profile/) オブジェクトは、ユーザーのアクセスレベル、サブスクリプション、アプリ内の買い切り購入に関する包括的な情報を提供します。
アクセスレベルのステータスを確認して、ユーザーが必要なアクセス権を持っているかどうかを判断してください。
| :::warning **注意:** Apple の StoreKit バージョンが v2.0 未満で、Adapty SDK バージョンが v2.9.0 未満の場合は、代わりに [Apple App Store 共有シークレット](app-store-connection-configuration#step-5-enter-app-store-shared-secret)を提供する必要があります。この方法は現在 Apple により非推奨となっています。 ::: ## 購入時にサブスクリプションを変更する \{#change-subscription-when-making-a-purchase\} ユーザーが現在のサブスクリプションを更新する代わりに新しいサブスクリプションを選択した場合、その動作はアプリストアによって異なります。Google Play の場合、サブスクリプションは自動的に更新されません。以下の説明に従って、モバイルアプリのコードで切り替えを管理する必要があります。 Android でサブスクリプションを別のものに切り替えるには、追加パラメータを指定して `.makePurchase()` メソッドを呼び出してください: ```kotlin showLineNumbers val subscriptionUpdateParams = AdaptyAndroidSubscriptionUpdateParameters( oldSubVendorProductId = "old_subscription_product_id", replacementMode = AdaptyAndroidSubscriptionUpdateReplacementMode.CHARGE_FULL_PRICE ) val purchaseParams = AdaptyPurchaseParameters.Builder() .setSubscriptionUpdateParams(subscriptionUpdateParams) .build() Adapty.makePurchase( product = product, parameters = purchaseParams ).onSuccess { purchaseResult -> when (purchaseResult) { is AdaptyPurchaseResult.Success -> { val profile = purchaseResult.profile // successful cross-grade } is AdaptyPurchaseResult.UserCanceled -> { // user canceled the purchase flow } is AdaptyPurchaseResult.Pending -> { // the purchase has not been finished yet, e.g. user will pay offline by cash } } }.onError { error -> // Handle the error } ``` 追加リクエストパラメータ: | パラメータ | 必須 | 説明 | |:---------------|:---------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **parameters** | 任意 | [`AdaptyPurchaseParameters`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-purchase-parameters/) を通じて渡される [`AdaptyAndroidSubscriptionUpdateParameters`](https://kmp.adapty.io/////adapty/com.adapty.kmp.models/-adapty-android-subscription-update-parameters/) オブジェクト。 | サブスクリプションと切り替えモードについては、Google Developer ドキュメントで詳しく確認できます: - [切り替えモードについて](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [切り替えモードに関する Google の推奨事項](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - 切り替えモード [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE())。注意:このメソッドはサブスクリプションのアップグレードにのみ対応しています。ダウングレードはサポートされていません。 - 切り替えモード [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED())。注意:実際のサブスクリプション変更は、現在のサブスクリプションの請求期間が終了した時点でのみ適用されます。 ## iOS でオファーコードを利用する \{#redeem-offer-codes-in-ios\}[`AdaptyProfile`](https://kmp.adapty.io//////adapty/com.adapty.kmp.models/-adapty-profile/)オブジェクトです。このモデルにはアクセスレベル、サブスクリプション、および非サブスクリプション購入に関する情報が含まれています。
ユーザーがアプリにアクセスできるかどうかを判断するには、**アクセスレベルのステータス**を確認してください。
| :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: --- # File: implement-observer-mode-kmp --- --- title: "Kotlin Multiplatform SDKにオブザーバーモードを実装する" description: "Adaptyでオブザーバーモードを実装して、Kotlin Multiplatform SDKでユーザーのサブスクリプションイベントを追跡します。" --- すでに独自の購入インフラを持っており、Adapty への完全移行に踏み切れない場合は、[オブザーバーモード](observer-vs-full-mode)を検討してみてください。基本的な使い方では、オブザーバーモードにより高度なアナリティクスや、アトリビューション・アナリティクスシステムとのシームレスな統合が利用できます。 このニーズを満たす場合は、以下の2つの手順が必要です。 1. Adapty SDKの設定時に`observerMode`パラメーターを`true`に設定してオンにします。[Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)のセットアップ手順に従ってください。 2. 既存の購入インフラから[トランザクションを報告](report-transactions-observer-mode-kmp)します。 :::tip SDK v4では、ObserverモードでAdaptyレンダリングのフローやペイウォールを表示することもできます。ユーザーが購入または復元ボタンをタップすると、SDKがそのアクションをあなたのコードに渡し、購入や復元を自分で実行できます。[Observerモードでフローを表示する](kmp-present-flows-in-observer-mode)をご覧ください。 ::: ## オブザーバーモードの設定 \{#observer-mode-setup\} Adapty をサブスクリプションイベントの送信とアナリティクスにのみ使用し、購入やサブスクリプションのステータス管理は自分で行う場合は、オブザーバーモードを有効にしてください。 :::important オブザーバーモードで動作している場合、Adapty SDK はトランザクションをクローズしません。そのため、トランザクションの処理は必ずご自身で行ってください。 ::: ```kotlin showLineNumbers val config = AdaptyConfig .Builder("PUBLIC_SDK_KEY") .withObserverMode(true) // default false .build() Adapty.activate(configuration = config) .onSuccess { Log.d("Adapty", "SDK initialised in observer mode") } .onError { error -> Log.e("Adapty", "Adapty init error: ${error.message}") } ``` パラメーター: | パラメータ | 説明 | | --------------------------- | ------------------------------------------------------------ | | observerMode | [オブザーバーモード](observer-vs-full-mode)を制御するブール値。デフォルト値は `false` です。 | ## オブザーバーモードで Adapty のペイウォールを使用する \{#using-adapty-paywalls-in-observer-mode\} Adapty のペイウォールや A/B テスト機能も併用したい場合は可能ですが、オブザーバーモードでは追加の設定が必要です。上記の手順に加えて、以下を行ってください: 1. [リモートコンフィグペイウォール](present-remote-config-paywalls-kmp)の場合と同様に、通常通りペイウォールを表示します。 3. 購入トランザクションに[ペイウォールを紐付け](report-transactions-observer-mode-kmp)ます。 --- # File: report-transactions-observer-mode-kmp --- --- title: "Kotlin Multiplatform SDKのObserverモードでトランザクションを報告する" description: "Kotlin Multiplatform SDKのAdapty ObserverモードでユーザーインサイトとRevenue追跡のための購入トランザクションを報告します。" --- Observerモードでは、Adapty SDKは既存の購入システムを通じて行われた購入を自動的に追跡することができません。アプリストアからのトランザクションを手動で報告する必要があります。アナリティクスのエラーを防ぐために、アプリをリリースする**前**にこの設定を完了することが重要です。 `reportTransaction`を使用して、各トランザクションをAdaptyに明示的に報告してください。 :::warning **トランザクションの報告を省略しないでください!** `reportTransaction`を呼び出さないと、Adaptyはトランザクションを認識できず、アナリティクスに表示されず、インテグレーションにも送信されません。 ::: Adaptyのペイウォールを使用している場合は、トランザクションを報告する際に`variationId`を含めてください。これにより、購入がトリガーしたペイウォールに関連付けられ、正確なペイウォールアナリティクスが確保されます。 ```kotlin showLineNumbers Adapty.reportTransaction( transactionId = "your_transaction_id", variationId = paywall.variationId ).onSuccess { profile -> // Transaction reported successfully // profile contains updated user data }.onError { error -> // handle the error } ``` パラメーター: | パラメーター | 必須/任意 | 説明 | | --------------- | --------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | transactionId | 必須 | アプリストアの購入から取得したトランザクションID。通常、ストアから返される購入トークンまたはトランザクション識別子です。 | | variationId | 任意 | バリアントの文字列識別子。[AdaptyPaywall](https://kmp.adapty.io//////adapty/com.adapty.kmp.models/-adapty-paywall/)オブジェクトの`variationId`プロパティを使用して取得できます。 | --- # File: kmp-troubleshoot-purchases --- --- title: "Kotlin Multiplatform SDKの購入に関するトラブルシューティング" description: "Kotlin Multiplatform SDKの購入に関するトラブルシューティング" --- このガイドでは、Kotlin Multiplatform SDKで手動購入を実装する際によく発生する問題の解決方法を説明します。 ## makePurchaseは正常に呼び出されるが、プロファイルが更新されない \{#makepurchase-is-called-successfully-but-the-profile-is-not-being-updated\} **問題**: `makePurchase`メソッドが正常に完了するにもかかわらず、ユーザーのプロファイルとサブスクリプションの状態がAdaptyに反映されない。 **原因**: 通常、これはGoogle Play Storeのセットアップが不完全か、設定に問題があることを示しています。 **解決策**: [Google Playのセットアップ手順](initial-android)がすべて完了しているか確認してください。 ## makePurchaseが2回呼び出される \{#makepurchase-is-invoked-twice\} **問題**: 同じ購入に対して`makePurchase`メソッドが複数回呼び出されている。 **原因**: UIの状態管理の問題や、ユーザーの素早い操作によって購入フローが複数回トリガーされる場合に発生します。 **解決策**: [Google Playのセットアップ手順](initial-android)がすべて完了しているか確認してください。 ## オブザーバーモードでのAdaptyError.cantMakePayments \{#adaptyerror-cantmakepayments-in-observer-mode\} **問題**: オブザーバーモードで`makePurchase`を使用すると`AdaptyError.cantMakePayments`が発生する。 **原因**: オブザーバーモードでは、Adaptyの`makePurchase`メソッドを使用せず、購入処理を自前で行う必要があります。 **解決策**: 購入に`makePurchase`を使用している場合は、オブザーバーモードを無効にしてください。`makePurchase`を使用するか、オブザーバーモードで自前の購入処理を行うか、どちらか一方を選択する必要があります。詳細は[オブザーバーモードの実装](implement-observer-mode-kmp)を参照してください。 ## Adaptyエラー: (code: 103, message: Play Market request failed on purchases updated: responseCode=3, debugMessage=Billing Unavailable, detail: null) \{#adapty-error-code-103-message-play-market-request-failed-on-purchases-updated-responsecode3-debugmessagebilling-unavailable-detail-null\} **問題**: Google Play Storeから課金不可のエラーが返される。 **原因**: このエラーはAdatyとは無関係です。デバイスで課金が利用できないことを示すGoogle Play Billing Libraryのエラーです。 **解決策**: このエラーはAdaptyとは無関係です。Play Storeのドキュメントで詳細を確認できます: [Handle BillingResult response codes](https://developer.android.com/google/play/billing/errors#billing_unavailable_error_code_3) | Play Billing | Android Developers。 ## makePurchasesCompletionHandlersが見つからない \{#not-found-makepurchasescompletionhandlers\} **問題**: `makePurchasesCompletionHandlers`が見つからないというエラーが発生する。 **原因**: 通常、これはサンドボックステストに関連する問題です。 **解決策**: 新しいサンドボックスユーザーを作成して再試行してください。これにより、サンドボックス環境での購入完了ハンドラーの問題が解決することが多いです。 --- # File: kmp-user --- --- title: "Kotlin Multiplatform SDKでのユーザーとアクセス" description: "Adapty SDKを使ってKotlin Multiplatformアプリでユーザーとアクセスレベルを操作する方法を学びましょう。" --- このページでは、Kotlin Multiplatformアプリでユーザーとアクセスレベルを操作するためのすべてのガイドをまとめています。必要なトピックを選んでください: - **[ユーザーを識別する](kmp-identifying-users)** - アプリでユーザーを識別する方法を学ぶ - **[ユーザーデータを更新する](kmp-setting-user-attributes)** - ユーザー属性とプロファイルデータを設定する - **[サブスクリプション状態の変化を監視する](kmp-listen-subscription-changes)** - サブスクリプションの変化をリアルタイムで監視する - **[キッズモード](kids-mode-kmp)** - アプリにキッズモードを実装する --- # File: kmp-identifying-users --- --- title: "Kotlin Multiplatform 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` パラメータとして渡すだけです: ```kotlin showLineNumbers Adapty.activate( AdaptyConfig.Builder("PUBLIC_SDK_KEY") .withCustomerUserId("YOUR_USER_ID") .build() ).onSuccess { // successful activation }.onError { error -> // handle the error } } ``` :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: ### 設定後に Customer User ID を設定する \{#setting-customer-user-id-after-configuration\} SDK の設定時にユーザー ID がない場合は、後から `.identify()` メソッドを使っていつでも設定できます。このメソッドが最もよく使われるのは、登録後やログイン後に匿名ユーザーから認証済みユーザーへ切り替わるタイミングです。 ```kotlin showLineNumbers Adapty.identify("YOUR_USER_ID").onSuccess { // successful identify }.onError { error -> // handle the error } ``` リクエストパラメータ: - **Customer User ID**(必須): 文字列のユーザー識別子。 :::warning 重要なユーザーデータの再送信 ユーザーが再度アカウントにログインする場合など、Adapty のサーバーにすでにそのユーザーの情報が存在していることがあります。このような場合、Adapty SDK は自動的に新しいユーザーとして動作を切り替えます。カスタム属性やサードパーティネットワークからのアトリビューションなど、匿名ユーザーに対してデータを渡していた場合は、識別されたユーザーに対してそのデータを再送信する必要があります。 また、新しいユーザーのデータが異なる可能性があるため、ユーザーを識別した後はすべてのペイウォールとプロダクトを再取得する必要があることにも注意してください。 ::: ### ログアウトとログイン \{#logging-out-and-logging-in\} `.logout()` メソッドを呼び出すことで、いつでもユーザーをログアウトさせることができます: ```kotlin showLineNumbers Adapty.logout().onSuccess { // successful logout }.onError { error -> // handle the error } ``` その後、`.identify()` メソッドを使ってユーザーをログインさせることができます。 ## `appAccountToken` を割り当てる(iOS) \{#assign-appaccounttoken-ios\} [`iosAppAccountToken`](https://developer.apple.com/documentation/storekit/product/purchaseoption/appaccounttoken(_:)) は、App Store のトランザクションを内部ユーザー ID に紐付けるための **UUID** です。 StoreKit はすべてのトランザクションにこのトークンを関連付けるため、バックエンドで App Store のデータをユーザーと照合することができます。 ユーザーごとに安定した UUID を生成し、同じアカウントに対してデバイスをまたいで再利用してください。 これにより、購入や App Store の通知が正しく紐付けられたままになります。 トークンは、SDK のアクティベーション時またはユーザーの識別時の 2 つの方法で設定できます。 :::important `iosAppAccountToken` は必ず `customerUserId` と一緒に渡す必要があります。 トークンのみを渡した場合、トランザクションに含まれません。 ::: ```kotlin showLineNumbers // During configuration: Adapty.activate( AdaptyConfig.Builder("PUBLIC_SDK_KEY") .withCustomerUserId( id = "YOUR_USER_ID", iosAppAccountToken = "YOUR_IOS_APP_ACCOUNT_TOKEN" ) .build() ).onSuccess { // successful activation }.onError { error -> // handle the error } // Or when identifying users Adapty.identify( customerUserId = "YOUR_USER_ID", iosAppAccountToken = "YOUR_IOS_APP_ACCOUNT_TOKEN" ).onSuccess { // successful identify }.onError { error -> // handle the error } ``` ## 難読化アカウント ID を設定する(Android) \{#set-obfuscated-account-ids-android\} Google Play では、ユーザーのプライバシーとセキュリティを強化するために、特定のユースケースで難読化アカウント ID が必要です。これらの ID は、ユーザー情報を匿名に保ちながら Google Play が購入を識別するのに役立ち、不正防止やアナリティクスにおいて特に重要です。 アプリが機密性の高いユーザーデータを扱っている場合や、特定のプライバシー規制への準拠が求められる場合に、これらの ID を設定する必要があるかもしれません。難読化 ID により、Google Play は実際のユーザー識別子を公開せずに購入を追跡できます。 :::important `androidObfuscatedAccountId` は必ず `customerUserId` と一緒に渡す必要があります。 難読化アカウント ID のみを渡した場合、トランザクションに含まれません。 ::: ```kotlin showLineNumbers // During configuration: Adapty.activate( AdaptyConfig.Builder("PUBLIC_SDK_KEY") .withCustomerUserId( id = "YOUR_USER_ID", androidObfuscatedAccountId = "YOUR_OBFUSCATED_ACCOUNT_ID" ) .build() ).onSuccess { // successful activation }.onError { error -> // handle the error } // Or when identifying users Adapty.identify( customerUserId = "YOUR_USER_ID", androidObfuscatedAccountId = "YOUR_OBFUSCATED_ACCOUNT_ID" ).onSuccess { // successful identify }.onError { error -> // handle the error } ``` ## デバイスをまたいでユーザーを検出する \{#detect-users-across-devices\} 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()`完了後にアクセスが欠落している場合のデバッグなど、強制的に新しいレシートチェックを行う場合にのみ使用してください。 --- # File: kmp-setting-user-attributes --- --- title: "Kotlin Multiplatform SDKでユーザー属性を設定する" description: "Adaptyでユーザー属性を設定して、オーディエンスのセグメンテーションを改善する方法を学びます。" --- メールアドレスや電話番号など、アプリのユーザーにオプションの属性を設定できます。設定した属性は、ユーザー[セグメント](segments)の作成やCRMでの確認に活用できます。 ### ユーザー属性の設定 \{#setting-user-attributes\} ユーザー属性を設定するには、`.updateProfile()` メソッドを呼び出します。 ```kotlin showLineNumbers val builder = AdaptyProfileParameters.Builder() .withEmail("email@email.com") .withPhoneNumber("+18888888888") .withFirstName("John") .withLastName("Appleseed") .withGender(AdaptyProfile.Gender.FEMALE) .withBirthday(AdaptyProfile.Date(1970, 1, 3)) Adapty.updateProfile(builder.build()) .onSuccess { // profile updated successfully } .onError { error -> // handle the error } ``` `updateProfile` メソッドで以前に設定した属性はリセットされません。 :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: ### 使用可能なキーの一覧 \{#the-allowed-keys-list\} `AdaptyProfileParameters.Builder` で使用できるキー `phoneNumber
firstName
lastName
| String | | gender | Enum(使用可能な値: `AdaptyProfile.Gender.FEMALE`、`AdaptyProfile.Gender.MALE`、`AdaptyProfile.Gender.OTHER`) | | birthday | Date | ### カスタムユーザー属性 \{#custom-user-attributes\} 独自のカスタム属性を設定できます。これらは通常、アプリの使用状況に関連するものです。たとえば、フィットネスアプリであれば週あたりのエクササイズ回数、語学学習アプリであればユーザーの習熟度レベルなどが考えられます。セグメントで使用してターゲットを絞ったペイウォールやオファーを作成したり、アナリティクスでどのプロダクト指標が収益に最も影響するかを分析したりするのに役立ちます。 ```kotlin showLineNumbers val builder = AdaptyProfileParameters.Builder() builder.withCustomAttribute("key1", "value1") ``` 既存のキーを削除するには、`.withRemovedCustomAttribute()` メソッドを使用します。 ```kotlin showLineNumbers val builder = AdaptyProfileParameters.Builder() builder.withRemovedCustomAttribute("key2") ``` 設定済みのカスタム属性を事前に確認したい場合は、`AdaptyProfile` オブジェクトの `customAttributes` フィールドを使用してください。 :::warning `customAttributes` の値は最新の状態でない場合があります。ユーザー属性は複数のデバイスからいつでも送信される可能性があるため、最後の同期以降にサーバー上の属性が変更されている場合があります。 ::: ### 制限事項 \{#limits\} - ユーザーあたり最大30件のカスタム属性 - キー名は最大30文字。キー名には英数字および以下の記号が使用できます: `_` `-` `.` - 値は文字列または小数で、50文字以内。 --- # File: kmp-listen-subscription-changes --- --- title: "Kotlin Multiplatform SDKでサブスクリプションのステータスを確認する" description: "Kotlin MultiplatorformアプリでAdaptyを使用してユーザーのサブスクリプションステータスを追跡・管理し、顧客維持率を向上させましょう。" --- Adaptyを使えば、サブスクリプションのステータス管理が簡単になります。プロダクトIDをコードに手動で埋め込む必要はありません。代わりに、[アクセスレベル](access-level)がアクティブかどうかを確認するだけで、ユーザーのサブスクリプションステータスをすぐに把握できます。 サブスクリプションステータスの確認を始める前に、[リアルタイム デベロッパー通知 (RTDN)](enable-real-time-developer-notifications-rtdn) を設定してください。 ## アクセスレベルとAdaptyProfileオブジェクト \{#access-level-and-the-adaptyprofile-object\} アクセスレベルは [AdaptyProfile](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-profile/) オブジェクトのプロパティです。アプリ起動時(例:[ユーザーを識別する](android-identifying-users#setting-customer-user-id-on-configuration)タイミングなど)にプロファイルを取得し、変更があれば随時更新することを推奨します。こうすることで、都度リクエストを送らずにプロファイルオブジェクトを活用できます。 プロファイルの更新通知を受け取るには、以下の[サブスクリプションステータスを含むプロファイル更新の監視](android-listen-subscription-changes)セクションで説明しているプロファイル変更のリスナーを設定してください。 :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: ## サーバーからアクセスレベルを取得する \{#retrieving-the-access-level-from-the-server\} サーバーからアクセスレベルを取得するには、`.getProfile()` メソッドを使用してください: ```kotlin showLineNumbers Adapty.getProfile().onSuccess { profile -> // check the access }.onError { error -> // handle the error } ``` レスポンスパラメーター: | パラメーター | 説明 | | --------- |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Profile |[AdaptyProfile](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-profile/) オブジェクトです。通常、ユーザーがアプリのプレミアム機能にアクセスできるかどうかを判断するには、プロファイルのアクセスレベルのステータスを確認するだけで十分です。
`.getProfile` メソッドは常にAPIへのクエリを試みるため、最新の結果を返します。ネットワーク接続がないなどの理由でAdapty SDKがサーバーから情報を取得できない場合は、キャッシュのデータが返されます。また、Adapty SDKは `AdaptyProfile` のキャッシュを定期的に更新し、情報をできるだけ最新の状態に保ちます。
| `.getProfile()` メソッドはユーザープロファイルを返し、そこからアクセスレベルのステータスを取得できます。アプリには複数のアクセスレベルを設定することも可能です。たとえばニュースアプリでトピックごとにサブスクリプションを販売する場合、「sports」や「science」といったアクセスレベルを作成できます。ただし、ほとんどのケースでは1つのアクセスレベルで十分です。その場合はデフォルトの「premium」アクセスレベルをそのままご利用ください。 デフォルトの「premium」アクセスレベルを確認する例: ```kotlin showLineNumbers Adapty.getProfile().onSuccess { profile -> if (profile.accessLevels["premium"]?.isActive == true) { // grant access to premium features } }.onError { error -> // handle the error } ``` ### サブスクリプションステータスの更新を監視する \{#listening-for-subscription-status-updates\} ユーザーのサブスクリプションが変更されるたびに、Adaptyはイベントを発火します。 Adaptyからのメッセージを受け取るには、追加の設定が必要です: ```kotlin showLineNumbers Adapty.setOnProfileUpdatedListener { profile -> // handle any changes to subscription state } ``` Adaptyはアプリ起動時にもイベントを発火します。この場合、キャッシュされたサブスクリプションステータスが渡されます。 ### サブスクリプションステータスのキャッシュ \{#subscription-status-cache\} Adapty SDKに実装されたキャッシュには、プロファイルのサブスクリプションステータスが保存されます。つまり、サーバーが利用できない場合でも、キャッシュされたデータからプロファイルのサブスクリプション情報を取得できます。 ただし、キャッシュから直接データをリクエストすることはできません。SDKは1分ごとにサーバーへ定期的なクエリを行い、プロファイルに関する更新や変更を確認します。新しいトランザクションやその他の更新など、変更が検出された場合は、サーバーとの同期を保つためにキャッシュデータへ反映されます。 --- # File: kmp-deal-with-att --- --- title: "Kotlin Multiplatform SDKでATTを処理する" description: "Kotlin MultiplatformでAdaptyを使い始めて、サブスクリプションのセットアップと管理を効率化しましょう。" --- アプリがAppTrackingTransparencyフレームワークを使用してアプリトラッキングの認証リクエストをユーザーに表示する場合、[認証ステータス](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/)をAdaptyに送信する必要があります。 ```kotlin showLineNumbers val profileParameters = AdaptyProfileParameters.Builder() .withAttStatus(3) // 3 = ATTrackingManagerAuthorizationStatusAuthorized .build() Adapty.updateProfile(profileParameters) .onSuccess { // ATT status updated successfully } .onError { error -> // handle AdaptyError } ``` :::warning この値は変更されたらできるだけ早く送信することを強くお勧めします。そうすることで、設定済みのインテグレーションにタイムリーにデータが送信されます。 ::: --- # File: kids-mode-kmp --- --- title: "Kotlin Multiplatform SDKのキッズモード" description: "キッズモードを簡単に有効化してGoogleのポリシーに準拠。Kotlin Multiplatform SDKではGAIDや広告データを収集しません。" --- Kotlin Multiplatformアプリが子ども向けの場合、[Google](https://support.google.com/googleplay/android-developer/answer/9893335)のポリシーに従う必要があります。Adapty SDKを使用している場合、いくつかの簡単な手順でこれらのポリシーに準拠し、アプリストアの審査を通過できるよう設定できます。 ## 必要な対応 \{#whats-required\} Adapty SDKで以下の収集を無効にする必要があります: - [IDFA(広告識別子)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers)(iOS) - [Android Advertising ID(AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248)(Android) - [IPアドレス](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) また、カスタマーユーザーIDの扱いにも注意が必要です。`任意
デフォルト: `en`
| オンボーディングのローカライズ識別子。このパラメーターは、マイナス(**-**)で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目はリージョンを表します。例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDKはサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、このオプションを推奨します。
ただし、ユーザーが不安定なインターネット環境にいる可能性がある場合は、`.returnCacheDataElseLoad` を使用して、キャッシュが存在する場合にキャッシュデータを返すことを検討してください。この場合、最新のデータが取得できないこともありますが、通信状況に関わらず読み込み時間が短縮されます。キャッシュはセッション中も定期的に更新されるため、ネットワークリクエストを避けるために安全に使用できます。
キャッシュはアプリを再起動しても保持され、アプリのアンインストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はオンボーディングをローカルに2つの層で保存します。1つは上記の定期更新キャッシュ、もう1つはフォールバックオンボーディングです。また、CDN を使用してオンボーディングを高速に取得し、CDN が利用できない場合に備えてスタンドアロンのフォールバックサーバーも使用します。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンのオンボーディングを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト時間を制限します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
まれに、内部で複数のリクエストが行われる場合があるため、`loadTimeout` で指定した時間より若干遅れてタイムアウトすることがあります。
| レスポンスパラメーター: | パラメーター | 説明 | |:----------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | オンボーディングの識別子と設定、リモートコンフィグ、その他いくつかのプロパティを含む [`AdaptyOnboarding`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-onboarding/) オブジェクト。 | ## デフォルトオーディエンスのオンボーディングでフェッチを高速化する \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} 通常、オンボーディングはほぼ瞬時にフェッチされるため、このプロセスの高速化を気にする必要はありません。ただし、オーディエンスやオンボーディングの数が多く、ユーザーのインターネット接続が不安定な場合、オンボーディングのフェッチに想定以上の時間がかかることがあります。そのような状況では、オンボーディングをまったく表示しないよりも、デフォルトのオンボーディングを表示してスムーズなユーザー体験を提供することを検討するとよいでしょう。 これに対処するには、`getOnboardingForDefaultAudience` メソッドを使用できます。このメソッドは、指定したプレースメントの **All Users** オーディエンス向けオンボーディングを取得します。ただし、推奨されるアプローチは `getOnboarding` メソッドでオンボーディングを取得することであり、詳細については上記の[オンボーディングの取得](#fetch-onboarding)セクションを参照してください。 :::warning `getOnboardingForDefaultAudience` の代わりに `getOnboarding` の使用を検討してください。前者には以下の重要な制限があります: - **互換性の問題**: 複数のアプリバージョンをサポートする際に問題が生じる可能性があり、後方互換性のある設計が必要になるか、古いバージョンでの表示崩れを許容する必要があります。 - **パーソナライズなし**: 「全ユーザー」オーディエンス向けのコンテンツのみを表示するため、国、アトリビューション、カスタム属性によるターゲティングができません。 これらのデメリットよりも取得速度のメリットが大きい場合は、以下に示すように `getOnboardingForDefaultAudience` を使用してください。そうでない場合は、[上記](#fetch-onboarding)で説明している `getOnboarding` を使用してください。 ::: ```kotlin showLineNumbers Adapty.getOnboardingForDefaultAudience( placementId = "YOUR_PLACEMENT_ID", locale = "en", fetchPolicy = AdaptyPaywallFetchPolicy.Default, ).onSuccess { paywall -> // the requested paywall }.onError { error -> // handle the error } ``` パラメーター: | パラメータ | 必須/任意 | 説明 | |---------|--------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | 必須 | 対象の[プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
| オンボーディングのローカライズ識別子です。マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。デフォルトでは、SDKはサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。このオプションを推奨するのは、ユーザーが常に最新のデータを取得できるためです。
ただし、ユーザーがネットワークの不安定な環境を使用していると思われる場合は、`.returnCacheDataElseLoad` の使用を検討してください。キャッシュが存在する場合はキャッシュされたデータを返すため、ユーザーは最新データを取得できない場合がありますが、通信状況に関わらず高速に読み込めます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける目的で使用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリをアンインストールするか手動でクリアした場合のみ削除されます。
Adapty SDKはオンボーディングをローカルに2層で保存します。1つは上記の定期更新キャッシュ、もう1つはフォールバックオンボーディングです。また、オンボーディングをより高速に取得するためにCDNを使用し、CDNに接続できない場合に備えて独立したフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な場合でも、常に最新バージョンのオンボーディングを確実に取得できるよう設計されています。
| --- # File: kmp-present-onboardings --- --- title: "Kotlin Multiplatform SDKでオンボーディングを表示する" description: "オンボーディングを効果的に表示してコンバージョンを高める方法を学びましょう。" --- :::warning **オンボーディングはSDK v4で非推奨となり、将来のリリースで削除される予定です。** バグ修正や改善は行われません。代わりに[フロー](kmp-get-pb-paywalls)を使用してください。オンボーディングはWebView内で動作しますが、フローはデバイス上でネイティブにレンダリングされるため、アニメーションがよりスムーズで、ネイティブな外観と操作感が一貫しており、読み込み時間が短く、WebViewランタイムへの依存もありません。まずは[フローとペイウォールの取得](kmp-get-pb-paywalls)と[フローとペイウォールの表示](kmp-present-paywalls)をご覧ください。 ::: ビルダーを使ってオンボーディングをカスタマイズした場合、Kotlin Multiplatform アプリのコードでレンダリングを気にする必要はありません。このようなオンボーディングには、表示する内容と表示方法の両方が含まれています。 始める前に、以下を確認してください: 1. [Adapty Kotlin Multiplatform SDK](sdk-installation-kotlin-multiplatform) 3.16.1 以降をインストール済みであること。 2. [オンボーディングを作成済み](create-onboarding)であること。 3. オンボーディングを[プレースメント](placements)に追加済みであること。 Adapty Kotlin Multiplatform SDKには、オンボーディングを表示する方法が2つあります: - **Compose Multiplatformを使用する場合** - **Compose Multiplatformを使用しない場合** ## Compose Multiplatformを使用する場合 \{#with-compose-multiplatform\} オンボーディングを表示するには、`createOnboardingView`メソッドで作成した`view`に対して`view.present()`メソッドを呼び出します。各`view`は一度しか使用できません。再度オンボーディングを表示する必要がある場合は、`createOnboardingView`をもう一度呼び出して新しい`view`インスタンスを作成してください。 :::warning 同じ`view`を再作成せずに再利用すると、エラーが発生する場合があります。 ::: ```kotlin showLineNumbers title="Kotlin Multiplatform" viewModelScope.launch { AdaptyUI.createOnboardingView(onboarding = onboarding).onSuccess { view -> view.present() }.onError { error -> // handle the error } } ``` ### iOS のプレゼンテーションスタイルを設定する \{#configure-ios-presentation-style\} `present()` メソッドに `iosPresentationStyle` パラメータを渡すことで、iOS でのオンボーディングの表示スタイルを設定できます。このパラメータには `AdaptyUIIOSPresentationStyle.FULLSCREEN`(デフォルト)または `AdaptyUIIOSPresentationStyle.PAGESHEET` を指定できます。 ```kotlin showLineNumbers viewModelScope.launch { val view = AdaptyUI.createOnboardingView(onboarding = onboarding).getOrNull() view?.present(iosPresentationStyle = AdaptyUIIOSPresentationStyle.PAGESHEET) } ``` ### オンボーディング内のリンクの開き方をカスタマイズする \{#customize-how-links-open-in-onboardings\} デフォルトでは、オンボーディング内のリンクはアプリ内ブラウザで開きます。これにより、アプリを切り替えることなくウェブページを表示できるシームレスなユーザー体験が提供されます。 外部ブラウザでリンクを開きたい場合は、`externalUrlsPresentation` パラメータを `AdaptyWebPresentation.EXTERNAL_BROWSER` に設定することでこの動作をカスタマイズできます: ```kotlin showLineNumbers viewModelScope.launch { AdaptyUI.createOnboardingView( onboarding = onboarding, externalUrlsPresentation = AdaptyWebPresentation.EXTERNAL_BROWSER // default – IN_APP_BROWSER ).onSuccess { view -> view.present() }.onError { error -> // handle the error } } ``` ## Compose Multiplatformを使わない場合 \{#without-compose-multiplatform\} :::note `createNativeOnboardingView` はコア モジュール `io.adapty:adapty-kmp` の一部です。Compose Multiplatform を使用していないプロジェクトでは、`io.adapty:adapty-kmp-ui` 依存関係は不要です。 ::: Compose Multiplatform を使わずにオンボーディングを埋め込むには、`createNativeOnboardingView` を呼び出します。レイアウトに追加できる `AdaptyNativeOnboardingView` が返されます:
例えば、ユーザーが **Login** や **Allow notifications** などのカスタムボタンをタップすると、デリゲートメソッド `onCustomAction` がビルダーのアクション ID とともに呼び出されます。"allowNotifications" のように、独自の ID を作成できます。
```kotlin
class MyAdaptyUIOnboardingsEventsObserver : AdaptyUIOnboardingsEventsObserver {
override fun onboardingViewOnCustomAction(
view: AdaptyUIOnboardingView,
meta: AdaptyUIOnboardingMeta,
actionId: String
) {
when (actionId) {
"openPaywall" -> {
// Display paywall from onboarding
// You would typically fetch and present a new paywall here
mainUiScope.launch {
// Example: Get paywall by placement ID
// val paywallResult = Adapty.getPaywall("your_placement_id")
// paywallResult.onSuccess { paywall ->
// val paywallViewResult = AdaptyUI.createPaywallView(paywall)
// paywallViewResult.onSuccess { paywallView ->
// paywallView.present()
// }
// }
}
}
"allowNotifications" -> {
// Handle notification permissions
}
else -> {
// Handle other custom actions
}
}
}
}
// Set up the observer
AdaptyUI.setOnboardingsEventsObserver(MyAdaptyUIOnboardingsEventsObserver())
```
2. サブスクリプショングループ名をクリックすると、**Subscriptions** セクションにプロダクトの一覧が表示されます。
3. テスト中のプロダクトが **Ready to Submit** になっていることを確認します。なっていない場合は、[App Store のプロダクト](app-store-products)ページの手順に従ってください。
4. テーブルのプロダクト ID と、Adapty ダッシュボードの [**Products**](https://app.adapty.io/products) タブに表示されているプロダクト ID を比較します。ID が一致しない場合は、テーブルからプロダクト ID をコピーして、Adapty ダッシュボードでそのプロダクト ID を使って[プロダクトを作成](create-product)してください。
## ステップ 3. プロダクトの提供状況を確認する \{#step-4-check-product-availability\}
1. **App Store Connect** に戻り、同じ **Subscriptions** セクションを開きます。
2. サブスクリプショングループ名をクリックしてプロダクト一覧を表示します。
3. テスト中のプロダクトを選択します。
4. **Availability** セクションまでスクロールし、必要な国や地域がすべて一覧に含まれていることを確認します。
## ステップ 4. プロダクトの価格を確認する \{#step-5-check-product-prices\}
1. 再度 **App Store Connect** の **Monetization** → **Subscriptions** セクションに移動します。
2. サブスクリプショングループ名をクリックします。
3. テスト中のプロダクトを選択します。
4. **Subscription Pricing** までスクロールし、**Current Pricing for New Subscribers** セクションを展開します。
5. 必要な価格がすべて一覧に含まれていることを確認します。
## ステップ 5. アプリの有料ステータス、銀行口座、税務フォームがアクティブであることを確認する \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. [**App Store Connect**](https://appstoreconnect.apple.com/) のホームページで **Business** をクリックします。
2. 会社名を選択します。
3. スクロールして、**Paid Apps Agreement**、**Bank Account**、**Tax forms** がすべて **Active** と表示されていることを確認します。
これらの手順を実施することで、`InvalidProductIdentifiers` 警告を解消し、プロダクトをストアで公開できるようになります。
## ステップ 6. プロダクトが動かない場合は再作成する \{#step-6-recreate-the-product-if-its-stuck\}
ステップ 1〜5 をすべてパスしても — `Approved` ステータス、バンドル ID の一致、有効な API キー — SDK が `1000 noProductIDsFound` を返し続ける場合があります。その場合、プロダクトが Apple のレジストリで動かなくなっている可能性があります。App Store Connect の UI 上にはプロダクトが存在しているように見えても、StoreKit のルックアップパスに公開されていない状態になることがあります。
App Store Connect でそのプロダクトを削除し、同じプロダクト ID で再作成してください。再作成後、反映されるまで最大 24 時間かかる場合があります。
---
# File: cantMakePayments-kmp
---
---
title: "Kotlin Multiplatform SDKにおけるCode-1003 cantMakePaymentエラーの修正方法"
description: "Adaptyでサブスクリプションを管理する際の支払い処理エラーを解決します。"
---
1003エラー(`cantMakePayments`)は、このデバイスでアプリ内課金ができないことを示しています。
`cantMakePayments`エラーが発生している場合、通常は以下のいずれかの原因が考えられます:
- デバイスの制限:このエラーはAdaptyとは無関係です。以下の解決方法を参照してください。
- オブザーバーモードの設定:`makePurchase`メソッドとオブザーバーモードは同時に使用できません。以下のセクションを参照してください。
## 問題:デバイスの制限 \{#issue-device-restrictions\}
| 問題 | 解決方法 |
|-----------------------------|---------------------------------------------------------|
| スクリーンタイムの制限 | [スクリーンタイム](https://support.apple.com/en-us/102470)でアプリ内課金の制限を無効にする |
| アカウントの停止 | Appleサポートに連絡してアカウントの問題を解決する |
| 地域の制限 | 対応地域のApp Storeアカウントを使用する |
## 問題:オブザーバーモードとmakePurchaseの併用 \{#issue-using-both-observer-mode-and-makepurchase\}
購入処理に`makePurchase`を使用している場合、オブザーバーモードを使用する必要はありません。[オブザーバーモード](observer-vs-full-mode)が必要なのは、購入ロジックを自分で実装する場合のみです。
したがって、`makePurchase`を使用している場合は、SDK有効化コードからオブザーバーモードの有効化を安全に削除できます。
---
# File: kmp-sdk-migration-guides
---
---
title: "Kotlin Multiplatform SDK 移行ガイド"
description: "Adapty Kotlin Multiplatform SDK バージョンの移行ガイド。"
---
このページには、Adapty Kotlin Multiplatform SDK のすべての移行ガイドが掲載されています。詳細な手順については、移行先のバージョンを選択してください:
- **[v4.0(ベータ版)への移行](migration-to-kmp-sdk-v4)**
- **[v3.15 への移行](migration-to-kmp-315)**
---
# File: migration-to-kmp-sdk-v4
---
---
title: "Adapty Kotlin Multiplatform SDK を v. 4.0 へ移行する"
description: "ペイウォール API をフロー API に置き換えることで Adapty Kotlin Multiplatform SDK v4.0 (beta) へ移行します。Flow Builder と Paywall Builder の両方に対応しています。"
---
Adapty Kotlin Multiplatform SDK 4.0 (beta) ではフローが導入され、それに伴いペイウォール API の名称が変更されました。新しい API は新しい Flow Builder と既存の Paywall Builder の両方で動作するため、Adapty ダッシュボード側での設定変更は不要です。
## クイックリファレンス \{#quick-reference\}
| v3 | v4 |
|---|---|
| `Adapty.getPaywall(placementId, locale)` | `Adapty.getFlow(placementId)` |
| `Adapty.getPaywallForDefaultAudience(placementId, locale)` | `Adapty.getFlowForDefaultAudience(placementId)` |
| `Adapty.getPaywallProducts(paywall)` | `Adapty.getPaywallProducts(flow)` |
| `Adapty.logShowPaywall(paywall)` | `Adapty.logShowFlow(flow)` |
| `AdaptyPaywall` | `AdaptyFlow` |
| `AdaptyUI.createPaywallView(paywall, ...)` | `AdaptyUI.createFlowView(flow, ...)` |
| `AdaptyUI.createNativePaywallView(...)` → `AdaptyNativePaywallView` | `AdaptyUI.createNativeFlowView(...)` → `AdaptyNativeFlowView` |
| `AdaptyUIPaywallView` | `AdaptyUIFlowView` |
| `AdaptyUI.presentPaywallView(view)` / `dismissPaywallView(view)` | `AdaptyUI.presentFlowView(view)` / `dismissFlowView(view)` |
| `AdaptyUI.setPaywallsEventsObserver(observer)` | `AdaptyUI.setFlowsEventsObserver(observer)` |
| `AdaptyUI.registerPaywallEventsListener` / `unregisterPaywallEventsListener` | `AdaptyUI.registerFlowEventsListener` / `unregisterFlowEventsListener` |
| `AdaptyUIPaywallsEventsObserver` | `AdaptyUIFlowsEventsObserver` |
| `AdaptyUIPaywallPlatformView(paywall, ...)` | `AdaptyUIFlowPlatformView(flow, ...)` |
| `paywallViewDidPerformAction`、`paywallViewDidAppear`、その他の `paywallView...` コールバック | `flowViewDidPerformAction`、`flowViewDidAppear`、その他の `flowView...` コールバック |
| `paywallViewDidFailRendering` | `flowViewDidReceiveError` |
`AdaptyPaywallProduct` はその名前を保持します — プロダクトは引き続きフローに属しており、`getPaywallProducts` もその名前を保持し、`AdaptyFlow` を受け取るようになりました。`getFlow` および `getFlowForDefaultAudience` メソッドは、`locale` パラメーターを受け取らなくなりました。購入およびプロファイル API(`makePurchase`、`restorePurchases`、`getProfile`、`identify`、`updateProfile`)と `setFallback` によるフォールバックは変更されていません。オンボーディングメソッドは引き続き動作しますが、非推奨となっています — [オンボーディング API の非推奨](#onboarding-api-deprecation) を参照してください。一部のデフォルト動作が変更されました — [デフォルト動作の変更](#default-behavior-changes) を参照してください。
## インストール \{#installation\}
v4.0 はプレリリース版のため、正確なバージョンを固定してください。Gradle は動的レンジではプレリリースバージョンを選択しません:
```toml showLineNumbers title="libs.versions.toml"
[versions]
adapty-kmp = "4.0.0-beta.1"
[libraries]
adapty-kmp = { module = "io.adapty:adapty-kmp", version.ref = "adapty-kmp" }
adapty-kmp-ui = { module = "io.adapty:adapty-kmp-ui", version.ref = "adapty-kmp" }
```
`adapty-kmp-ui` モジュールが必要なのは、Compose Multiplatform レイヤー(`view.present()`)でフローやペイウォールをレンダリングする場合のみです。完全なセットアップ手順については、[Adapty SDK のインストール](sdk-installation-kotlin-multiplatform)をご覧ください。
両プラットフォームのネイティブ Adapty SDK は 4.x リリースにバンプされており、自動的に解決されるため、ビルドの変更は不要です。iOS のデプロイメントターゲットは **15.0** のままで、このリリースによる変更はありません。
## フローの取得 \{#fetching-flows\}
### getPaywall → getFlow
戻り値の型が `AdaptyPaywall` から `AdaptyFlow` に変わり、`locale` パラメータが削除されました。フローをレンダリングする際、ロケールは自動的に解決されます。カスタムペイウォールの場合、すべてのロケールは `flow.remoteConfigs` に含まれます。
```diff showLineNumbers
- Adapty.getPaywall("YOUR_PLACEMENT_ID", locale = "en")
- .onSuccess { paywall ->
- // use the paywall
+ Adapty.getFlow("YOUR_PLACEMENT_ID")
+ .onSuccess { flow ->
+ // use the flow
}
.onError { error ->
// handle the error
}
```
`getPaywallForDefaultAudience` も同様に名前が変更されています:
```diff showLineNumbers
- Adapty.getPaywallForDefaultAudience("YOUR_PLACEMENT_ID", locale = "en")
+ Adapty.getFlowForDefaultAudience("YOUR_PLACEMENT_ID")
```
### getPaywallProducts(paywall) → getPaywallProducts(flow)
`getPaywallProducts` は名前はそのままですが、`AdaptyFlow` を受け取るようになりました:
```diff showLineNumbers
- Adapty.getPaywallProducts(paywall)
+ Adapty.getPaywallProducts(flow)
.onSuccess { products ->
// use the products
}
```
## データモデル \{#data-model\}
`getFlow` は `AdaptyPaywall` の代わりに `AdaptyFlow` を返し、オブジェクトの構造が変わりました。
| v3 `AdaptyPaywall` プロパティ | v4 `AdaptyFlow` プロパティ | 対応内容 |
|---|---|---|
| `remoteConfig: AdaptyRemoteConfig?` (単一) | `remoteConfigs: List
### ログイン/サインアップ時 \{#during-loginsignup\}
アプリ起動後にユーザーを識別する場合(例:ログインやサインアップ後)、`identify`メソッドを使ってカスタマーユーザーIDを設定します。
- **このカスタマーユーザーIDを初めて使う場合**、Adaptyは自動的に現在のプロファイルに紐付けます。
- **以前にこのカスタマーユーザーIDでユーザーを識別したことがある場合**、Adaptyはそのカスタマーユーザーに紐付いたプロファイルへ切り替えます。
:::important
カスタマーユーザーIDはユーザーごとに一意である必要があります。パラメータの値をハードコードすると、すべてのユーザーが同一人物とみなされます。
:::
他のSDKメソッドを呼び出す前に、必ず`identify`を`await`してください。並列呼び出しを行うと`#3006 profileWasChanged`が発生したり、匿名プロファイルに対して操作が行われる場合があります。詳しくは[React Native SDKの呼び出し順序](react-native-sdk-call-order)を参照してください。
```typescript showLineNumbers
try {
await adapty.identify("YOUR_USER_ID"); // Unique for each user
// successfully identified
} catch (error) {
// handle the error
}
```
### SDKの有効化時 \{#during-the-sdk-activation\}
SDKを有効化する時点でカスタマーユーザーIDが既にわかっている場合、`identify`を別途呼び出さずに`activate`メソッドに渡すことができます。
カスタマーユーザーIDがわかっているにもかかわらず、有効化後にのみ設定した場合、有効化時にAdaptyは新しい匿名プロファイルを作成し、`identify`を呼び出した後にのみ既存のプロファイルに切り替わります。
既存のカスタマーユーザーID(以前に使用したもの)または新しいものを渡すことができます。新しいものを渡した場合、有効化時に作成される新しいプロファイルが自動的にそのカスタマーユーザーIDに紐付けられます。
:::note
デフォルトでは、匿名プロファイルの作成はアナリティクスダッシュボードに影響しません。インストールはデバイスIDに基づいてカウントされるためです。
デバイスIDはストアからデバイスへのアプリの1回のインストールを表し、アプリの再インストール後にのみ再生成されます。
初回インストールか再インストールかや、既存のカスタマーユーザーIDを使用するかどうかには依存しません。
プロファイルの作成(SDK有効化時またはログアウト時)、ログイン、または再インストールなしのアプリアップグレードでは、追加のインストールイベントは発生しません。
インストールをデバイスではなく一意のユーザーに基づいてカウントしたい場合は、**App settings**で[**Installs definition for analytics**](general#4-installs-definition-for-analytics)を設定してください。
:::
```typescript showLineNumbers
adapty.activate("PUBLIC_SDK_KEY", {
customerUserId: "YOUR_USER_ID" // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
});
```
### ユーザーをログアウトさせる \{#log-users-out\}
ユーザーのログアウトボタンがある場合は、`logout`メソッドを使用します。
:::important
ユーザーのログアウト時に、新しい匿名プロファイルが作成されます。
:::
```typescript showLineNumbers
try {
await adapty.logout();
// successful logout
} catch (error) {
// handle the error
}
```
:::info
ユーザーをアプリに再度ログインさせるには、`identify`メソッドを使用してください。
:::
### ログインなしで購入を許可する \{#allow-purchases-without-login\}
ユーザーがログイン前後の両方で購入できる場合、ログイン後もアクセスが維持されるよう対応が必要です:
1. ログアウト状態のユーザーが購入を行うと、AdaptyはそれをそのユーザーのプロファイルIDに紐付けます。
2. ユーザーがアカウントにログインすると、Adaptyは識別済みプロファイルに切り替えます。
- 新しいカスタマーユーザーID(例:登録前に購入が行われた場合)の場合、Adaptyはそのカスタマーユーザーを現在のプロファイルに割り当て、購入履歴が引き継がれます。
- 既存のカスタマーユーザーID(すでにプロファイルに紐付いている)の場合、プロファイル切り替え後に実際のアクセスレベルを取得する必要があります。識別後すぐに[`getProfile`](react-native-check-subscription-status)を呼び出すか、[プロファイルの更新をリッスン](react-native-check-subscription-status)してデータを自動的に同期させてください。
## 次のステップ \{#next-steps\}
おめでとうございます!アプリにアプリ内課金のロジックを実装できました。アプリの収益化を成功させてください!
Adaptyをさらに活用するために、以下のトピックもご確認ください:
- [**テスト**](troubleshooting-test-purchases):すべてが期待通りに動作することを確認する
- [**オンボーディング**](react-native-onboardings):オンボーディングでユーザーを引き付けてリテンションを向上させる
- [**インテグレーション**](configuration):マーケティングアトリビューションや分析サービスをわずか1行のコードで連携する
- [**カスタムプロファイル属性の設定**](react-native-setting-user-attributes):ユーザープロファイルにカスタム属性を追加してセグメントを作成し、A/Bテストを実施したり、ユーザーごとに異なるペイウォールを表示したりする
---
# File: adapty-sdk-integration-skill-react-native
---
---
title: "SDKインテグレーションスキルを使ってAdaptyをReact Nativeアプリに統合する"
description: "adapty-sdk-integrationスキルを使用して、AIコーディングツールでAdapty SDKをReact Nativeアプリにエンドツーエンドで統合します。"
---
:::important
このスキルはベータ版です。処理が止まったり予期しない動作が発生した場合は、代わりに[ステップバイステップの統合ガイド](adapty-cursor-react-native)を参照してください。AIツールを各ステージで適切なドキュメントに沿って案内します。
:::
[adapty-sdk-integration スキル](https://github.com/adaptyteam/adapty-sdk-integration-skill)は、Adapty のインテグレーションをエンドツーエンドで自動化します。ダッシュボードのセットアップ、SDK のインストール、ペイウォール、各ステージの検証まで対応しています。プラットフォームを自動検出し、各ステージで関連する Adapty ドキュメントを取得します。
**対応ツール**: Claude Code、GitHub Copilot CLI、OpenAI Codex、Gemini CLI。
インストールするには、お使いのツールに対応したフォームを選択してください。全リストは[スキルの README](https://github.com/adaptyteam/adapty-sdk-integration-skill) にあります。
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex またはその他のツール** — [skills CLI](https://skills.sh) を使用してください(この方法でインストールしたスキルは自動更新されません):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
または、リポジトリをクローンして `skills/adapty-sdk-integration/` をお使いのツールのスキルディレクトリにコピーしてください。
インストール後、プロジェクトでスキルを実行します:
```
/adapty-sdk-integration
```
スキルがいくつかのセットアップに関する質問をした後、ダッシュボードのセットアップ、SDK のインストール、ペイウォール、検証の手順を案内します。
---
# File: adapty-cursor-react-native
---
---
title: "AIアシスタントを使ってAdaptyをReact Nativeアプリに統合する"
description: "Cursor、Context7、ChatGPT、Claude、その他のAIツールを使って、AdaptyをReact Nativeアプリに統合するためのステップバイステップガイド。"
---
このガイドでは、AIコーディングツールを使いながら、AdaptyをReact Nativeアプリに順を追って統合していきます。必要なAdaptyのドキュメントを正しい順番でAIに渡してください。
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## 始める前に:ダッシュボードの設定 \{#before-you-start-dashboard-setup\}
AdaptyでSDKのコードを書く前に、ダッシュボードでいくつかの設定が必要です。インタラクティブなLLMスキルを使うか、ダッシュボードから手動で行うかを選べます。
### スキルを使う方法(推奨)\{#skill-approach-recommended\}
Adapty CLIスキルを使うと、LLMがダッシュボードを開かずに、アプリ・プロダクト・アクセスレベル・ペイウォール・プレースメントを直接設定できます。必要なのは、ダッシュボードで[ストアを連携する](integrate-payments)ことだけです。
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
スキルを追加したら、エージェントで `/adapty-cli` を実行してください。ストアの連携でダッシュボードを開くタイミングも含め、各ステップをガイドしてくれます。
### ダッシュボードを使う方法 \{#dashboard-approach\}
手動で設定したい場合は、コードを書く前に以下の準備が必要です。LLMはダッシュボードの値を自動で取得できないため、自分で用意する必要があります。
1. **ストアを連携する**:Adapty ダッシュボードで **App settings → General** を開き、両プラットフォームを対象とする場合はApp StoreとGoogle Playの両方を連携してください。課金を機能させるために必須です。
[ストアを連携する](integrate-payments)
2. **Public SDKキーをコピーする**:Adapty ダッシュボードで **App settings → General** を開き、**API keys** セクションを確認します。コード内では、`adapty.activate("YOUR_PUBLIC_SDK_KEY")` に渡す文字列です。
3. **プロダクトを1つ以上作成する**:Adapty ダッシュボードで **Products** ページを開いてください。コード内でプロダクトを直接参照することはありません — Adaptはペイウォールを通じてプロダクトを提供します。
[プロダクトを追加する](quickstart-products)
4. **ペイウォールとプレースメントを作成する**:Adapty ダッシュボードで **Paywalls** ページにペイウォールを作成し、**Placements** ページでプレースメントに割り当ててください。コード内では、`adapty.getPaywall("YOUR_PLACEMENT_ID")` に渡すプレースメントIDを使います。
[ペイウォールを作成する](quickstart-paywalls)
5. **アクセスレベルを設定する**:Adapty ダッシュボードで **Products** ページの各プロダクトに設定します。コード内では `profile.accessLevels['premium']?.isActive` で確認する文字列です。デフォルトの `premium` アクセスレベルはほとんどのアプリで問題ありません。プロダクトによって異なる機能(例:`basic` プランと `pro` プラン)をユーザーに提供する場合は、コーディングを始める前に[追加のアクセスレベルを作成](assigning-access-level-to-a-product)してください。
:::tip
5つの準備が整ったら、コードを書き始められます。「Public SDKキーはXで、プレースメントIDはY」とLLMに伝えると、正しい初期化コードとペイウォール取得コードを生成してもらえます。
:::
### 準備ができたら設定するもの \{#set-up-when-ready\}
コーディングを始める前に必須ではありませんが、統合が進むにつれて必要になります:
- **A/B テスト**:**Placements** ページで設定します。コードの変更は不要です。
[A/B テスト](ab-tests)
- **追加のペイウォールとプレースメント**:異なるプレースメントIDで `getPaywall` の呼び出しを追加します。
- **アナリティクス連携**:**Integrations** ページで設定します。設定方法は連携先によって異なります。[アナリティクス連携](analytics-integration)と[アトリビューション連携](attribution-integration)を参照してください。
## LLMにAdaptyのドキュメントを渡す \{#feed-adapty-docs-to-your-llm\}
### Context7を使う方法(推奨)\{#use-context7-recommended\}
[Context7](https://context7.com)は、LLMが最新のAdaptyドキュメントに直接アクセスできるMCPサーバーです。質問内容に応じて適切なドキュメントを自動で取得するため、URLを手動で貼り付ける必要がありません。
Context7は**Cursor**、**Claude Code**、**Windsurf**、その他のMCP対応ツールで動作します。セットアップするには以下を実行してください:
```
npx ctx7 setup
```
エディタを自動検出してContext7サーバーを設定します。手動セットアップの方法は[Context7のGitHubリポジトリ](https://github.com/upstash/context7)を参照してください。
設定が完了したら、プロンプト内でAdaptyライブラリを参照します:
```
Use the adaptyteam/adapty-docs library to look up how to install the React Native SDK
```
:::warning
Context7を使えばドキュメントのURLを手動で貼り付ける必要はなくなりますが、実装の順序は重要です。すべてが正しく動作するよう、以下の[実装ウォークスルー](#implementation-walkthrough)をステップごとに進めてください。
:::
### プレーンテキストのドキュメントを使う方法 \{#use-plain-text-docs\}
AdaptyのドキュメントはプレーンテキストのMarkdownとして取得できます。URLの末尾に `.md` を追加するか、記事タイトルの下にある **Copy for LLM** をクリックしてください。例:[adapty-cursor-react-native.md](https://adapty.io/docs/ja/adapty-cursor-react-native.md)
以下の[実装ウォークスルー](#implementation-walkthrough)の各ステップには、貼り付け用の `.md` リンクが入った「LLMに送るプロンプト」ブロックが含まれています。
より多くのドキュメントを一度に渡したい場合は、以下の[インデックスファイルとプラットフォーム別サブセット](#plain-text-doc-index-files)を参照してください。
## 実装ウォークスルー \{#implementation-walkthrough\}
ここからは、Adaptyの統合を実装順に進めていきます。各ステップには、LLMに渡すドキュメント、完了時の確認事項、よくある問題が記載されています。
### 統合の計画を立てる \{#plan-your-integration\}
コードを書く前に、LLMにプロジェクトを分析させて実装計画を作成させてください。AIツールがプランニングモード(CursorやClaude Codeのプランモードなど)をサポートしている場合は、コードを書く前にLLMがプロジェクト構成とAdaptyのドキュメントの両方を読めるよう、そのモードを使用してください。
購入の処理方法をLLMに伝えてください — これによって参照すべきガイドが変わります:
- [**Adapty ペイウォールビルダー**](adapty-paywall-builder):Adaptyのノーコードビルダーでペイウォールを作成し、SDKが自動でレンダリングします。
- [**手動で作成したペイウォール**](react-native-making-purchases):コードで独自のペイウォールUIを構築しつつ、プロダクトの取得と購入処理にAdaptyを使います。
- [**オブザーバーモード**](observer-vs-full-mode):既存の購入インフラをそのまま使い、Adaptyはアナリティクスと連携にのみ使用します。
どれを選ぶか迷ったら、[クイックスタートの比較表](react-native-quickstart-paywalls)を参照してください。
### SDKのインストールと設定 \{#install-and-configure-the-sdk\}
npm(またはyarn)でAdapty SDKの依存関係を追加し、Public SDKキーで有効化します。これが基盤となるため、ここが機能しないと他のすべてが動作しません。
ExpoとベアのReact Nativeプロジェクトでは別々のインストールガイドがあります — 自分のセットアップに合ったものを選んでください。
**ガイド:**
- [Expoでインストールする](sdk-installation-react-native-expo)
- [ベアReact Nativeでインストールする](sdk-installation-react-native-pure)
LLMに送るプロンプト(セットアップに合ったものを選ぶか、両方送ってください):
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/ja/sdk-installation-react-native-expo.md
- https://adapty.io/docs/ja/sdk-installation-react-native-pure.md
```
:::tip[チェックポイント]
- **確認事項:** アプリがiOSとAndroidの両方でビルドおよび実行できること。Metroバンドラーのログにアクティベーションログが表示されること。
- **注意点:** 「Public API key is missing」が表示される場合 → プレースホルダーをApp settingsの実際のキーに置き換えたか確認してください。
:::
### ペイウォールの表示と購入処理 \{#show-paywalls-and-handle-purchases\}
プレースメントIDでペイウォールを取得し、表示して、購入イベントを処理します。必要なガイドは購入の処理方法によって異なります。
進めながらサンドボックスで各購入をテストしてください — 最後まで待たずに行うことをお勧めします。設定方法は[サンドボックスで購入をテストする](test-purchases-in-sandbox)を参照してください。
デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方式はユーザーが常に最新のデータを取得できるため、推奨します。
ただし、ユーザーのインターネット接続が不安定な場合は、`.returnCacheDataElseLoad` を使用することを検討してください。キャッシュが存在する場合はキャッシュデータを返します。この場合、ユーザーが最新のデータを取得できないことがありますが、接続状態にかかわらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、ネットワークリクエストを避けるためにセッション中に使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリーンアップした場合にのみ削除されます。
Adapty SDK はペイウォールをローカルに2層で保存します。1つは上記の定期更新キャッシュ、もう1つは[フォールバックペイウォール](fallback-paywalls)です。また、CDN を使用してペイウォールをより速く取得し、CDN に接続できない場合に備えてスタンドアローンのフォールバックサーバーも利用しています。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンのペイウォールを取得できるよう設計されています。
| | **loadTimeoutMs** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
内部で複数のリクエストが実行される場合があるため、まれに `loadTimeout` で指定した時間よりわずかに遅れてタイムアウトすることがあります。
Android の場合: 拡張関数(例: `5.seconds`、`.seconds` は `import com.adapty.utils.seconds` から)を使用するか、`TimeInterval.seconds(5)` で `TimeInterval` を作成できます。制限なしにするには `TimeInterval.INFINITE` を使用してください。
| ## レスポンスパラメータ \{#response-parameters\} | パラメータ | 説明 | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Flow | フローの識別子(`id`、`variationId`)、名前、プレースメント、ペイウォールのバリアント(`paywalls`)、リモートコンフィグ(`remoteConfigs`)を含む `AdaptyFlow` オブジェクト。 | ## ビュー設定の取得 \{#fetch-the-view-configuration\} :::important ビルダーの **Show on device** トグルを必ず有効にしてください。このオプションがオンになっていない場合、ビュー設定を取得できません。 ::: プレースメントが **Flow Builder** または **ペイウォールビルダー** でデザインされている場合、Adapty が UI をレンダリングします。`createFlowView` でビューを作成し、[フローまたはペイウォールを表示](react-native-present-paywalls)してください。プレースメントがビルダー UI を持たないカスタムペイウォールの場合は、代わりに[リモートコンフィグペイウォールとして処理](present-remote-config-paywalls-react-native)してください。 React Native SDK では、ビューの設定を事前に取得する必要はなく、`createFlowView` を直接呼び出せます。 :::warning `createFlowView` メソッドの戻り値は一度しか使用できません。再度使用する必要がある場合は、`createFlowView` メソッドを新たに呼び出してください。再作成せずに二度呼び出すと、`AdaptyUIError.viewAlreadyPresented` エラーが発生する場合があります。 ::: ```typescript showLineNumbers try { const view = await createFlowView(flow); } catch (error) { // handle the error } ``` パラメーター: | パラメーター | 必須/任意 | 説明 | | :------------------- | :------- | :----------------------------------------------------------- | | **flow** | 必須 | 目的のフロー/ペイウォールのコントローラーを取得するための `AdaptyFlow` オブジェクト。 | | **customTags** | 任意 | カスタムタグとその解決済みの値の辞書を定義します。カスタムタグはコンテンツ内のプレースホルダーとして機能し、フロー/ペイウォール内でパーソナライズされたコンテンツを提供するために特定の文字列に動的に置き換えられます。詳細については、ペイウォールビルダーのカスタムタグに関するトピックを参照してください。 | | **prefetchProducts** | 任意 | 画面上のプロダクト表示タイミングを最適化するために有効にします。`true` にすると、AdaptyUI が必要なプロダクトを自動的にフェッチします。デフォルト: `false`。 | | **android.enableSafeArea** | 任意 | Android のみ(iOS では無視されます)。ネストされたオブジェクトとして渡してください: `android: { enableSafeArea: true }`。`true` にすると、フロービューにセーフエリアのパディングが適用されます。モーダル表示(`createFlowView` + `present()`)の場合はデフォルトで `true`、埋め込みの `AdaptyFlowView` コンポーネントの場合はデフォルトで `false` です。ほとんどのケースではデフォルト設定が適しています。 | :::note 複数の言語を使用している場合は、[フローのローカライズを追加する方法](add-paywall-locale-in-adapty-paywall-builder)と、ロケールコードを正しく使用する方法を[こちら](react-native-localizations-and-locale-codes)でご確認ください。 ::: ビューを取得したら、[フロー/ペイウォールを表示](react-native-present-paywalls)してください。 ## デフォルトオーディエンスのフローまたはペイウォールを取得して表示を高速化する \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} 通常、フローやペイウォールはほぼ即座に取得されるため、高速化を意識する必要はありません。ただし、オーディエンスやプレースメントが多数あり、ユーザーの通信環境が不安定な場合は、取得に時間がかかることがあります。そのような状況では、何も表示しないよりも、デフォルトのフローまたはペイウォールを表示してスムーズなユーザー体験を提供したほうがよいでしょう。 これに対処するために、`getFlowForDefaultAudience` メソッドを使用できます。このメソッドは、指定したプレースメントの **All Users** オーディエンス向けのフローまたはペイウォールを取得します。ただし、推奨されるアプローチは [フロー/ペイウォールの取得](#fetch-flowpaywall) セクションで詳しく説明されている `getFlow` メソッドを使用してフローまたはペイウォールを取得することである点を理解しておくことが重要です。 :::warning `getFlow` を推奨する理由 `getFlowForDefaultAudience` メソッドにはいくつかの重大なデメリットがあります: - **後方互換性の問題**: 現行バージョンと将来のバージョンで異なるペイウォールを表示する必要がある場合、課題が生じる可能性があります。現行(レガシー)バージョンに対応したペイウォールを設計するか、現行(レガシー)バージョンのユーザーがペイウォールを表示できない問題を受け入れるかのいずれかを選択する必要があります。 - **ターゲティングの喪失**: すべてのユーザーが **All Users** オーディエンス向けに設計された同一のペイウォールを表示することになるため、国、マーケティングのアトリビューション、独自のカスタム属性に基づくパーソナライズされたターゲティングができなくなります。 より速いフローまたはペイウォールの取得というメリットのためにこれらのデメリットを受け入れられる場合は、以下のように `getFlowForDefaultAudience` メソッドを使用してください。それ以外の場合は、[上記](#fetch-flowpaywall)で説明した `getFlow` を使用してください。 ::: ```typescript showLineNumbers try { const id = 'YOUR_PLACEMENT_ID'; const flow = await adapty.getFlowForDefaultAudience(id); // the requested flow/paywall } catch (error) { // handle the error } ``` | パラメータ | 必須/任意 | 説明 | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | 必須 | [プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、この設定を推奨します。
ただし、ユーザーのインターネット接続が不安定な場合は、`.returnCacheDataElseLoad` の使用を検討してください。この設定では、キャッシュが存在する場合にキャッシュデータを返します。最新データが得られないケースはありますが、接続状況に関わらず読み込みが速くなります。キャッシュはセッション中も定期的に更新されるため、ネットワークリクエストを減らす目的で安心して利用できます。
なお、キャッシュはアプリを再起動しても保持され、アプリのアンインストール時または手動でクリアした場合のみ削除されます。
| ## アセットのカスタマイズ \{#customize-assets\} フロー/ペイウォール内の画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像と動画には、あらかじめ `hero_image` および `hero_video` という定義済みIDが割り当てられています。カスタムアセットバンドルでは、これらのIDを使って各要素を指定し、動作をカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定](custom-media)する必要があります。 たとえば、次のようなことができます。 - 特定のユーザーに別の画像や動画を表示する。 - リモートのメイン画像の読み込み中にローカルのプレビュー画像を表示する。 - 動画の再生前にプレビュー画像を表示する。 :::important この機能を使用するには、Adapty React Native SDK をバージョン 3.8.0 以上に更新してください。 ::: シンプルなディクショナリを使ってカスタムアセットを提供する例を以下に示します: ```javascript const customAssets: Record任意
デフォルト: `en`
|[ペイウォールのローカライゼーション](add-paywall-locale-in-adapty-paywall-builder)の識別子。ハイフン(**-**)で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目はリージョンを表します。
例:`en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよび推奨する使用方法については、[ローカライゼーションとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。常に最新のデータをユーザーに届けられるため、この設定を推奨します。
ただし、ユーザーのインターネット接続が不安定だと考えられる場合は、`.returnCacheDataElseLoad` を使用して、キャッシュが存在する場合はキャッシュデータを返すようにすることを検討してください。この場合、最新データが届かないことがありますが、接続が不安定な状況でも読み込みが速くなります。キャッシュはこまめに更新されるため、ネットワークリクエストを減らす目的でセッション中に使用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はペイウォールをローカルに2層で保存します。1つは上述の定期更新キャッシュ、もう1つは[フォールバックペイウォール](fallback-paywalls)です。また、ペイウォールの取得を高速化するために CDN を使用し、CDN に接続できない場合に備えたスタンドアロンのフォールバックサーバーも備えています。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンのペイウォールを取得できるよう設計されています。
| | **loadTimeoutMs** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルのフォールバックが返されます。
内部で複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間よりわずかに遅れてタイムアウトすることがあります。
Android の場合:`TimeInterval` は拡張関数(例:`5.seconds`(`.seconds` は `import com.adapty.utils.seconds` から)など)または `TimeInterval.seconds(5)` で作成できます。制限なしに設定するには `TimeInterval.INFINITE` を使用してください。
| ## レスポンスパラメータ \{#response-parameters\} | パラメーター | 説明 | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | プロダクト ID のリスト、ペイウォール識別子、リモートコンフィグ、およびその他のいくつかのプロパティを含む [`AdaptyPaywall`](https://react-native.adapty.io/interfaces/adaptypaywall) オブジェクト。 | ## ペイウォールビルダーで作成したペイウォールのビュー設定を取得する \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important ペイウォールビルダーの **Show on device** トグルを有効にしてください。このオプションがオンになっていない場合、ビュー設定を取得できません。 ::: ペイウォールを取得したら、`ViewConfiguration` が含まれているかどうかを確認してください。これが含まれている場合、そのペイウォールはペイウォールビルダーで作成されたことを示します。この情報をもとに、ペイウォールの表示方法を決定してください。`ViewConfiguration` が存在する場合はペイウォールビルダーのペイウォールとして扱い、存在しない場合は[リモートコンフィグのペイウォールとして処理してください](present-remote-config-paywalls-react-native)。 React Native SDK では、ビュー設定を手動で取得せずに、直接 `createPaywallView` メソッドを呼び出してください。 :::warning `createPaywallView` メソッドの結果は一度しか使用できません。再度使用する必要がある場合は、`createPaywallView` メソッドを新たに呼び出してください。再作成せずに2回呼び出すと、`AdaptyUIError.viewAlreadyPresented` エラーが発生する可能性があります。 ::: ```typescript showLineNumbers // for the Adapty SDK < 3.14 – import {createPaywallView} from 'react-native-adapty/dist/ui'; if (paywall.hasViewConfiguration) { try { const view = await createPaywallView(paywall); } catch (error) { // handle the error } } else { //use your custom logic } ``` パラメーター: | パラメーター | 必須/任意 | 説明 | | :------------------- | :------- | :----------------------------------------------------------- | | **paywall** | 必須 | 目的のペイウォールのコントローラーを取得するための `AdaptyPaywall` オブジェクト。 | | **customTags** | 任意 | カスタムタグとその解決済みの値のディクショナリを定義します。カスタムタグはペイウォールコンテンツ内のプレースホルダーとして機能し、特定の文字列に動的に置き換えることでペイウォール内のコンテンツをパーソナライズします。詳細はペイウォールビルダーのカスタムタグのトピックを参照してください。 | | **prefetchProducts** | 任意 | 画面上のプロダクト表示タイミングを最適化するために有効にします。`true` の場合、AdaptyUI は必要なプロダクトを自動的に取得します。デフォルト: `false`。 | :::note 複数の言語を使用している場合は、[ペイウォールビルダーのローカライゼーションを追加する方法](add-paywall-locale-in-adapty-paywall-builder)と、ロケールコードの正しい使い方については[こちら](react-native-localizations-and-locale-codes)をご覧ください。 ::: ビューを取得したら、[ペイウォールを表示](react-native-present-paywalls)してください。 ## デフォルトオーディエンス向けペイウォールを取得して表示を高速化する \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} 通常、ペイウォールはほぼ即座に取得されるため、速度を気にする必要はありません。ただし、オーディエンスやペイウォールの数が多く、ユーザーのインターネット接続が不安定な場合、ペイウォールの取得に予想以上の時間がかかることがあります。そのような状況では、ペイウォールをまったく表示しないよりも、デフォルトのペイウォールを表示してスムーズなユーザー体験を確保したい場合があるでしょう。 これに対処するには、`getPaywallForDefaultAudience` メソッドを使用できます。このメソッドは、**All Users** オーディエンス向けに指定されたプレースメントのペイウォールを取得します。ただし、推奨アプローチは `getPaywall` メソッドでペイウォールを取得することであり、詳細は上記の[ペイウォール情報の取得](#fetch-paywall-designed-with-paywall-builder)セクションを参照してください。 :::warning `getPaywall` を推奨する理由 `getPaywallForDefaultAudience` メソッドにはいくつかの重大な欠点があります: - **後方互換性の問題**: 異なるアプリバージョン(現行バージョンと将来のバージョン)で異なるペイウォールを表示する必要がある場合、課題が生じることがあります。現行(レガシー)バージョンに対応したペイウォールを設計するか、現行(レガシー)バージョンのユーザーがペイウォールを表示できない問題を許容するか、いずれかの対応が必要になります。 - **ターゲティングの喪失**: すべてのユーザーに **All Users** オーディエンス向けに設計された同一のペイウォールが表示されます。これにより、国、マーケティングのアトリビューション、独自のカスタム属性などに基づくパーソナライズされたターゲティングができなくなります。 これらのデメリットを許容してペイウォールの取得を高速化したい場合は、以下のように `getPaywallForDefaultAudience` メソッドを使用してください。そうでない場合は、[上記](#fetch-paywall-designed-with-paywall-builder)で説明した `getPaywall` を使用してください。 ::: ```typescript showLineNumbers try { const id = 'YOUR_PLACEMENT_ID'; const locale = 'en'; const paywall = await adapty.getPaywallForDefaultAudience(id, locale); // the requested paywall } catch (error) { // handle the error } ``` :::note `getPaywallForDefaultAudience` メソッドは、React Native SDK バージョン 2.11.2 以降で利用できます。 ::: | パラメータ | 必須/任意 | 説明 | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | 必須 | [プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
|[ペイウォールのローカライゼーション](add-remote-config-locale)の識別子です。このパラメータは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードである必要があります。最初のサブタグは言語、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードの詳細および推奨される使用方法については、[ローカライゼーションとロケールコード](react-native-localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方法はユーザーが常に最新のデータを受け取れるため、推奨しています。
ただし、ユーザーがインターネット接続の不安定な環境にいると想定される場合は、`.returnCacheDataElseLoad` を使用してキャッシュが存在すればそれを返す方法も検討してください。この場合、最新データが届かないことがありますが、接続状態に関わらず読み込み時間が短縮されます。キャッシュはセッション中に定期的に更新されるため、ネットワークリクエストを減らす目的で安全に使用できます。
なお、キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動クリアを行った場合にのみ削除されます。
| ## アセットのカスタマイズ \{#customize-assets\} ペイウォール内の画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像とヒーロー動画には、`hero_image` と `hero_video` というあらかじめ定義された ID があります。カスタムアセットバンドルでは、これらの ID を指定して要素の動作をカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタム ID を設定する](custom-media)必要があります。 たとえば、次のようなことができます。 - 一部のユーザーに別の画像や動画を表示する。 - リモートのメイン画像の読み込み中にローカルのプレビュー画像を表示する。 - 動画の再生前にプレビュー画像を表示する。 :::important この機能を使用するには、Adapty React Native SDK をバージョン 3.8.0 以上に更新してください。 ::: シンプルなディクショナリを使ってカスタムアセットを提供する例を示します: ```javascript const customAssets: Record
## ペイウォールのビュー数が多すぎる \{#the-paywall-view-number-is-too-big\}
**問題**: ペイウォールのビュー数が予想の2倍になっている。
**原因**: コード内で `logShowFlow`(React Native SDK v4以降)/ `logShowPaywall` を呼び出している可能性があります。ペイウォールビルダーまたはフロービルダーを使用している場合、この呼び出しによってビュー数が重複します。これらのツールで作成したフローやペイウォールでは、アナリティクスが自動的に追跡されるため、このメソッドを使用する必要はありません。
**解決策**: ペイウォールビルダーまたはフロービルダーを使用している場合は、コード内で `logShowFlow`(React Native SDK v4以降)/ `logShowPaywall` を呼び出していないことを確認してください。
## その他の問題 \{#other-issues\}
**問題**: 上記で説明されていないペイウォールビルダー関連の問題が発生している。
**解決策**: 必要に応じて[マイグレーションガイド](react-native-sdk-migration-guides)を参照してSDKを最新バージョンに移行してください。多くの問題は新しいSDKバージョンで解決されています。
---
# File: react-native-quickstart-manual
---
---
title: "React Native SDKのカスタムペイウォールで購入を有効にする"
description: "Adapty SDKをReact Nativeのカスタムペイウォールに統合して、アプリ内課金を有効にする方法を解説します。"
---
このガイドでは、Adaptyをカスタムペイウォールに統合する方法を説明します。ペイウォールの実装を完全にコントロールしながら、Adapty SDKがプロダクトの取得、新規購入の処理、過去の購入の復元を行います。
:::important
**このガイドは、カスタムペイウォールを実装する開発者向けです。** 購入機能を最も簡単に導入したい場合は、[Adapty フローBuilder](react-native-quickstart-paywalls) をご利用ください。フローBuilderを使えば、ノーコードのビジュアルエディターでフローを作成でき、購入ロジックはすべてAdaptyが自動的に処理します。また、アプリを再公開することなく、さまざまなデザインをテストできます。
:::
## 始める前に \{#before-you-start\}
### プロダクトの設定 \{#set-up-products\}
アプリ内課金を有効にするには、3つの重要な概念を理解する必要があります。
- [**プロダクト**](product) – ユーザーが購入できるもの(サブスクリプション、消耗型アイテム、永続アクセス)
- [**ペイウォール**](paywalls) – どのプロダクトを提供するかを定義する設定。Adapty では、プロダクトを取得する唯一の方法がペイウォールです。この設計により、アプリのコードを変更することなく、プロダクト・価格・オファーを修正できます。
- [**プレースメント**](placements) – アプリ内でペイウォールを表示する場所とタイミング(`main`、`onboarding`、`settings` など)。ダッシュボードでプレースメントにペイウォールを設定し、コード内ではプレースメント ID を指定してリクエストします。これにより、A/B テストの実施や、ユーザーごとに異なるペイウォールの表示が簡単に行えます。
これらのコンセプトは、カスタムペイウォールを使う場合でも必ず把握しておいてください。要するに、アプリで販売するプロダクトを管理するための仕組みです。
カスタムペイウォールを実装するには、**ペイウォール**を作成し、**プレースメント**に追加する必要があります。この設定により、プロダクトを取得できるようになります。ダッシュボードで何をすべきかを確認するには、[こちら](quickstart)のクイックスタートガイドを参照してください。
### ユーザーの管理 \{#manage-users\}
バックエンド認証の有無にかかわらず使用できます。
ただし、Adapty SDKは匿名ユーザーと識別済みユーザーを異なる方法で処理します。詳細を把握し、ユーザーを適切に扱うために、[識別クイックスタートガイド](react-native-quickstart-identify)をお読みください。
## ステップ 1. プロダクトを取得する \{#step-1-get-products\}
カスタムペイウォール用のプロダクトを取得するには、次の手順に従います。
1. [プレースメント](placements) ID を `getFlow` メソッドに渡して `flow` オブジェクトを取得します。
2. `getPaywallProducts` メソッドを使用して、このフローのプロダクト配列を取得します。
```typescript showLineNumbers
async function loadPaywall() {
try {
const flow: AdaptyFlow = await adapty.getFlow('YOUR_PLACEMENT_ID');
const products: AdaptyPaywallProduct[] = await adapty.getPaywallProducts(flow);
// Use products to build your custom paywall UI
} catch (error) {
// Handle the error
}
}
```
## ステップ2:購入を受け付ける \{#step-2-accept-purchases\}
ユーザーがカスタムペイウォール上でプロダクトをタップしたら、選択されたプロダクトを引数として `makePurchase` メソッドを呼び出します。これにより購入フローが処理され、更新されたプロファイルが返されます。
```typescript showLineNumbers
async function purchaseProduct(product: AdaptyPaywallProduct) {
try {
const purchaseResult: AdaptyPurchaseResult = await adapty.makePurchase(product);
switch (purchaseResult.type) {
case 'success':
// Purchase successful, profile updated
break;
case 'user_cancelled':
// User canceled the purchase
break;
case 'pending':
// Purchase is pending (e.g., user will pay offline with cash)
break;
}
} catch (error) {
// Handle the error
}
}
```
## ステップ 3. 購入を復元する \{#step-3-restore-purchases\}
アプリストアでは、サブスクリプションを提供するすべてのアプリに対して、ユーザーが購入を復元できる手段を提供することを義務付けています。
ユーザーが復元ボタンをタップしたときに `restorePurchases` メソッドを呼び出してください。これにより、ユーザーの購入履歴が Adapty と同期され、更新されたプロファイルが返されます。
```typescript showLineNumbers
async function restorePurchases() {
try {
const profile: AdaptyProfile = await adapty.restorePurchases();
// Restore successful, profile updated
} catch (error) {
// Handle the error
}
}
```
## 次のステップ \{#next-steps\}
:::tip
ご質問やお困りのことがあれば、[サポートフォーラム](https://adapty.featurebase.app/)をご覧ください。よくある質問への回答を見つけたり、ご自身の質問を投稿することができます。チームとコミュニティがサポートいたします!
:::
ペイウォールをアプリに表示する準備が整いました。[App Store サンドボックス](test-purchases-in-sandbox)または[Google Play Store](testing-on-android)でテスト購入を行い、ペイウォールからテスト購入が完了できることを確認してください。本番環境に対応した実装でどのように動作するかを確認するには、サンプルアプリの[CustomPurchaseScreen.tsx](https://github.com/adaptyteam/AdaptySDK-React-Native/blob/master/examples/ExpoGoWebMock/src/CustomPurchaseScreen.tsx)を参照してください。エラー処理、ローディング状態、UI状態管理を含む購入処理の実装例が確認できます。
次に、[購入が完了しているかどうかを確認](react-native-check-subscription-status)して、ペイウォールを表示するか有料機能へのアクセスを許可するかを判断します。
---
# File: fetch-paywalls-and-products-react-native
---
---
title: "React Native SDKでリモートコンフィグペイウォールのペイウォールとプロダクトを取得する"
description: "Adapty React Native SDKでペイウォールとプロダクトを取得し、ユーザーのマネタイズを強化しましょう。"
---
デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるよう、この設定を推奨します。
ただし、ユーザーのインターネット接続が不安定な場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在する場合はそれを返すことを検討してください。この場合、最新データが反映されないことがありますが、接続状態に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを省くために使っても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はフローとペイウォールを2層で保存します。上記の定期更新キャッシュと[フォールバックペイウォール](react-native-use-fallback-paywalls)です。また、フローとペイウォールの取得を高速化するために CDN を使用し、CDN に接続できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムにより、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンのフローを取得できます。
| | **loadTimeoutMs** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
内部的に複数のリクエストで構成される場合があるため、まれに `loadTimeout` で指定した時間より若干遅くタイムアウトすることがあります。
| :::note v4 では、`getFlow` は `locale` パラメータを受け取らなくなりました。カスタムペイウォールの場合、利用可能なすべてのロケールはフローのリモートコンフィグ(`flow.remoteConfigs`)で返されます。ユーザーのデバイスまたはアプリ設定に合ったものを選択してください。 ::: プロダクトIDをハードコードしないでください!フローはリモートで設定されるため、利用可能なプロダクト、プロダクトの数、特別オファー(無料トライアルなど)は随時変更される可能性があります。これらのシナリオに対応できるようコードを設計してください。 たとえば、最初に2つのプロダクトを取得した場合、アプリはその2つを表示します。しかし後で3つのプロダクトを取得した場合は、コードを変更することなく3つすべてを表示できる必要があります。ハードコードが必要なのはプレースメントIDだけです。 レスポンスのパラメーター: | パラメーター | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | プレースメント、識別子(`id`、`variationId`)、名前、ペイウォールのバリアント(`paywalls`)、設定済みロケールごとのエントリーを含む `remoteConfigs` 配列を持つ `AdaptyFlow` オブジェクト。フローのプロダクトを取得するには、`getPaywallProducts(flow)` を呼び出してください。 | ## プロダクトの取得 \{#fetch-products\} フローを取得したら、そのフローに対応するプロダクトの配列を取得できます。 ```typescript showLineNumbers try { // ...flow const products = await adapty.getPaywallProducts(flow); // the requested products list } catch (error) { // handle the error } ``` レスポンスパラメーター: | パラメーター | 説明 | | :-------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) オブジェクトのリスト。プロダクト識別子、プロダクト名、価格、通貨、サブスクリプション期間、その他いくつかのプロパティが含まれます。 | 独自のペイウォールデザインを実装する際には、[`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) オブジェクトから以下のプロパティにアクセスする必要があります。以下によく使われるプロパティを示しますが、利用可能なすべてのプロパティの詳細はリンク先のドキュメントを参照してください。 | プロパティ | 説明 | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | プロダクトのタイトルを表示するには、`product.localizedTitle` を使用します。ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づいて行われます。 | | **Price** | ローカライズされた価格を表示するには、`product.price?.localizedString` を使用します。このローカライズはデバイスのロケール情報に基づいています。`product.price?.amount` を使用して価格を数値として取得することもできます。値はローカル通貨で提供されます。関連する通貨記号を取得するには、`product.price?.currencySymbol` を使用します。 | | **Subscription Period** | 期間(週、月、年など)を表示するには、`product.subscription?.localizedSubscriptionPeriod` を使用します。このローカライズはデバイスのロケールに基づいています。プログラムでサブスクリプション期間を取得するには、`product.subscription?.subscriptionPeriod` を使用します。そこから `unit` プロパティにアクセスして期間の長さ(`'day'`、`'week'`、`'month'`、`'year'`、または `'unknown'`)を取得できます。`numberOfUnits` の値で期間の単位数を取得できます。たとえば、四半期ごとのサブスクリプションの場合、`unit` プロパティには `'month'`、`numberOfUnits` プロパティには `3` が表示されます。 | | **Introductory Offer** | サブスクリプションに初回オファーが含まれているかどうかを示すバッジやその他のインジケーターを表示するには、`product.subscription?.offer?.phases` プロパティを確認します。このリストには、無料トライアルフェーズと初回価格フェーズの最大2つの割引フェーズを含めることができます。各フェーズオブジェクトには次の便利なプロパティがあります:デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方法を推奨します。ユーザーが常に最新のデータを受け取れることが保証されるためです。
ただし、ユーザーがネットワーク接続の不安定な環境にいると想定される場合は、`.returnCacheDataElseLoad` を使用して、キャッシュが存在すればそちらを返すことを検討してください。この場合、最新データが届かないことがありますが、接続状況にかかわらず読み込み時間が短縮されます。キャッシュはセッション中に定期的に更新されるため、不要なネットワークリクエストを避ける目的で使用しても安全です。
キャッシュはアプリの再起動後も保持されます。クリアされるのは、アプリのアンインストール時または手動でのクリーンアップ時のみです。
|任意
デフォルト: `en`
|[ペイウォールのローカライゼーション](add-remote-config-locale)の識別子。マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよび推奨する使用方法については、[ローカライゼーションとロケールコード](react-native-localizations-and-locale-codes)をご覧ください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、この設定を推奨します。
ただし、ユーザーが不安定なインターネット環境を利用していると想定される場合は、`.returnCacheDataElseLoad` を使用してキャッシュが存在する場合にキャッシュデータを返すことを検討してください。この場合、最新データが取得できないことがありますが、接続状況に関わらず高速な読み込みが実現できます。キャッシュは定期的に更新されるため、セッション中のネットワークリクエストを避ける用途では安全に使用できます。
キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はペイウォールを2つの層で保存します。上記の定期更新キャッシュと[フォールバックペイウォール](react-native-use-fallback-paywalls)です。また、ペイウォールの高速取得のために CDN を使用し、CDN に到達できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な場合でも、常に最新バージョンのペイウォールを確実に取得できるよう設計されています。
| | **loadTimeoutMs** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
内部では複数のリクエストで構成される処理のため、まれに `loadTimeout` で指定した時間よりもわずかに遅れてタイムアウトが発生する場合があります。
| プロダクトIDをハードコードしないでください!ペイウォールはリモートで設定されるため、利用可能なプロダクト、プロダクトの数、特典(無料トライアルなど)は随時変更される場合があります。こうしたシナリオに対応できるコードを記述してください。 たとえば、最初に2つのプロダクトを取得した場合、アプリはそれら2つを表示する必要があります。後で3つのプロダクトを取得した場合は、コードを変更することなく3つすべてを表示できなければなりません。ハードコードする必要があるのはプレースメントIDのみです。 レスポンスのパラメーター: | パラメータ | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | プロダクトIDのリスト、ペイウォールの識別子、リモートコンフィグ、その他いくつかのプロパティを含む [`AdaptyPaywall`](https://react-native.adapty.io/interfaces/adaptypaywall) オブジェクト。 | ## プロダクトの取得 \{#fetch-products\} ペイウォールを取得したら、それに対応するプロダクトの配列を取得できます。 ```typescript showLineNumbers try { // ...paywall const products = await adapty.getPaywallProducts(paywall); // the requested products list } catch (error) { // handle the error } ``` レスポンスパラメーター: | パラメータ | 説明 | | :-------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) オブジェクトのリスト。プロダクト識別子、プロダクト名、価格、通貨、サブスクリプション期間、その他のプロパティが含まれます。 | 独自のペイウォールデザインを実装する場合、[`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) オブジェクトから以下のプロパティにアクセスする必要があります。よく使われるプロパティを以下に示しますが、利用可能なすべてのプロパティの詳細については、リンク先のドキュメントを参照してください。 | プロパティ | 説明 | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | プロダクトのタイトルを表示するには、`product.localizedTitle` を使用します。ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づきます。 | | **Price** | ローカライズされた価格を表示するには、`product.price?.localizedString` を使用します。このローカライズはデバイスのロケール情報に基づきます。`product.price?.amount` を使用すると、価格を数値として取得することもできます。値はローカル通貨で提供されます。対応する通貨記号を取得するには、`product.price?.currencySymbol` を使用します。 | | **Subscription Period** | 期間(週、月、年など)を表示するには、`product.subscription?.localizedSubscriptionPeriod` を使用します。このローカライズはデバイスのロケールに基づきます。プログラムでサブスクリプション期間を取得するには、`product.subscription?.subscriptionPeriod` を使用します。そこから `unit` プロパティにアクセスして、長さ(`'day'`、`'week'`、`'month'`、`'year'`、または `'unknown'`)を取得できます。`numberOfUnits` の値で期間の単位数を取得できます。たとえば、四半期ごとのサブスクリプションの場合、`unit` プロパティには `'month'`、`numberOfUnits` には `3` が設定されます。 | | **Introductory Offer** | サブスクリプションに初回オファーが含まれていることを示すバッジやインジケーターを表示するには、`product.subscription?.offer?.phases` プロパティを確認してください。これは最大2つの割引フェーズ(無料トライアルフェーズと初回価格フェーズ)を含むリストです。各フェーズオブジェクトには以下の便利なプロパティがあります:任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-remote-config-locale)の識別子。このパラメーターは、マイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードおよび推奨される使用方法については、[ローカライズとロケールコード](react-native-localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。この方法を推奨します。ユーザーが常に最新のデータを取得できるためです。
ただし、ユーザーのインターネット接続が不安定な場合は、`.returnCacheDataElseLoad` を使用してキャッシュが存在する場合にキャッシュデータを返すことを検討してください。この場合、最新のデータが取得できないことがありますが、接続状況にかかわらず読み込みが速くなります。キャッシュはセッション中も定期的に更新されるため、ネットワークリクエストを減らすために安全に活用できます。
キャッシュはアプリの再起動後も保持され、アプリのアンインストール時または手動でクリアした場合にのみ削除されます。
|リクエストが成功した場合、このオブジェクトがレスポンスに含まれます。[AdaptyProfile](https://react-native.adapty.io/interfaces/adaptyprofile) オブジェクトは、アプリ内のユーザーのアクセスレベル、サブスクリプション、および買い切り購入に関する包括的な情報を提供します。
アクセスレベルのステータスを確認して、ユーザーがアプリへの必要なアクセス権を持っているかどうかを判断してください。
| :::warning **注意:** Apple の StoreKit バージョンが v2.0 未満、かつ Adapty SDK バージョンが v2.9.0 未満の場合は、代わりに [Apple App Store の共有シークレット](app-store-connection-configuration#step-5-enter-app-store-shared-secret)を提供する必要があります。この方法は現在 Apple によって非推奨とされています。 ::: ## 購入時にサブスクリプションを変更する \{#change-subscription-when-making-a-purchase\} ユーザーが現在のサブスクリプションを更新する代わりに新しいサブスクリプションを選択した場合の動作は、アプリストアによって異なります。 - App Store の場合、サブスクリプションはサブスクリプショングループ内で自動的に更新されます。ユーザーがあるグループのサブスクリプションを購入している状態で別のグループのサブスクリプションを購入した場合、両方のサブスクリプションが同時にアクティブになります。 - Google Play の場合、サブスクリプションは自動的に更新されません。以下で説明するように、モバイルアプリのコードで切り替えを管理する必要があります。 Android でサブスクリプションを別のものに置き換えるには、追加パラメーターを指定して `.makePurchase()` メソッドを呼び出します。 ```typescript showLineNumbers try { const purchaseResult = await adapty.makePurchase(product, params); switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Grant access to the paid features } break; case 'user_cancelled': // Handle the case where the user canceled the purchase break; case 'pending': // Handle deferred purchases (e.g., the user will pay offline with cash) break; } } catch (error) { // Handle the error } ``` 追加のリクエストパラメーター: | パラメーター | 必須 | 説明 | | :--------- | :------- | :----------------------------------------------------------- | | **params** | 必須 | [`MakePurchaseParamsInput`](https://react-native.adapty.io/types/makepurchaseparamsinput) 型のオブジェクト。 | :::info **バージョン 3.8.2 以降**: `MakePurchaseParamsInput` の構造が更新されました。`oldSubVendorProductId` と `prorationMode` は `subscriptionUpdateParams` 配下にネストされ、`isOfferPersonalized` は上位レベルに移動しました。 例: ```javascript makePurchase(product, { android: { subscriptionUpdateParams: { oldSubVendorProductId: 'old_product_id', prorationMode: 'charge_prorated_price' }, isOfferPersonalized: true } }); ``` ::: サブスクリプションと置き換えモードの詳細については、Google デベロッパードキュメントをご覧ください: - [置き換えモードについて](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [置き換えモードに関する Google の推奨事項](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - 置き換えモード [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE())。注意: このメソッドはサブスクリプションのアップグレードにのみ使用できます。ダウングレードはサポートされていません。 - 置き換えモード [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED())。注意: 実際のサブスクリプション変更は、現在のサブスクリプションの請求期間が終了したときにのみ行われます。 ## iOSでオファーコードを利用する \{#redeem-offer-codes-in-ios\}[`AdaptyProfile`](https://react-native.adapty.io/interfaces/adaptyprofile) オブジェクト。このモデルにはアクセスレベル、サブスクリプション、および非サブスクリプション購入に関する情報が含まれています。
ユーザーがアプリへのアクセス権を持っているかどうかを判断するには、**アクセスレベルのステータス**を確認してください。
| :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: --- # File: implement-observer-mode-react-native --- --- title: "React Native SDKでオブザーバーモードを実装する" description: "AdaptyのオブザーバーモードをReact Native SDKに実装して、ユーザーのサブスクリプションイベントを追跡する方法を説明します。" --- 独自の購入インフラをすでにお持ちで、Adaptyへの完全な移行の準備ができていない場合は、[オブザーバーモード](observer-vs-full-mode)を試すことができます。基本的な形式では、オブザーバーモードは高度な分析と、アトリビューションおよびアナリティクスシステムとのシームレスな連携を提供します。 これがニーズに合っている場合、必要な作業は次の2つだけです: 1. `observerMode` パラメータを `true` に設定して、Adapty SDKの設定時にオブザーバーモードを有効にする。セットアップ手順は[React Native](sdk-installation-reactnative)を参照してください。 2. 既存の購入インフラからAdaptyへ[トランザクションを報告する](report-transactions-observer-mode-react-native)。 ### オブザーバーモードのセットアップ \{#observer-mode-setup\} 購入とサブスクリプションのステータスを自分で管理し、サブスクリプションイベントの送信と分析にのみAdaptyを使用する場合は、オブザーバーモードを有効にしてください。 :::important オブザーバーモードで動作している場合、Adapty SDKはトランザクションをクローズしないため、必ず自分でトランザクションを処理してください。 ::: ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { observerMode: true, // Enable observer mode }); ``` パラメータ: | パラメータ | 説明 | | --------------------------- | ------------------------------------------------------------ | | observerMode | [オブザーバーモード](observer-vs-full-mode)を制御するboolean値。デフォルト値は `false` です。 | ## オブザーバーモードでAdaptyのペイウォールを使用する \{#using-adapty-paywalls-in-observer-mode\} Adaptyのペイウォールとそのアクセスレベル機能も使いたい場合は利用できますが、オブザーバーモードでは追加のセットアップが必要です。上記の手順に加えて、次の作業が必要です: 1. [リモートコンフィグペイウォール](present-remote-config-paywalls-react-native)と同様にペイウォールを表示する。 3. 購入トランザクションに[ペイウォールを関連付ける](report-transactions-observer-mode-react-native)。 --- # File: report-transactions-observer-mode-react-native --- --- title: "React Native SDKのオブザーバーモードでトランザクションを報告する" description: "React Native SDKのAdapty Observer Modeで購入トランザクションを報告し、ユーザーインサイトと収益トラッキングを実現します。" ---iOS、StoreKit 1 の場合: [SKPaymentTransaction](https://developer.apple.com/documentation/storekit/skpaymenttransaction)オブジェクト。
iOS、StoreKit 2 の場合: [Transaction](https://developer.apple.com/documentation/storekit/transaction)オブジェクト。
Android の場合: 購入のString識別子(purchase.getOrderId)。purchaseは課金ライブラリの[Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase)クラスのインスタンスです。
| | variationId | 必須 | バリアントのString識別子。[AdaptyPaywall](https://react-native.adapty.io/interfaces/adaptypaywall)オブジェクトの`variationId`プロパティを使用して取得できます。 |phoneNumber
firstName
lastName
| 文字列 | | gender | 列挙型。使用できる値は `female`、`male`、`other` | | birthday | 日付 | ### カスタムユーザー属性 \{#custom-user-attributes\} 独自のカスタム属性を設定することもできます。これらは通常、アプリの使用状況に関連しています。たとえば、フィットネスアプリであれば1週間あたりの運動回数、語学学習アプリであればユーザーの習熟度などが考えられます。セグメントで使用してターゲットを絞ったペイウォールやオファーを作成したり、アナリティクスで収益に最も影響するプロダクト指標を特定したりするのに活用できます。 ```typescript showLineNumbers try { await adapty.updateProfile({ codableCustomAttributes: { key_1: 'value_1', key_2: 2, }, }); } catch (error) { // handle `AdaptyError` } ``` 既存のキーを削除するには、`.withRemoved(customAttributeForKey:)` メソッドを使用します: ```typescript showLineNumbers try { // to remove a key, pass null as its value await adapty.updateProfile({ codableCustomAttributes: { key_1: null, key_2: null, }, }); } catch (error) { // handle `AdaptyError` } ``` 事前にどのカスタム属性が設定済みかを確認したい場合は、`AdaptyProfile` オブジェクトの `customAttributes` フィールドを使用してください。 :::warning ユーザー属性は複数のデバイスからいつでも送信される可能性があるため、`customAttributes` の値が最新でない場合があります。最後の同期以降にサーバー上の属性が変更されている可能性があります。 ::: ### 制限 \{#limits\} - ユーザーごとに最大30件のカスタム属性 - キー名は最大30文字。キー名には英数字および以下の文字を使用できます:`_` `-` `.` - 値は文字列または浮動小数点数で、最大50文字。 --- # File: react-native-listen-subscription-changes --- --- title: "React Native SDKでサブスクリプションステータスを確認する" description: "React NativeアプリでのAdaptyのユーザーサブスクリプションステータスの追跡と管理でカスタマーリテンションを向上させましょう。" --- Adaptyを使えば、サブスクリプションステータスの管理が簡単になります。プロダクトIDをコードに手動で記述する必要はありません。アクティブな[アクセスレベル](access-level)を確認するだけで、ユーザーのサブスクリプションステータスを手軽に把握できます。[AdaptyProfile](https://react-native.adapty.io/interfaces/adaptyprofile)オブジェクトです。通常、ユーザーがアプリのプレミアム機能にアクセスできるかどうかを判断するには、プロファイルのアクセスレベルステータスのみを確認すれば十分です。
`.getProfile`メソッドは常にAPIへのクエリを試みるため、最新の結果を提供します。何らかの理由(例:インターネット接続なし)でAdapty SDKがサーバーから情報を取得できない場合は、キャッシュのデータが返されます。また、Adapty SDKは`AdaptyProfile`キャッシュを定期的に更新し、情報をできる限り最新の状態に保ちます。
| `.getProfile()`メソッドはユーザープロファイルを返し、そこからアクセスレベルステータスを取得できます。1つのアプリに複数のアクセスレベルを設定することも可能です。例えば、ニュースアプリでトピックごとに独立したサブスクリプションを販売する場合、「sports」や「science」といったアクセスレベルを作成できます。ただし、ほとんどの場合はアクセスレベルは1つで十分なので、デフォルトの「premium」アクセスレベルをそのまま使用できます。 デフォルトの「premium」アクセスレベルを確認する例: ```typescript showLineNumbers try { const profile = await adapty.getProfile(); const isActive = profile.accessLevels?.["premium"]?.isActive; if (isActive) { // grant access to premium features } } catch (error) { // handle the error } ``` ### サブスクリプションステータスの更新をリッスンする \{#listening-for-subscription-status-updates\} ユーザーのサブスクリプションに変更があると、Adaptyはイベントを発火します。 Adaptyからメッセージを受け取るには、追加の設定が必要です。 ```typescript showLineNumbers // Create an "onLatestProfileLoad" event listener adapty.addEventListener('onLatestProfileLoad', profile => { // handle any changes to subscription state }); ``` アプリ起動時にもAdaptyはイベントを発火します。この場合、キャッシュされたサブスクリプションステータスが渡されます。 ### サブスクリプションステータスのキャッシュ \{#subscription-status-cache\} Adapty SDKに実装されたキャッシュは、プロファイルのサブスクリプションステータスを保存します。そのため、サーバーが利用できない場合でも、キャッシュされたデータからプロファイルのサブスクリプションステータスを取得できます。 ただし、キャッシュからの直接データ取得はできません。SDKは1分ごとにサーバーへ定期的にクエリを送信し、プロファイルに関する更新や変更を確認します。新しいトランザクションやその他の更新といった変更があった場合、サーバーとの同期を保つためにキャッシュへ反映されます。 --- # File: react-native-deal-with-att --- --- title: "Deal with ATT in React Native SDK" description: "Get started with Adapty on React Native to streamline subscription setup and management." --- アプリが AppTrackingTransparency フレームワークを使用しており、ユーザーにアプリトラッキング認証リクエストを表示する場合は、[認証ステータス](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/) を Adapty に送信する必要があります。 ```typescript showLineNumbers try { await adapty.updateProfile({ // you can also pass a string value (validated via tsc) if you prefer appTrackingTransparencyStatus: AppTrackingTransparencyStatus.Authorized, }); } catch (error) { // handle `AdaptyError` } ``` :::warning この値は変更されたらできるだけ早く送信することを強くお勧めします。そうすることで、設定済みのインテグレーションにタイムリーにデータが送信されます。 ::: --- # File: kids-mode-react-native --- --- title: "React Native SDKのキッズモード" description: "キッズモードを簡単に有効化してAppleとGoogleのポリシーに準拠。React Native SDKではIDFA、GAID、広告データは収集されません。" --- React Nativeアプリが子ども向けの場合、[Apple](https://developer.apple.com/kids/)および[Google](https://support.google.com/googleplay/android-developer/answer/9893335)のポリシーに従う必要があります。Adapty SDKを使用している場合、いくつかの簡単な手順でポリシーに準拠した設定を行い、アプリストアの審査を通過できます。 :::important iOS では、Kids Mode は `KidsMode` Swift パッケージトレイトを通じて有効化されます。これにより、IDFA、AdSupport、AppTrackingTransparency に関するすべてのコードがコンパイル時に除外されます。v4 SDK(Swift Package Manager 経由でネイティブ iOS SDK をインストール)と **Xcode 26** 以降が必要です。詳細は以下の [iOS Podfile の更新内容](#updates-in-your-ios-podfile) を参照してください。 ::: ## 何が必要ですか? \{#whats-required\} 以下の収集を無効にするよう、Adapty SDK を設定する必要があります: - [IDFA(広告識別子)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers)(iOS) - [Android 広告 ID(AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248)(Android) - [IP アドレス](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) また、カスタマーユーザー ID の取り扱いにも注意が必要です。`任意
デフォルト: `en`
|オンボーディングのローカライゼーション識別子です。マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードを指定してください。最初のサブタグは言語、2番目のサブタグは地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードとその推奨の使い方については、[ローカライゼーションとロケールコード](localizations-and-locale-codes)をご覧ください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。この設定を推奨します。ユーザーが常に最新のデータを受け取れるためです。
ただし、ユーザーがインターネット接続の不安定な環境にいると考えられる場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在すればそれを返すようにすることをご検討ください。この場合、ユーザーが最新データを受け取れないことがありますが、接続状況にかかわらず読み込み時間が短くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける目的で使用しても問題ありません。
キャッシュはアプリの再起動後も保持され、アプリの再インストール時または手動でクリアした場合にのみ削除されます。
Adapty SDK はオンボーディングをローカルに2層で保存します。1つは上記の定期更新されるキャッシュ、もう1つはフォールバックオンボーディングです。また、オンボーディングをより高速に取得するためにCDNを使用し、CDNに到達できない場合のためにスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンのオンボーディングを取得できるよう設計されています。
| | **loadTimeoutMs** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルフォールバックが返されます。
内部で複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間よりもわずかに遅くタイムアウトすることがあります。
| レスポンスパラメータ: | パラメータ | 説明 | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | [`AdaptyOnboarding`](https://react-native.adapty.io/interfaces/adaptyonboarding) オブジェクト。オンボーディングの識別子と設定、リモートコンフィグ、およびその他のプロパティを含みます。 | ## デフォルトオーディエンスのオンボーディングでフェッチを高速化する \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} 通常、オンボーディングはほぼ即座にフェッチされるため、このプロセスを高速化することを心配する必要はありません。ただし、オーディエンスやオンボーディングが多数あり、ユーザーのインターネット接続が不安定な場合、オンボーディングのフェッチに予想以上の時間がかかることがあります。そのような状況では、オンボーディングをまったく表示しないよりも、デフォルトのオンボーディングを表示してスムーズなユーザー体験を確保したいと思うかもしれません。 `getOnboardingForDefaultAudience` メソッドを使用することで、指定したプレースメントの **All Users** オーディエンス向けオンボーディングを取得できます。ただし、推奨されるアプローチは `getOnboarding` メソッドを使用してオンボーディングを取得することであり、詳細は上記の [オンボーディングの取得](#fetch-onboarding) セクションをご覧ください。 :::warning `getOnboardingForDefaultAudience` の代わりに `getOnboarding` の使用を検討してください。前者には重要な制限があります: - **互換性の問題**: 複数のアプリバージョンをサポートする際に問題が生じる可能性があり、後方互換性のある設計が必要になるか、古いバージョンで表示が崩れることを許容する必要があります。 - **パーソナライズなし**: 「全ユーザー」オーディエンス向けのコンテンツのみ表示され、国・アトリビューション・カスタム属性に基づくターゲティングは利用できません。 取得速度の向上がこれらのデメリットを上回る場合は、以下に示す `getOnboardingForDefaultAudience` を使用してください。そうでない場合は、[上記](#fetch-onboarding)で説明した `getOnboarding` を使用してください。 ::: ```typescript showLineNumbers try { const placementId = 'YOUR_PLACEMENT_ID'; const locale = 'en'; const onboarding = await adapty.getOnboardingForDefaultAudience(placementId, locale); // リクエストされたオンボーディング } catch (error) { // エラーを処理する } ``` パラメーター: | パラメータ | 必須/任意 | 説明 | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | 必須 | 対象の[プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
|オンボーディングのローカライズ識別子です。このパラメータは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードである必要があります。最初のサブタグは言語を、2つ目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードとその推奨される使い方については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを取得しようとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、このオプションを推奨します。
ただし、ユーザーがネットワーク接続の不安定な環境にいると想定される場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在すればそれを返すことを検討してください。この場合、ユーザーが受け取るデータが最新でない可能性はありますが、接続状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける目的で利用しても問題ありません。
キャッシュはアプリを再起動しても保持され、アプリのアンインストール時または手動でクリーンアップした場合にのみ削除されます。
Adapty SDK はオンボーディングをローカルに2つの層で保存します。1つは上記の定期更新キャッシュ、もう1つはフォールバックオンボーディングです。また、オンボーディングをより高速に取得するために CDN を使用し、CDN が利用できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な状況でも信頼性を確保しながら、常に最新バージョンのオンボーディングを取得できるよう設計されています。
| --- # File: react-native-present-onboardings --- --- title: "React Native SDKでオンボーディングを表示する" description: "React Nativeでオンボーディングを表示してコンバージョンと収益を向上させる方法を解説します。" --- :::warning **オンボーディングは SDK v4 で非推奨となり、将来のリリースで削除される予定です。** バグ修正や改善は行われません。代わりに[フロー](react-native-get-pb-paywalls)を使用してください。オンボーディングは WebView 内で動作しますが、フローはデバイス上でネイティブにレンダリングされるため、よりスムーズなアニメーション、一貫したネイティブの外観、高速な読み込み、WebView ランタイムへの依存がありません。詳しくは[フローとペイウォールの取得](react-native-get-pb-paywalls)および[フローとペイウォールの表示](react-native-present-paywalls)をご覧ください。 ::: ペイウォールビルダーを使ってオンボーディングをカスタマイズした場合、モバイルアプリのコード上でレンダリング処理を実装しなくても、ユーザーに表示できます。このようなオンボーディングには、表示する内容と表示方法の両方が含まれています。 始める前に、以下を確認してください: 1. [Adapty React Native SDK](sdk-installation-reactnative) 3.8.0 以降をインストール済みであること。 2. [オンボーディングを作成](create-onboarding)済みであること。 3. オンボーディングを[プレースメント](placements)に追加済みであること。 Adapty React Native SDK では、オンボーディングを表示する方法が2つあります: - **Reactコンポーネント**: 埋め込み型コンポーネントとして、アプリのアーキテクチャやナビゲーションシステムに統合できます。 - **モーダル表示** ## React コンポーネント \{#react-component\} `AdaptyOnboardingView` コンポーネントを React Native のコンポーネント階層に直接組み込むことで、既存のコンポーネントツリーにオンボーディングを埋め込めます。埋め込み型コンポーネントを使うと、アプリのアーキテクチャやナビゲーションシステムとシームレスに統合できます。 :::note Android では、視覚的なレンダリングアーティファクトを避けるために、`AdaptyOnboardingView` の追加設定を推奨します。詳しくは [Android でシステム UI がオンボーディングコンテンツと重なる場合](#system-ui-overlaps-onboarding-content-on-android) を参照してください。 :::
このIDをコード内で使用し、カスタムアクションとして処理できます。たとえば、ユーザーが **Login** や **Allow notifications** のようなカスタムボタンをタップすると、ビルダーの **Action ID** と一致する `actionId` パラメーターでイベントハンドラーが呼び出されます。"allowNotifications" のような独自のIDを作成することも可能です。
:::important
ユーザーがオンボーディングを閉じたときの処理は、ご自身で実装する必要があります。たとえば、オンボーディング自体の表示を停止する処理が必要です。
:::
2. サブスクリプショングループ名をクリックすると、**Subscriptions** セクションにプロダクトの一覧が表示されます。
3. テスト中のプロダクトが **Ready to Submit** になっていることを確認します。
4. 表示されているプロダクト ID と、Adapty ダッシュボードの [**Products**](https://app.adapty.io/products) タブにある ID を照合します。ID が一致しない場合は、表からプロダクト ID をコピーして、Adapty ダッシュボードでその ID を使って[プロダクトを作成](create-product)してください。
## ステップ 3. プロダクトの提供状況を確認する \{#step-4-check-product-availability\}
1. **App Store Connect** に戻り、同じ **Subscriptions** セクションを開きます。
2. サブスクリプショングループ名をクリックしてプロダクト一覧を表示します。
3. テスト中のプロダクトを選択します。
4. **Availability** セクションまでスクロールし、必要な国・地域がすべて表示されていることを確認します。
## ステップ 4. プロダクトの価格を確認する \{#step-5-check-product-prices\}
1. 再度 **App Store Connect** の **Monetization** → **Subscriptions** セクションに移動します。
2. サブスクリプショングループ名をクリックします。
3. テスト中のプロダクトを選択します。
4. **Subscription Pricing** までスクロールし、**Current Pricing for New Subscribers** セクションを展開します。
5. 必要な価格がすべて表示されていることを確認します。
## ステップ 5. アプリの有料ステータス・銀行口座・税務書類がアクティブか確認する \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. [**App Store Connect**](https://appstoreconnect.apple.com/) のホームページで **Business** をクリックします。
2. 会社名を選択します。
3. 下にスクロールして、**Paid Apps Agreement**、**Bank Account**、**Tax forms** がすべて **Active** になっていることを確認します。
これらの手順を実行することで、`InvalidProductIdentifiers` 警告を解消し、プロダクトをストアで公開できるようになるはずです。
## ステップ 6. スタックしているプロダクトを再作成する \{#step-6-recreate-the-product-if-its-stuck\}
ステップ 1〜5 をすべてクリアしている場合(`Approved` ステータス、バンドル ID 一致、有効な API キー)でも、SDK が `1000 noProductIDsFound` を返すことがあります。その場合、プロダクトが Apple のレジストリ内でスタックしている可能性があります。App Store Connect の UI 上にプロダクトが存在しているにもかかわらず、StoreKit のルックアップパスに公開されていない状態になることが稀にあります。
App Store Connect でそのプロダクトを削除し、同じプロダクト ID で再作成してください。再作成後、反映されるまで最大 24 時間かかる場合があります。
---
# File: cantMakePayments-react-native
---
---
title: "React Native SDKにおけるCode-1003 cantMakePaymentエラーの修正"
description: "AdaptyでサブスクリプションManagerする際の決済エラーを解決する方法。"
---
1003エラー(`cantMakePayments`)は、このデバイスでアプリ内課金ができないことを示しています。
`cantMakePayments`エラーが発生している場合、通常は以下のいずれかの原因が考えられます:
- デバイスの制限:このエラーはAdaptyとは無関係です。以下の解決方法を参照してください。
- オブザーバーモードの設定:`makePurchase`メソッドとオブザーバーモードは同時に使用できません。以下のセクションを参照してください。
## 問題:デバイスの制限 \{#issue-device-restrictions\}
| 問題 | 解決方法 |
|-----------------------------|---------------------------------------------------------|
| スクリーンタイムの制限 | [スクリーンタイム](https://support.apple.com/en-us/102470)でアプリ内課金の制限を無効にする |
| アカウントの停止 | Appleサポートに連絡してアカウントの問題を解決する |
| 地域の制限 | 対応地域のApp Storeアカウントを使用する |
## 問題:オブザーバーモードとmakePurchaseの併用 \{#issue-using-both-observer-mode-and-makepurchase\}
購入処理に`makePurchase`を使用している場合、オブザーバーモードを使用する必要はありません。[オブザーバーモード](observer-vs-full-mode)が必要なのは、購入ロジックを自分で実装する場合のみです。
したがって、`makePurchase`を使用している場合は、SDK有効化コードからオブザーバーモードの有効化を安全に削除できます。
---
# File: migration-to-react-native-sdk-v4
---
---
title: "Adapty React Native SDK を v. 4.0 に移行する"
description: "ペイウォール API をフロー API に置き換えることで、Adapty React Native SDK v4.0(ベータ版)に移行します。フロービルダーとペイウォールビルダーの両方に対応しています。"
---
Adapty React Native SDK 4.0(ベータ版)ではフローが導入され、ペイウォール API の名称が変更されました。新しい API はフロービルダーと既存のペイウォールビルダーの両方に対応しており、Adapty ダッシュボード側での設定変更は不要です。
## クイックリファレンス \{#quick-reference\}
| v3 | v4 |
|---|---|
| `adapty.getPaywall(placementId, locale?, params?)` | `adapty.getFlow(placementId, params?)` |
| `adapty.getPaywallForDefaultAudience(placementId, locale?, params?)` | `adapty.getFlowForDefaultAudience(placementId, params?)` |
| `adapty.getPaywallProducts(paywall)` | `adapty.getPaywallProducts(flow)` |
| `adapty.logShowPaywall(paywall)` | `adapty.logShowFlow(flow)` |
| `AdaptyPaywall`(型) | `AdaptyFlow` |
| `createPaywallView(paywall)` | `createFlowView(flow)` |
| `AdaptyPaywallView`(コンポーネント) | `AdaptyFlowView` |
| `EventHandlers`(型) | `FlowEventHandlers` |
| `onPaywallShown` | `onAppeared` |
| `onPaywallClosed` | `onDisappeared` |
| `onRenderingFailed` | `onError` |
`AdaptyPaywallProduct` はその名前を維持しています — プロダクトは引き続きフローに属しており、`getPaywallProducts` は `AdaptyFlow` を引数として受け取るようになりました。`getFlow` および `getFlowForDefaultAudience` メソッドは `locale` パラメータを受け取らなくなりました。ビューメソッドの `present`、`dismiss`、`setEventHandlers`、`showDialog`、およびイベントハンドラの `onCloseButtonPress`、`onUrlPress`、`onCustomAction`、`onProductSelected`、`onPurchaseStarted`、`onPurchaseCompleted`、`onPurchaseFailed`、`onRestoreStarted`、`onRestoreCompleted`、`onRestoreFailed`、`onLoadingProductsFailed`、`onWebPaymentNavigationFinished`、`onAndroidSystemBack` はいずれも v3 と同じ名前を維持しています。デフォルトの動作に一部変更があります — 詳細は[デフォルト動作の変更](#default-behavior-changes)を参照してください。
## 最低 iOS バージョン \{#minimum-ios-version\}
Adapty React Native SDK 4.0 では、iOS の最低デプロイメントターゲットが iOS 13.0 から **iOS 15.0** に引き上げられました。アップグレードの前に、iOS デプロイメントターゲットを 15.0 以降に設定してください。
## インストール \{#installation\}
### パッケージのアップデート \{#update-the-package\}
v4.0 はプレリリース版のため、正確なバージョンを指定してインストールしてください。npm はキャレット/チルダの範囲指定ではプレリリース版を選択しません。
```bash showLineNumbers
npm install react-native-adapty@4.0.0
# or
yarn add react-native-adapty@4.0.0
```
### iOS:ネイティブ SDK が Swift Package Manager 経由で提供されるようになりました \{#ios-native-sdks-now-come-through-swift-package-manager\}
[CocoaPods の spec リポジトリは 2026年12月に読み取り専用になります](https://blog.cocoapods.org/CocoaPods-Specs-Repo/)。そのため、v4 以降、ネイティブの `Adapty`、`AdaptyUI`、`AdaptyPlugin` SDK は **CocoaPods のサブ依存として取得されなくなります** — podspec は **Swift Package Manager** 経由(`spm_dependency` ヘルパーを使用)でこれらを取得します。これにより、以下の 2 点が必要になります:
- **React Native 0.75 以降** — `spm_dependency` podspec ヘルパーに必要です。古いバージョンでは `pod install` が明示的なエラーで失敗します。先に React Native をアップグレードするか、`react-native-adapty` 3.x を使用してください。
- **ダイナミックフレームワーク** — SPM の依存関係にはダイナミックリンクが必要です。有効にする方法は Expo とベアの React Native で異なります。
#### Expo
[`expo-build-properties`](https://docs.expo.dev/versions/latest/sdk/build-properties/) 設定プラグインを追加し、`app.json`(または `app.config.js`)で iOS フレームワークをダイナミックに設定します:
```json showLineNumbers title="app.json"
{
"expo": {
"plugins": [
[
"expo-build-properties",
{
"ios": {
"useFrameworks": "dynamic"
}
}
]
]
}
}
```
次に、プラグインをインストールしてネイティブプロジェクトを再生成します:
```bash showLineNumbers
npx expo install expo-build-properties
npx expo prebuild --clean
```
#### Bare React Native \{#bare-react-native\}
iOS ターゲットにダイナミックフレームワークを追加し、pod を再インストールします:
```ruby showLineNumbers title="ios/Podfile"
use_frameworks! :linkage => :dynamic
```
```bash showLineNumbers
cd ios && pod install --repo-update
```
以前に `Adapty`、`AdaptyUI`、または `AdaptyPlugin` を CocoaPods のサブ依存関係として追加していた場合は、まず `Podfile` から `pod 'Adapty'`、`pod 'AdaptyUI'`、`pod 'AdaptyPlugin'` の行を削除してください。
:::warning
デフォルトの静的リンクからダイナミックフレームワークへの切り替えは、モジュラーヘッダーをまだサポートしていないライブラリと競合する可能性があり、Flipper とは互換性がありません。ビルドの問題が発生した場合は、[Swift Package Manager と React Native ライブラリの統合に関する記事](https://www.callstack.com/blog/integrating-swift-package-manager-with-react-native-libraries)を参照してください。
:::
完全なセットアップ手順については、[Adapty SDK のインストール](sdk-installation-reactnative)を参照してください。
## フローの取得 \{#fetching-flows\}
### getPaywall → getFlow
返り値の型が `AdaptyPaywall` から `AdaptyFlow` に変更され、`locale` パラメータが削除されました。フローをレンダリングする際、ロケールは自動的に解決されます。カスタムペイウォールの場合、すべてのロケールは `flow.remoteConfigs` で返されます。
```diff showLineNumbers
- const paywall = await adapty.getPaywall('YOUR_PLACEMENT_ID', 'en');
+ const flow = await adapty.getFlow('YOUR_PLACEMENT_ID');
```
`getPaywallForDefaultAudience` も同様にリネームされます。
```diff showLineNumbers
- const paywall = await adapty.getPaywallForDefaultAudience('YOUR_PLACEMENT_ID', 'en');
+ const flow = await adapty.getFlowForDefaultAudience('YOUR_PLACEMENT_ID');
```
### getPaywallProducts(paywall) → getPaywallProducts(flow)
`getPaywallProducts` は名前はそのままですが、`AdaptyFlow` を受け取るようになりました:
```diff showLineNumbers
- const products = await adapty.getPaywallProducts(paywall);
+ const products = await adapty.getPaywallProducts(flow);
```
## データモデル \{#data-model\}
`getFlow` は `AdaptyPaywall` の代わりに `AdaptyFlow` を返し、オブジェクトの構造が変わりました:
| v3 `AdaptyPaywall` フィールド | v4 `AdaptyFlow` フィールド | 対応方法 |
|---|---|---|
| `remoteConfig?`(単一) | `remoteConfigs?: AdaptyRemoteConfig[]`(配列) | フローは設定された言語ごとにリモートコンフィグを1つ持ちます。ユーザーに合ったものを取得するには `flow.remoteConfigs?.find((c) => c.lang === 'en')` を使用してください。 |
| `products` | `flow.paywalls[i].productIdentifiers` | プロダクト識別子はフロー全体ではなく、各フローバリエーションに移動しました。 |
| `webPurchaseUrl?` | `flow.paywalls[i].webPurchaseUrl` | フローからペイウォールの各バリエーションに移動しました。 |
| `version?: number` | `flowVersionId?: string` | 名前が変更され、型も `number` から `string` になりました。 |
| `hasViewConfiguration` | 削除 | コードから `hasViewConfiguration` のチェックをすべて削除してください。 |
| `requestLocale` | 削除 | ロケールはモデルに含まれなくなりました。 |
| _(新規)_ | `paywalls: AdaptyFlowPaywall[]` | 各エントリはフロー内のペイウォールバリエーション1つに対応します。 |
| _(新規)_ | `responseCreatedAt: number` | サーバーレスポンスのタイムスタンプ(ミリ秒単位)。 |
プロダクト識別子がフローから各バリアントに移動しました:
```diff showLineNumbers
- const ids = paywall.products;
+ const ids = flow.paywalls[0].productIdentifiers;
```
## Webペイウォールのメソッド \{#web-paywall-methods\}
`openWebPaywall` と `createWebPaywallUrl` はメソッド名を変更しませんが、第1引数が `AdaptyPaywall` の代わりに `AdaptyFlowPaywall`(フローのバリアント)になりました。引き続き `AdaptyPaywallProduct` も渡せます。
```diff showLineNumbers
const flow = await adapty.getFlow('YOUR_PLACEMENT_ID');
- await adapty.openWebPaywall(paywall);
+ await adapty.openWebPaywall(flow.paywalls[0]);
```
## フローのビュー数を計測する \{#tracking-flow-views\}
### logShowPaywall → logShowFlow
`logShowPaywall` は `logShowFlow` に名称変更され、`AdaptyFlow` を受け取るようになりました。イベントは引き続き同じバリエーションに対してログが記録されるため、既存のファネルや A/B テストの指標はダッシュボードの変更なしに引き続き機能します。
```diff showLineNumbers
- await adapty.logShowPaywall(paywall);
+ await adapty.logShowFlow(flow);
```
v3 と同様に、[フロービルダー](adapty-flow-builder)や[ペイウォールビルダー](adapty-paywall-builder)でレンダリングされたフローやペイウォールを表示する際は、このメソッドを呼び出す必要はありません。Adapty がそれらのビューを自動的に追跡します。
## フローの表示 \{#displaying-flows\}
### createPaywallView → createFlowView
ファクトリー関数の名前を変更し、`AdaptyFlow` を渡します。返されるコントローラーのメソッド(`present`、`dismiss`、`setEventHandlers`、`showDialog`)は変わりません:
```diff showLineNumbers
- import { createPaywallView } from 'react-native-adapty';
+ import { createFlowView } from 'react-native-adapty';
- const view = await createPaywallView(paywall);
+ const view = await createFlowView(flow);
await view.present();
```
### AdaptyPaywallView → AdaptyFlowView
Reactコンポーネントでレンダリングする場合は、名前を変更して `flow` プロップを渡してください:
```diff showLineNumbers
- import { AdaptyPaywallView } from 'react-native-adapty';
+ import { AdaptyFlowView } from 'react-native-adapty';
- ```diff showLineNumbers - subscriptionDetails?: AdaptySubscriptionDetails; + subscription?: AdaptySubscriptionDetails; ``` 2. [AdaptySubscriptionDetails](https://react-native.adapty.io/interfaces/adaptysubscriptiondetails): - `promotionalOffer` は削除されました。プロモーションオファーは、利用可能な場合にのみ `offer` プロパティ経由で提供されるようになりました。この場合、`offer?.identifier?.type` は `'promotional'` になります。 - `introductoryOfferEligibility` は削除されました(オファーはユーザーが対象の場合のみ返されます)。 - `offerId` は削除されました。オファー ID は `AdaptySubscriptionOffer.identifier` に格納されるようになりました。 - `offerTags` は `AdaptySubscriptionOffer.android` に移動されました。
```diff showLineNumbers - introductoryOffers?: AdaptyDiscountPhase[]; + offer?: AdaptySubscriptionOffer; ios?: { - promotionalOffer?: AdaptyDiscountPhase; subscriptionGroupIdentifier?: string; }; android?: { - offerId?: string; basePlanId: string; - introductoryOfferEligibility: OfferEligibility; - offerTags?: string[]; renewalType?: 'prepaid' | 'autorenewable'; }; } ``` 3. [AdaptyDiscountPhase](https://react-native.adapty.io/interfaces/adaptydiscountphase): - `identifier` フィールドが `AdaptyDiscountPhase` モデルから削除されました。オファー識別子は `AdaptySubscriptionOffer.identifier` に格納されるようになりました。
```diff showLineNumbers - ios?: { - readonly identifier?: string; - }; ``` ### 削除されたモデル \{#remove-models\} 1. `AttributionSource`: - `AttributionSource` が以前使用されていた箇所では、文字列が使用されるようになりました。 2. `OfferEligibility`: - このモデルは不要になったため削除されました。オファーはユーザーが対象の場合にのみ返されるようになりました。 ## `getProductsIntroductoryOfferEligibility` メソッドを削除する \{#remove-getproductsintroductoryoffereligibility-method\} Adapty SDK 3.3.1 より前は、プロダクトオブジェクトにはユーザーが対象外であってもオファーが常に含まれていました。そのため、オファーを使用する前に手動で対象資格を確認する必要がありました。 バージョン 3.3.1 以降、プロダクトオブジェクトにはユーザーが対象の場合にのみオファーが含まれます。これにより、オファーが存在する場合はユーザーが対象であると仮定できるため、処理が簡素化されます。 ## 購入処理を更新する \{#update-making-purchase\} 以前のバージョンでは、キャンセルされた購入と保留中の購入はエラーとして扱われ、それぞれコード `2: 'paymentCancelled'` と `25: 'pendingPurchase'` が返されていました。 バージョン 3.3.1 以降、キャンセルされた購入と保留中の購入は成功した結果として扱われ、それに応じて処理する必要があります。 ```typescript showLineNumbers try { const purchaseResult = await adapty.makePurchase(product); switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Grant access to the paid features } break; case 'user_cancelled': // Handle the case where the user canceled the purchase break; case 'pending': // Handle deferred purchases (e.g., the user will pay offline with cash) break; } } catch (error) { // Handle the error } ``` ## ペイウォールビルダーのペイウォール表示を更新する \{#update-paywall-builder-paywall-presentation\} 更新されたコード例については、[React Native でのペイウォールビルダーペイウォールの表示](react-native-present-paywalls)ドキュメントをご参照ください。 ```diff showLineNumbers - import { createPaywallView } from '@adapty/react-native-ui'; + import { createPaywallView } from 'react-native-adapty/dist/ui'; const view = await createPaywallView(paywall); view.registerEventHandlers(); // handle close press, etc try { await view.present(); } catch (error) { // handle the error } ``` ## 開発者定義タイマーの実装を更新する \{#update-developer-defined-timer-implementation\} `timerInfo` パラメーターを `customTimers` に名前変更してください。 ```diff showLineNumbers - let timerInfo = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) } + let customTimers = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) } //and then you can pass it to createPaywallView as follows: - view = await createPaywallView(paywall, { timerInfo }) + view = await createPaywallView(paywall, { customTimers }) ``` ## ペイウォールビルダーの購入イベントを修正する \{#modify-paywall-builder-purchase-events\} 以前の動作: - キャンセルされた購入は `onPurchaseCancelled` コールバックをトリガーしていました。 - 保留中の購入はエラーコード `25: 'pendingPurchase'` を返していました。 現在の動作: - 両方とも `onPurchaseCompleted` コールバックで処理されます。 #### 移行手順: 1. `onPurchaseCancelled` コールバックを削除する。 2. `25: 'pendingPurchase'` のエラーコード処理を削除する。 3. `onPurchaseCompleted` コールバックを更新する。 ```typescript showLineNumbers const view = await createPaywallView(paywall); const unsubscribe = view.registerEventHandlers({ // ... other optional callbacks onPurchaseCompleted(purchaseResult, product) { switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Grant access to the paid features } break; // highlight-start case 'user_cancelled': // Handle the case where the user canceled the purchase break; case 'pending': // Handle deferred purchases (e.g., the user will pay offline with cash) break; // highlight-end } // highlight-start return purchaseResult.type !== 'user_cancelled'; // highlight-end }, }); ``` ## ペイウォールビルダーのカスタムアクションイベントを修正する \{#modify-paywall-builder-custom-action-events\} 削除されたコールバック: - `onAction` - `onCustomEvent` 追加されたコールバック: - 新しい `onCustomAction(actionId)` コールバック。カスタムアクションに使用してください。 ## `onProductSelected` コールバックを修正する \{#modify-onproductselected-callback\} 以前は、`onProductSelected` は `product` オブジェクトを必要としていました。現在は文字列として `productId` を必要とします。 ## `updateProfile` メソッドからサードパーティ連携パラメーターを削除する \{#remove-third-party-integration-parameters-from-updateprofile-method\} サードパーティ連携の識別子は、`setIntegrationIdentifier` メソッドを使用して設定するようになりました。`updateProfile` メソッドはこれらを受け付けなくなりました。 ## サードパーティ連携 SDK の設定を更新する \{#update-third-party-integration-sdk-configuration\} Adapty React Native SDK 3.3.1 以降で連携が正しく機能するよう、以下のセクションで説明する各連携の SDK 設定を更新してください。 また、アトリビューション識別子の取得に `AttributionSource` を使用していた場合は、必要な識別子を文字列として提供するようにコードを変更してください。 ### Adjust \{#adjust\} 以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[Adjust 連携の SDK 設定](adjust#connect-your-app-to-adjust)をご確認ください。 ```diff showLineNumbers import { Adjust, AdjustConfig } from "react-native-adjust"; import { adapty } from "react-native-adapty"; var adjustConfig = new AdjustConfig(appToken, environment); // Before submiting Adjust config... adjustConfig.setAttributionCallbackListener(attribution => { // Make sure Adapty SDK is activated at this point // You may want to lock this thread awaiting of `activate` adapty.updateAttribution(attribution, "adjust"); }); // ... Adjust.create(adjustConfig); + Adjust.getAdid((adid) => { + if (adid) + adapty.setIntegrationIdentifier("adjust_device_id", adid); + }); ``` ### AirBridge \{#airbridge\} 以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[AirBridge 連携の SDK 設定](airbridge#connect-your-app-to-airbridge)をご確認ください。 ```diff showLineNumbers import Airbridge from 'airbridge-react-native-sdk'; import { adapty } from 'react-native-adapty'; try { const deviceId = await Airbridge.state.deviceUUID(); - await adapty.updateProfile({ - airbridgeDeviceId: deviceId, - }); + await adapty.setIntegrationIdentifier("airbridge_device_id", deviceId); } catch (error) { // handle `AdaptyError` } ``` ### Amplitude \{#amplitude\} 以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[Amplitude 連携の SDK 設定](amplitude#sdk-configuration)をご確認ください。 ```diff showLineNumbers import { adapty } from 'react-native-adapty'; try { - await adapty.updateProfile({ - amplitudeDeviceId: deviceId, - amplitudeUserId: userId, - }); + await adapty.setIntegrationIdentifier("amplitude_device_id", deviceId); + await adapty.setIntegrationIdentifier("amplitude_user_id", userId); } catch (error) { // handle `AdaptyError` } ``` ### AppMetrica \{#appmetrica\} 以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[AppMetrica 連携の SDK 設定](appmetrica#sdk-configuration)をご確認ください。 ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import AppMetrica, { DEVICE_ID_KEY, StartupParams, StartupParamsReason } from '@appmetrica/react-native-analytics'; // ... const startupParamsCallback = async ( params?: StartupParams, reason?: StartupParamsReason ) => { const deviceId = params?.deviceId if (deviceId) { try { - await adapty.updateProfile({ - appmetricaProfileId: 'YOUR_ADAPTY_CUSTOMER_USER_ID', - appmetricaDeviceId: deviceId, - }); + await adapty.setIntegrationIdentifier("appmetrica_profile_id", 'YOUR_ADAPTY_CUSTOMER_USER_ID'); + await adapty.setIntegrationIdentifier("appmetrica_device_id", deviceId); } catch (error) { // handle `AdaptyError` } } } AppMetrica.requestStartupParams(startupParamsCallback, [DEVICE_ID_KEY]) ``` ### AppsFlyer \{#appsflyer\} 以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[AppsFlyer 連携の SDK 設定](appsflyer#connect-your-app-to-appsflyer)をご確認ください。 ```diff showLineNumbers import { adapty, AttributionSource } from 'react-native-adapty'; import appsFlyer from 'react-native-appsflyer'; appsFlyer.onInstallConversionData(installData => { try { - const networkUserId = appsFlyer.getAppsFlyerUID(); - adapty.updateAttribution(installData, AttributionSource.AppsFlyer, networkUserId); + const uid = appsFlyer.getAppsFlyerUID(); + adapty.setIntegrationIdentifier("appsflyer_id", uid); + adapty.updateAttribution(installData, "appsflyer"); } catch (error) { // handle the error } }); // ... appsFlyer.initSdk(/*...*/); ``` ### Branch \{#branch\} 以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[Branch 連携の SDK 設定](branch#connect-your-app-to-branch)をご確認ください。 ```diff showLineNumbers import { adapty, AttributionSource } from 'react-native-adapty'; import branch from 'react-native-branch'; branch.subscribe({ enComplete: ({ params, }) => { - adapty.updateAttribution(params, AttributionSource.Branch); + adapty.updateAttribution(params, "branch"); }, }); ``` ### Facebook Ads \{#facebook-ads\} 以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[Facebook Ads 連携の SDK 設定](facebook-ads#connect-your-app-to-facebook-ads)をご確認ください。 ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import { AppEventsLogger } from 'react-native-fbsdk-next'; try { const anonymousId = await AppEventsLogger.getAnonymousID(); - await adapty.updateProfile({ - facebookAnonymousId: anonymousId, - }); + await adapty.setIntegrationIdentifier("facebook_anonymous_id", anonymousId); } catch (error) { // handle `AdaptyError` } ``` ### Firebase と Google Analytics \{#firebase-and-google-analytics\} 以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[Firebase と Google Analytics 連携の SDK 設定](firebase-and-google-analytics)をご確認ください。 ```diff showLineNumbers import analytics from '@react-native-firebase/analytics'; import { adapty } from 'react-native-adapty'; try { const appInstanceId = await analytics().getAppInstanceId(); - await adapty.updateProfile({ - firebaseAppInstanceId: appInstanceId, - }); + await adapty.setIntegrationIdentifier("firebase_app_instance_id", appInstanceId); } catch (error) { // handle `AdaptyError` } ``` ### Mixpanel \{#mixpanel\} 以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[Mixpanel 連携の SDK 設定](mixpanel#sdk-configuration)をご確認ください。 ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import { Mixpanel } from 'mixpanel-react-native'; // ... try { - await adapty.updateProfile({ - mixpanelUserId: mixpanelUserId, - }); + await adapty.setIntegrationIdentifier("mixpanel_user_id", mixpanelUserId); } catch (error) { // handle `AdaptyError` } ``` ### OneSignal \{#onesignal\} 以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[OneSignal 連携の SDK 設定](onesignal#sdk-configuration)をご確認ください。
:::important
**次のステップは、App StoreやGoogle Playにすでにプロダクトがあるかどうかによって異なります:**
:::
5. **Save & Continue** をクリックし、**App Store** または **Google Play** タブに切り替えてストア向けのプロダクト詳細を入力します。
このペイウォールはアプリコードで描画します。
アプリのコードにはプレースメント ID のみをハードコードします。どのペイウォールを表示するか、どのプロダクトを販売するか、リモートコンフィグの内容はすべて Adapty ダッシュボードで設定でき、アプリを更新することなくいつでも変更できます。
:::tip
Adaptyでは、さまざまなユーザーグループに異なるペイウォールを表示し、パフォーマンスを分析できます。[オーディエンス](audience)と[A/B テスト](ab-tests)について詳しくはこちらをご覧ください。
:::
## 次のステップ \{#next-steps\}
Adaptyへのオンボーディングが完了しました!これでアプリ内課金を伸ばす準備が整いました。
本番リリースの準備をしましょう:
または、以下に進むこともできます:
- **[A/Bテスト](ab-tests)**:価格、サブスクリプション期間、トライアル期間、ビジュアル要素をさまざまに試して、最も効果的な組み合わせを見つけましょう。
- **[アナリティクス](how-adapty-analytics-works)**:詳細なマネタイズ指標を分析し、ユーザー行動を理解して収益パフォーマンスを最適化しましょう。
- **インテグレーション**:Adaptyはサブスクリプションイベントを[Amplitude](amplitude)、[AppsFlyer](appsflyer)、[Adjust](adjust)、[Branch](branch)、[Mixpanel](mixpanel)、[Facebook Ads](facebook-ads)、[AppMetrica](appmetrica)、カスタム[Webhook](webhook)などのサードパーティ分析・アトリビューションツールに[サブスクリプションイベント](events)として送信します。
:::tip
ご質問やお困りのことがあれば、[サポートフォーラム](https://adapty.featurebase.app/)をご覧ください。よくある質問への回答を見つけたり、ご自身の質問を投稿することができます。チームとコミュニティがサポートいたします!
:::
---
# File: release-checklist
---
---
title: "リリースチェックリスト"
description: "Adaptyのリリースチェックリストに従って、スムーズなアプリのアップデートプロセスを確保しましょう。"
---
Adaptyをご利用いただきありがとうございます!実装がうまくいったことを願っています。このガイドでは、アプリをストアに公開する準備が整っているか確認するための手順を説明します。これにより、マネタイゼーションフローが正しく機能していることを安心して確認できます。
## 事前確認事項 \{#pre-flight-essentials\}
バリデーションを始める前に必要なもの:
- サンドボックスアカウントを持つ実機デバイス
- Adapty ダッシュボードへのアクセス
- App Store Connect / Google Play Console へのアクセス
:::note
サンドボックス購入はシミュレーターでも実行できますが、支払いダイアログや生体認証プロンプトを含むすべてのフローを完全にテストするには実機デバイスが必要です。
:::
## 共通バリデーション \{#universal-validations\}
- [ ] **ストア接続**: AdaptyをApp StoreおよびGoogle Playに接続していることを確認してください:
- [ ] [App Store](initial_ios)
- [ ] [Google Play](initial-android)
- [ ] **サブスクリプションイベントの配信**: サーバー通知が設定されていることを確認してください:
- [ ] [App Serverサーバー通知](enable-app-store-server-notifications)
- [ ] [リアルタイム開発者通知(RTDN)](enable-real-time-developer-notifications-rtdn)
- [ ] **プロファイルの識別**: ユーザー識別ロジックを検証し、購入が正しいプロファイルに紐付けられていることを確認してください:
- [ ] [アプリコードの識別ロジックがユースケースに合っているか確認する](ios-quickstart-identify)
- [ ] [ユーザープロファイル間で有料アクセスを共有するための親/継承ロジックを理解しているか確認する](sharing-paid-access-between-user-accounts)
- [ ] **オファー**: アプリにApp Storeのプロモーションオファーがある場合、[アプリ内購入キー](app-store-connection-configuration#step-4-for-trials-and-special-offers--set-up-promotional-offers)をメインフィールドと **App Store promotional offers** セクションの両方に追加していることを確認してください。
- [ ] **データ収集**: プライバシーへの準拠を確保してください:
- [ ] GDPRやCCPAなどのプライバシー規制に準拠する必要がある場合、またはアプリが子供向けの場合は、[IDFAおよびIPの収集と共有を有効にするかどうか](sdk-installation-ios#data-policies)を制御してください。
- [ ] アプリがAppTrackingTransparencyを使用している場合は、[認証ステータスをAdaptyに送信](ios-deal-with-att)していることを確認してください。
- [ ] **プライバシーラベル**: Adaptyが収集するデータとレビューに必要なフラグについては、[詳細はこちら](apple-app-privacy)をご覧ください。
## 購入バリデーション \{#purchase-validations\}
:::tip
ご質問やお困りのことがあれば、[サポートフォーラム](https://adapty.featurebase.app/)をご覧ください。よくある質問への回答を見つけたり、ご自身の質問を投稿することができます。チームとコミュニティがサポートいたします!
:::
公開前に、アプリ内購入が正しく機能し、ペイウォールがストアレビューの準備ができていることを確認してください。
アプリ内購入のバリデーション方法は、実装方法によって異なります:
- Adapty ペイウォールビルダーで作成したペイウォールを表示する
- 独自のペイウォールを実装し、その中で `makePurchase` メソッドを使用して購入を処理する
- オブザーバーモードでAdaptyを使用する(Adapty ペイウォールビルダーまたはカスタムペイウォールのどちらでも)
実施可能ですが、フルモードに比べて追加の実装や設定が大幅に必要になります。
| ✅ | | **実装にかかる時間** |分析・連携のみ:1時間未満
A/B テストあり:十分なテストを含めて最大1週間
| 数時間 | ## オブザーバーモードの仕組み \{#how-observer-mode-works\} オブザーバーモードでは、Apple/Googleからの新しいトランザクションをAdapty SDKに報告し、Adapty SDKがそれをAdaptyバックエンドに転送します。有料コンテンツへのアクセス管理、トランザクションの完了、更新処理、請求問題への対応などは、すべてお客様が担当します。 ## オブザーバーモードのセットアップ方法 \{#how-to-set-up-observer-mode\} 1. Adaptyの初期連携を[Google Play](initial-android)および[App Store](initial_ios)と設定します。 2. Adapty SDKの設定時に`observerMode`パラメーターを`true`に設定してオブザーバーモードを有効化します。各プラットフォームの設定手順([iOS](sdk-installation-ios#activate-adapty-module-of-adapty-sdk)、[Android](sdk-installation-android#activate-adapty-module-of-adapty-sdk)、[React Native](sdk-installation-reactnative)、[Flutter](sdk-installation-flutter#activate-adapty-module-of-adapty-sdk)、[Kotlin Multiplatform](sdk-installation-kotlin-multiplatform#activate-adapty-sdk)、[Unity](sdk-installation-unity#activate-adapty-module-of-adapty-sdk))に従ってください。 3. iOSおよびiOSベースのクロスプラットフォームフレームワークの場合、既存の購入インフラからAdaptyへ[トランザクションを報告](report-transactions-observer-mode)します。 4. (任意)サードパーティ連携を利用する場合は、[サードパーティ連携の設定](configuration)トピックの手順に従って設定してください。 :::warning オブザーバーモードで動作している場合、Adapty SDKはトランザクションを完了させません。この処理はお客様自身で行う必要があります。 ::: ## オブザーバーモードでのペイウォールとA/Bテストの使い方 \{#how-to-use-paywalls-and-ab-tests-in-observer-mode\} オブザーバーモードでは、Adapty SDKは購入の発生元を特定できません(購入処理はお客様独自のインフラ上で行われるため)。そのため、オブザーバーモードでペイウォールやA/B テストを使用する場合は、トランザクションを報告する際に、アプリストアからのトランザクションをモバイルアプリのコード内で対応するペイウォールに紐付ける必要があります。 また、ペイウォールビルダーで作成したペイウォールをオブザーバーモードで使用する際は、特別な表示方法が必要です。 - オブザーバーモードでのペイウォール表示については、[iOS](implement-observer-mode)または[Android](android-present-paywall-builder-paywalls-in-observer-mode)の手順を参照してください。 - トランザクション報告時のペイウォールと購入トランザクションの紐付けについては、[オブザーバーモードでのトランザクション報告](report-transactions-observer-mode)を参照してください。 --- # File: migration-from-revenuecat --- --- title: "RevenueCatからの移行" description: "ステップバイステップガイドでRevenueCatからAdaptyに移行しましょう。" --- 移行は5つのステップで構成されており、平均所要時間は約2時間です。移行の90%は1営業日以内に完了します。 1. 主要な違いを理解し、Adaptyアカウントを作成・準備する _(5分)_; 2. RevenueCat SDKの代わりに、各プラットフォーム向けのAdapty SDKをインストールする([iOS](sdk-installation-ios)、[Android](sdk-installation-android)、[React Native](sdk-installation-reactnative)、[Flutter](sdk-installation-flutter)、[Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)、[Unity](sdk-installation-unity))_(1時間)_; 3. AdaptyへのApple App Storeサーバー通知を設定し、オプションで[rawイベント転送](enable-app-store-server-notifications#raw-events-forwarding)を設定する _(5分)_; 4. アプリのアップデートをテストしてリリースする _(30分)_; 5. (オプション)RevenueCatサポートにCSV形式の過去データをリクエストする _(5分)_; 6. (オプション)Adaptyサポート経由で過去データをインポートする _(30分)_。 :::info サブスクライバーは自動的に移行されます サブスクリプションを有効にしたことがあるすべてのユーザーは、Adapty SDKを搭載した新しいバージョンのアプリを開いた瞬間に自動的にAdaptyへ移行されます。サブスクリプションのステータス検証とプレミアムアクセスは自動的に復元されます。 ::: Adapty SDKを搭載したアプリの新バージョンをリリースする前に、必ず[リリースチェックリスト](release-checklist)を確認してください。 ## 主要な違いを理解し、Adaptyアカウントを作成・準備する \{#learn-the-core-differences-create-and-prepare-an-adapty-account\} AdaptyとRevenueCatのSDKは設計が似ています。最大の違いはネットワーク使用量とスピードです。Adapty SDKは、必要な情報をリクエスト時にできる限り高速に提供するよう設計されています。たとえば、ペイウォールをリクエストする際、オンボーディングやペイウォールの事前構築に使える[リモートコンフィグ](customize-paywall-with-remote-config)がまず返され、その後プロダクトが専用リクエストで取得されます。 名称は少し異なります: | RevenueCat | Adapty | | :---------- | :-------------- | | Package | Product | | Offering | Paywall | | Paywall | Paywall Builder | | Entitlement | Access level | Adaptyには[プレースメント](placements)というコンセプトがあります。これはアプリ内でユーザーが購入できる論理的な場所です。ほとんどの場合、プレースメントは1〜2つです: - オンボーディング(全購入の80%がここで発生するため); - 全般(オンボーディング後の設定画面やアプリ内で表示)。
## Adapty SDKのインストールとRevenueCat SDKの置き換え \{#install-adapty-sdk-and-replace-revenuecat-sdk\}
各プラットフォーム向けのAdapty SDKをアプリにインストールしてください([iOS](sdk-installation-ios)、[Android](sdk-installation-android)、[React Native](sdk-installation-reactnative)、[Flutter](sdk-installation-flutter)、[Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)、[Unity](sdk-installation-unity))。
アプリ側でいくつかのSDKメソッドを置き換える必要があります。よく使われる関数とAdapty SDKでの置き換え方法を見ていきましょう。
### SDKのアクティベーション \{#sdk-activation\}
`Purchases.configure` を `Adapty.activate` に置き換えてください。
### ペイウォール(オファリング)の取得 \{#getting-paywalls-offerings\}
`Purchases.shared.getOfferings` を [`Adapty.getPaywall`](fetch-paywalls-and-products#fetch-paywall-information) に置き換えてください。
Adaptyでは、常に[プレースメントID](placements)を使ってペイウォールをリクエストします。実際には1〜2個のペイウォールしか取得しないため、SDKの高速化とネットワーク使用量の削減を目的として意図的にこのような設計にしています。
### ユーザー(カスタマープロファイル)の取得 \{#getting-a-user-customer-profile\}
`Purchases.shared.getCustomerInfo` を `Adapty.getProfile` に置き換えてください。
### プロダクトの取得 \{#getting-products\}
RevenueCatでは、`Purchases.shared.getOfferings`を使い、その後`self.offering?.availablePackages`で取得します。
Adaptyでは、まずペイウォールをリクエストして(上記参照)Adaptyの[リモートコンフィグ](customize-paywall-with-remote-config)にすぐアクセスし、その後[`Adapty.getPaywallProducts`](fetch-paywalls-and-products#fetch-products)でプロダクトを取得します。
### 購入する \{#making-a-purchase\}
`Purchases.shared.purchase` を [`Adapty.makePurchase`](making-purchases#make-purchase) に置き換えてください。
### アクセスレベル(エンタイトルメント)の確認 \{#checking-access-level-entitlement\}
カスタマープロファイルを取得し(上記参照)、
`customerInfo?.entitlements["premium"]?.isActive == true`
を以下に置き換えてください:
[`profile.accessLevels["premium"]?.isActive == true`](subscription-status#retrieving-the-access-level-from-the-server)
### 購入の復元 \{#restore-purchase\}
`Purchases.shared.restorePurchases` を [`Adapty.restorePurchases`](restore-purchase) に置き換えてください。
### ユーザーのログイン状態を確認する \{#check-if-the-user-is-logged-in\}
`Purchases.shared.isAnonymous` を `if profile.customerUserId == nil` に置き換えてください。
### ユーザーのログイン \{#log-in-user\}
`Purchases.shared.logIn` を [`Adapty.identify`](identifying-users#set-customer-user-id-after-configuration) に置き換えてください。
### ユーザーのログアウト \{#log-out-user\}
`Purchases.shared.logOut` を [`Adapty.logout`](identifying-users#logging-out-and-logging-in) に置き換えてください。
## App Storeのサーバーサイド通知をAdaptyに切り替える \{#switch-app-store-server-side-notifications-to-adapty\}
手順は[こちら](migrate-to-adapty-from-another-solutions#changing-apple-server-notifications)をご覧ください。
## アプリの新バージョンをテストしてリリースする \{#test-and-release-a-new-version-of-your-app\}
ここまで読んでいるということは、すでに以下の作業が完了しているはずです:
- [x] Adapty ダッシュボードの設定
- [x] Adapty SDKのインストール
- [x] SDKロジックのAdapty関数への置き換え
- [x] App StoreのサーバーサイドサービスをAdaptyに切り替え(オプションでRevenueCatへのrawイベント転送を有効化)
- [ ] サンドボックスでの購入テスト
- [ ] 新しいアプリのリリース
上記の項目を確認したら、サンドボックスでテスト購入を行い、アプリをリリースしてください。
:::info
[リリースチェックリスト](release-checklist)を確認してください。
リストを使って既存のインテグレーションを検証し、[アトリビューション](attribution-integration)や[アナリティクス](analytics-integration)インテグレーションなどの追加機能の設定も行いましょう。
:::
## (オプション)RevenueCatの過去データをCSV形式でエクスポートする \{#optional-export-your-revenuecat-historical-data-in-csv-format\}
:::warning
過去データのインポートは慌てないでください
過去データのインポートを行う前に、SDK搭載バージョンのリリース後、少なくとも1週間は待つ必要があります。その間にSDKから購入金額に関する情報がすべて取得されるため、インポートされるデータがより正確になります。
:::
[RevenueCatの公式ドキュメント](https://www.revenuecat.com/docs/integrations/scheduled-data-exports)の手順に従って、RevenueCatからCSV形式で過去データをエクスポートしてください。
## (オプション)RevenueCatサポートにGoogle Purchase Tokensをリクエストする \{#optional-ask-revenuecat-support-for-google-purchase-tokens\}
Google Playのトランザクションをインポートする場合は、RevenueCatの[サポートページ](https://app.revenuecat.com/settings/support)からGoogle Purchase Tokensが含まれたCSVファイルをリクエストしてください。Google Purchase Tokenは、Google Playが各トランザクションに付与する一意の識別子で、Adaptyで購入を正確に追跡・検証するために必要です。この情報は標準のエクスポートファイルには含まれていません。ファイルには以下の3つの列が含まれます:
- `user_id`
- `google_purchase_token`
- `google_product_id`
## 過去データのインポートをご依頼ください \{#write-us-to-import-your-historical-data\}
ウェブサイトのメッセンジャーまたは[support@adapty.io](mailto:support@adapty.io)にCSVファイルを添付してご連絡ください。
1. RevenueCatからエクスポートしたCSVファイルをサポートチームに直接送付してください。
2. Google Playのトランザクションをインポートする場合は、RevenueCatサポートから受け取ったGoogle Purchase Tokensが含まれたCSVファイルも添付してください。
3. Customer User ID(AdaptyのメインユーザーID)として使用するユーザーIDをお知らせください:`rc_original_app_user_id` または `rc_last_seen_app_user_id_alias` のいずれかです。
サポートチームがトランザクションをAdaptyにインポートします。各トランザクションについて以下のデータがインポートされます:
| パラメータ | 説明 |
| ----------------------------- | ------------------------------------------------------------ |
| user_id | Customer User ID。Adaptyおよびあなたのシステムにおけるユーザーのメイン識別子。 |
| apple_original_transaction_id | サブスクリプションチェーンの場合、`store_original_transaction_id`でリンクされた元のトランザクションの購入日。 |
| google_product_id | Google Play StoreのプロダクトID。 |
| google_purchase_token | 各トランザクションに対してGoogle Playが発行する一意の識別子。検証に必要。 |
| country | ユーザーの国。 |
| created_at | ユーザー作成日時。 |
| subscription_expiration_date | サブスクリプションの有効期限日時。 |
| email | エンドユーザーのメールアドレス。 |
| phone_number | エンドユーザーの電話番号。 |
| idfa | Appleがユーザーのデバイスに割り当てる広告識別子(IDFA)。 |
| idfv | 1人の開発者の全アプリに割り当てられ、デバイス上でそれらのアプリ間で共有されるベンダー識別子(IDFV)。 |
| advertising_id | 広告トラッキングのためにAndroid OSが提供する一意の識別子。 |
| attribution_channel | マーケティングチャネル名。 |
| attribution_campaign | マーケティングキャンペーン名。 |
| attribution_ad_group | アトリビューションの広告グループ。 |
| attribution_ad_set | アトリビューションの広告セット。 |
| attribution_creative | アトリビューションのクリエイティブキーワード。 |
また、Amplitude、Mixpanel、AppsFlyer、Adjust、FacebookAdsのインテグレーション識別子もインポートされます。
## よくある質問 \{#faq\}
### Adapty SDKのインストールとAdapty SDK搭載の新バージョンのリリースが完了しました。Adapty SDKを含む新バージョンにアップデートしていない既存のサブスクライバーはどうなりますか? \{#i-successfully-installed-adapty-sdk-and-released-a-new-app-version-with-it-what-will-happen-to-my-legacy-subscribers-who-did-not-update-to-a-version-with-adapty-sdk\}
ほとんどのユーザーは夜間に充電する際にApp Storeが全アプリを自動更新するため、問題にはならないでしょう。アップデートしていない有料サブスクライバーが若干残る可能性はありますが、引き続きプレミアムコンテンツにアクセスできます。強制的にアップデートさせる必要はありません。
### RevenueCatから過去データをできるだけ早くエクスポートする必要がありますか?それとも失ってしまいますか? \{#do-i-need-to-export-my-historical-data-from-revenuecat-as-quickly-as-possible-or-will-i-lose-it\}
急ぐ必要はありません。まずAdapty SDKでリリースを行い、その後に過去データをご提供ください。ユーザーの支払い履歴を復元し、[プロファイル](profiles-crm)と[チャート](charts)に反映します。
### MMP(AppsFlyer、Adjustなど)やアナリティクス(Mixpanel、Amplitudeなど)を使用しています。すべて正常に動作するか確認するにはどうすればいいですか? \{#i-use-mmp-appsflyer-adjust-etc-and-analytics-mixpanel-amplitude-etc-how-do-i-make-sure-that-everything-will-work\}
まず、データを送信したいサードパーティサービスのIDをSDK経由でAdaptyに渡す必要があります。[アトリビューションインテグレーション](attribution-integration)と[アナリティクスインテグレーション](analytics-integration)のガイドをご参照ください。過去データや既存ユーザーについては、**RevenueCatからエクスポートしたデータからそれらのIDを必ず渡してください。**
---
# File: migration-from-superwall
---
---
title: "Superwallからの移行"
description: "SuperwallからAdaptyへの移行を、SDKの全コールとコンセプトをマッピングしたステップバイステップガイドで行いましょう。"
---
SuperwallからAdaptyへの移行は、ほとんどの場合2時間程度で完了します。SDKを入れ替え、ストアのサーバー通知をAdaptyに向け直し、新しいアプリリリースを公開するだけです。有料サブスクライバーはアクセスを維持できます — Adaptyは初回起動時にApp StoreとGoogle Playのレシートからアクセスを復元します。
:::info
サブスクライバーは自動的に移行されます
サブスクリプションを有効化したことがあるすべてのユーザーは、Adapty SDKを搭載した新バージョンのアプリを開いた時点でAdaptyに移行されます。サブスクリプション状態の検証とプレミアムアクセスは自動的に復元されます。
:::
## このガイドの構成 \{#how-this-guide-is-organized\}
移行は6つのステップで進みます:
1. [SuperwallのコンセプトをAdaptyにマッピングする](#map-your-superwall-concepts-to-adapty)
2. [Adapty SDKをインストールする](#install-the-adapty-sdk)
3. [SDKの呼び出しを置き換える](#replace-sdk-calls)
4. [App StoreとGoogle Playのサーバー通知を切り替える](#switch-app-store-and-google-play-server-notifications)
5. [テストとリリース](#test-and-release)
6. [(オプション) 過去のデータをインポートする](#optional-import-historical-data)
## SuperwallのコンセプトをAdaptyにマッピングする \{#map-your-superwall-concepts-to-adapty\}
Superwallのコンセプトのほとんどは、Adaptyに直接対応するものがあります:
| Superwall | Adapty | 変更点 |
| :------------------- | :------------------------------------------------ | :--------------------------------------------------------------------------- |
| Campaign | [プレースメント](placements) + [オーディエンス](audience) | キャンペーンのロジックは、プレースメント(場所)とオーディエンス(ルール)に分かれます。 |
| Placement | [プレースメント](placements) | 同じコンセプト、同じ名前。 |
| Audience filter | [オーディエンス](audience) | ルールセットはプレースメント内に存在します。 |
| Entitlement | [アクセスレベル](access-level) | 名前付き識別子(例:`premium`)。 |
| WebView paywall | [ペイウォールビルダーのペイウォール](adapty-paywall-builder) | `WKWebView`ではなく、Adapty SDKがネイティブにレンダリングします。 |
| `PurchaseController` | 組み込み | 実装すべきプロトコルなし — Adaptyが購入処理を担当します。 |
| Feature gating | [アクセスレベル](access-level)チェック | `profile.accessLevels["premium"]?.isActive`を確認します。 |
コードに触れる前に、2つの考え方の転換を理解しておきましょう:
- **フェッチと表示は別ステップです**: Superwallの`register`は、ペイウォールのフェッチ、キャンペーンの評価、UIの表示を1回の呼び出しで行います。Adaptyはこれらのステップを分けています — ペイウォールをフェッチし、その設定を取得してから表示します。手順は増えますが、設定のプリロード、カスタムローディング状態の表示、独自ロジックに基づいた表示のキャンセルが可能になります。
- **サブスクリプション状態はアクセスレベルごとです**: Superwallは単一の`subscriptionStatus`パブリッシュプロパティを公開します。Adaptyは名前付きアクセスレベルを持つ[`AdaptyProfile`](https://swift.adapty.io/documentation/adapty/adaptyprofile)を返すため、1人のユーザーが`sports`と`science`のアクセスレベルを独立して持つことができます。同期的な読み取りには、ビューの読み込みごとに`getProfile()`を呼び出すのではなく、`AdaptyDelegate`からプロファイルをキャッシュしてください。
## Adapty SDKをインストールする \{#install-the-adapty-sdk\}
お使いのプラットフォーム向けのAdapty SDKをインストールしてください — [iOS](sdk-installation-ios)、[Android](sdk-installation-android)、[React Native](sdk-installation-reactnative)、[Flutter](sdk-installation-flutter)、[Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)、[Unity](sdk-installation-unity)、または[Capacitor](sdk-installation-capacitor) — そして同時にSuperwalKitをプロジェクトから削除してください。
## SDKの呼び出しを置き換える \{#replace-sdk-calls\}
インテグレーションの各部分を確認しながら、SupwallのコールをAdaptyの対応するものに置き換えてください。各サブセクションの末尾にあるリンクは7つのプラットフォームSDKすべてをカバーしています — アプリに合うものを参照してください。
### SDKを初期化する \{#initialize-the-sdk\}
`Superwall.configure`を`Adapty.activate`に置き換えます。
お使いのプラットフォームのインストールガイドを参照してください — [iOS](sdk-installation-ios)、[Android](sdk-installation-android)、[React Native](sdk-installation-reactnative)、[Flutter](sdk-installation-flutter)、[Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)、[Unity](sdk-installation-unity)、または[Capacitor](sdk-installation-capacitor)。
### ユーザーの識別とログアウト \{#identify-and-log-out-users\}
`Superwall.shared.identify`を`Adapty.identify`に、`Superwall.shared.reset`を`Adapty.logout`に置き換えます。両SDKとも初回起動時に匿名プロファイルを生成するため、これらの呼び出しはユーザーのサインインまたはサインアウト時のみ必要です。識別後はペイウォールを再フェッチしてください — 新しいユーザーは別のオーディエンスに解決される可能性があります。
お使いのプラットフォームの識別ガイドを参照してください — [iOS](identifying-users)、[Android](android-identifying-users)、[React Native](react-native-identifying-users)、[Flutter](flutter-identifying-users)、[Kotlin Multiplatform](kmp-identifying-users)、[Unity](unity-identifying-users)、または[Capacitor](capacitor-identifying-users)。
### ペイウォールのフェッチと表示 \{#fetch-and-present-a-paywall\}
`Superwall.shared.register`を2ステップのフローに置き換えます:`Adapty.getPaywall`でペイウォールをフェッチし、`AdaptyUI.getPaywallConfiguration`でビュー設定を読み込み、それから表示します。
2つの違いに注目してください:
- **`feature:`クロージャに代わるフィーチャーゲーティング**: ペイウォールが閉じた後、返されたプロファイル(または`Adapty.getProfile`)のアクティブなアクセスレベルを確認し、そこから分岐します。
- **ペイウォールはSDKによってレンダリングされます**: Superwallは`WKWebView`内でペイウォールをレンダリングします。Adaptyはペイウォールビルダーのペイウォールをネイティブにレンダリングします — フォント、プロダクト情報、ボタンはSDKによって描画されます。
お使いのプラットフォームのペイウォールクイックスタートを参照してください — [iOS](ios-quickstart-paywalls)、[Android](android-quickstart-paywalls)、[React Native](react-native-quickstart-paywalls)、[Flutter](flutter-quickstart-paywalls)、[Kotlin Multiplatform](kmp-quickstart-paywalls)、[Unity](unity-quickstart-paywalls)、または[Capacitor](capacitor-quickstart-paywalls)。
### サブスクリプション状態を確認する \{#check-subscription-status\}
`Superwall.shared.subscriptionStatus`を、プロファイルの名前付きアクセスレベルのチェックに置き換えます:`profile.accessLevels["premium"]?.isActive`。変更の監視は`@Published`プロパティパターンの代わりに`AdaptyDelegate.didLoadLatestProfile(_:)`を使用し、同期的な読み取りのためにプロファイルをキャッシュしてください。
お使いのプラットフォームのサブスクリプション状態確認ガイドを参照してください — [iOS](ios-check-subscription-status)、[Android](android-check-subscription-status)、[React Native](react-native-check-subscription-status)、[Flutter](flutter-check-subscription-status)、[Kotlin Multiplatform](kmp-check-subscription-status)、[Unity](unity-check-subscription-status)、または[Capacitor](capacitor-check-subscription-status)。
### 購入と復元を処理する \{#handle-purchases-and-restores\}
ペイウォールビルダーを使用する場合、両SDKともペイウォールUI内で購入を自動的に処理します — **このステップはスキップできます**。
カスタムペイウォールの場合、Superwallは`PurchaseController`の実装を必要とします。Adaptyは不要です:`PurchaseController.purchase`を`Adapty.makePurchase`に、`PurchaseController.restorePurchases`を`Adapty.restorePurchases`に置き換えてください。SDKが自動的に検証を処理します。
お使いのプラットフォームのカスタムペイウォールクイックスタートを参照してください — [iOS](ios-quickstart-manual)、[Android](android-quickstart-manual)、[React Native](react-native-quickstart-manual)、[Flutter](flutter-quickstart-manual)、[Kotlin Multiplatform](kmp-quickstart-manual)、[Unity](unity-quickstart-manual)、または[Capacitor](capacitor-quickstart-manual)。
### ユーザー属性を設定する \{#set-user-attributes\}
`Superwall.shared.setUserAttributes`を`Adapty.updateProfile`に置き換えます。
お使いのプラットフォームのユーザー属性ガイドを参照してください — [iOS](setting-user-attributes)、[Android](android-setting-user-attributes)、[React Native](react-native-setting-user-attributes)、[Flutter](flutter-setting-user-attributes)、[Kotlin Multiplatform](kmp-setting-user-attributes)、[Unity](unity-setting-user-attributes)、または[Capacitor](capacitor-setting-user-attributes)。
## App StoreとGoogle Playのサーバー通知を切り替える \{#switch-app-store-and-google-play-server-notifications\}
ストアのサーバー通知をAdaptyに向け直してください。Adaptyはそれなしでも動作しますが、アナリティクス、サードパーティインテグレーション、A/Bテストの指標はこれに依存しています:
- **App Store**: [App Storeサーバー通知を有効にする](enable-app-store-server-notifications)の手順に従ってください。
- **Google Play**: [リアルタイム開発者通知を有効にする](enable-real-time-developer-notifications-rtdn)の手順に従ってください。
ロールアウト中にSuperwallとAdaptyを並行して動かしたい場合は、[rawイベントフォワーディング](enable-app-store-server-notifications#raw-events-forwarding)を使用してください — AdaptyがストアイベントをそのままのかたちでSuperwallに転送する一方で、新しいインテグレーションを検証できます。
## テストとリリース \{#test-and-release\}
リリース前に、各項目を確認してください:
- [x] Adapty ダッシュボードを設定済み(プロダクト、ペイウォール、プレースメント、アクセスレベル)
- [x] Adapty SDKをインストール済み
- [x] Superwall SDKの呼び出しをAdaptyの対応するものに置き換え済み
- [x] App StoreとGoogle PlayのサーバーNotificationsをAdaptyに向け直し済み
- [ ] サンドボックス購入を実施済み
- [ ] 新しいアプリリリースを提出済み
最終検証として[リリースチェックリスト](release-checklist)を確認してください。
## (オプション) 過去のデータをインポートする \{#optional-import-historical-data\}
Superwallはサブスクリプション状態を所有していません — それはApp StoreとGoogle Playが所有しています。Adaptyは初回起動時にレシートを検証するため、有料ユーザーはインポートなしでアクセスを維持できます。
過去のトランザクションをAdaptyアナリティクスにバックフィルしたい場合は、[Adaptyへの過去データのインポート](importing-historical-data-to-adapty)の手順に従ってください。SDKが新しい購入価格を収集する時間を確保するため、SDKリリース後少なくとも1週間待ってください。
## よくある質問 \{#faq\}
### アプリを更新しないサブスクライバーはどうなりますか? \{#what-happens-to-subscribers-who-dont-update-the-app\}
ほとんどのユーザーは夜間に自動更新するため、旧バージョンを使用しているユーザーの割合は急速に減少します。旧バージョンのサブスクライバーは、App StoreまたはGoogle Playを通じて直接アクセスを維持します — 強制更新は必要ありません。
### Superwallのキャンペーンオーディエンスは引き継がれますか? \{#do-my-superwall-campaign-audiences-carry-over\}
いいえ。SuperwallのオーディエンスフィルターとAdaptyのオーディエンスは異なるダッシュボードで設定され、異なる識別子を使用します。ターゲティングをAdaptyの[プレースメント](placements)内の[オーディエンス](audience)として再作成してください。ほとんどのアプリは1〜2つのプレースメント(オンボーディングと一般的なアプリ内トリガー)を使用しているため、再構築は通常短時間で完了します。
### `getPresentationResult`に相当するものはAdaptyにありますか? \{#does-adapty-have-an-equivalent-to-getpresentationresult\}
単一の呼び出しとしては存在しません。プレースメントがペイウォールを表示するかどうかを確認するには、`Adapty.getPaywall(placementId:)`を呼び出し、結果に基づいて分岐します。呼び出しが成功すれば、そのユーザーのオーディエンスにペイウォールが割り当てられています。ペイウォールが設定されていないために失敗した場合は、表示をスキップしてフォールバックロジックを実行してください。
---
# File: importing-historical-data-to-adapty
---
---
title: "Adaptyへの過去データのインポート"
description: "詳細なアナリティクスのためにAdaptyへ過去データをインポートします。"
---
Adapty SDKをインストールしてアプリをリリースすると、[Profiles](profiles-crm)セクションでユーザーとサブスクライバーを確認できます。しかし、レガシーインフラを持っていてAdaptyへ移行したい場合や、既存のデータをAdaptyで確認したい場合はどうすればよいでしょうか?
:::note
データのインポートは必須ではありません
Adapty SDKが組み込まれたアプリをユーザーが開くと、Adaptyは自動的に過去ユーザーへアクセスレベルを付与し、購入イベントを復元します。このユースケースでは、過去データのインポートは不要です。ただし、大量の過去トランザクションがある場合、データのインポートによってアナリティクスの精度が上がります。移行に際して一般的には必須ではありません。
:::
Adaptyにデータをインポートするには:
1. トランザクションをCSVファイルにエクスポートします(iOS、Android、Stripeごとに別々のファイルを用意してください)。詳細な要件については、下記の[インポートファイルの形式](importing-historical-data-to-adapty#import-file-format)セクションを参照してください。
2. ファイルが1 GBを超える場合は、約100行のデータサンプルを準備してください。
3. すべてのファイルをGoogle Driveにアップロードします(圧縮してもかまいませんが、それぞれ別々のファイルのままにしてください)。
4. iOSトランザクションについては、StoreKit 1を使用している場合でも、[**App settings**](https://app.adapty.io/settings/ios-sdk)の**In-app purchase API**セクションに**Issuer ID**、**Key ID**、**Private key**(.P8ファイル)が入力されていることを確認してください。詳細な手順については、[Issuer IDとKey IDの入力](app-store-connection-configuration#step-2-provide-issuer-id-and-key-id)および[アプリ内購入キーファイルのアップロード](app-store-connection-configuration#step-3-upload-in-app-purchase-key-file)セクションを参照してください。
5. [メール](mailto:support@adapty.io)またはAdapty Dashboardのオンラインチャットでチームにリンクを共有してください。
過去データのインポートは、Adaptyの既存エントリと重複する場合でも、重複が発生することはありませんのでご安心ください。
## Androidの既知の制限事項 \{#known-limitations-for-android\}
1. アクティブなサブスクリプションのみが復元されます。期限切れのトランザクションは復元されません。
2. サブスクリプションの最新の更新のみが復元されます。購入の全チェーンは復元されません。
3. 購入後にプロダクト価格が変更された場合、現在の価格が使用されるため、価格が正しく表示されないことがあります。
:::note
Androidトランザクションの件数が多い場合、デフォルトのAPI制限を超えないよう、インポートを開始する前に[Google Play Developer APIのクォータ増加をリクエスト](google-play-quota-increase)する必要があるかもしれません。
:::
## インポートファイルの形式 \{#import-file-format\}
:::tip
RevenueCatから移行する場合、RevenueCatのエクスポートファイルをそのまま送信できます。変換は不要です。エクスポート手順については[RevenueCatのドキュメント](https://www.revenuecat.com/docs/integrations/scheduled-data-exports)を参照してください。
:::
以下のルールに従ったファイルでデータを準備してください:
- [ ] ファイル形式は.CSVです。
- [ ] Android、iOS、Stripeのインポートはそれぞれ別々のファイルを使用します。
- [ ] すべてのインポートファイルに[必須カラム](importing-historical-data-to-adapty#required-fields)がすべて含まれています。
- [ ] インポートファイルのカラムにヘッダーがあります。
- [ ] カラムヘッダーは下記の表の**Column name**列に記載されているものと完全に一致します。タイポがないか確認してください。
- [ ] 必須でないカラムはファイルに含めなくてもかまいません。データがない場合、空のカラムを追加しないでください。
- [ ] インポートファイルには、表に記載されていない余分なカラムを含めないでください。含まれている場合は削除してください。
- [ ] 値はカンマで区切られています。
- [ ] 値は引用符で囲まれていません。
- [ ] 1人のユーザーに対して複数の**apple_original_transaction_id**がある場合、それぞれの**apple_original_transaction_id**ごとに別の行として追加してください。そうしないと、消耗型アイテムの購入を復元できない場合があります。
サンプルファイルとして、[iOS](https://raw.githubusercontent.com/adaptyteam/adapty-docs/refs/heads/main/Downloads/adapty_import_ios_sample.csv)および[Android](https://raw.githubusercontent.com/adaptyteam/adapty-docs/refs/heads/main/Downloads/adapty_import_android_sample.csv)のファイルをご利用ください。
### インポートファイルの利用可能なカラム \{#available-import-file-columns\}
| カラム名 | 必須/任意 | 説明 |
|-----------|--------|-----------|
| **user_id** | 必須 | ユーザーのID |
| **apple_original_transaction_id** | iOSで必須 | オリジナルトランザクションIDまたはOTID([詳細](https://developer.apple.com/documentation/appstoreserverapi/originaltransactionid))。StoreKit 2のインポートメカニズムで使用されます。1人のユーザーが複数のOTIDを持つ場合、インポートを成功させるには少なくとも1つを提供すれば十分です。
**注意:** このインポートにはAdapty Dashboardでアプリ内購入APIの資格情報を設定する必要があります。設定方法は[こちら](app-store-connection-configuration#step-3-upload-in-app-purchase-key-file)をご覧ください。
| | **google_product_id** | Googleで必須 | Google Play StoreのプロダクトID | | **google_purchase_token** | Googleで必須 | ユーザーと購入したアプリ内プロダクトのプロダクトIDを表す一意の識別子 | | **google_is_subscription** | Googleで必須 | 使用可能な値は `1` \| `0` | | **stripe_token** | Stripeで必須 | 一意の購入を表すStripeオブジェクトのトークン。StripeのSubscription(`sub_...`)またはPayment Intent(`pi_...`)のトークンのいずれかを使用できます。 | | **subscription_expiration_date** | 任意 | サブスクリプションの有効期限日(次の課金日)。タイムゾーン付きの日時(2020-12-31T23:59:59-06:00) | | **created_at** | 任意 | プロファイル作成日時(2019-12-31 23:59:59-06:00) | | **birthday** | 任意 | ユーザーの誕生日(形式:2000-12-31) | | **email** | 任意 | ユーザーのメールアドレス | | **gender** | 任意 | ユーザーの性別 | | **phone_number** | 任意 | ユーザーの電話番号 | | **country** | 任意 | 形式:[ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) | | **first_name** | 任意 | ユーザーの名 | | **last_name** | 任意 | ユーザーの姓 | | **last_seen** | 任意 | タイムゾーン付きの日時(2020-12-31T23:59:59-06:00) | | **idfa** | 任意 | IDFA(広告識別子)は、Appleがユーザーのデバイスに割り当てるランダムなデバイス識別子です。iOSアプリのみに適用されます | | **idfv** | 任意 | IDFV(ベンダー識別子)は、1人の開発者が開発したすべてのアプリに割り当てられる一意のコードです。iOSアプリのみに適用されます | | **advertising_id** | 任意 | 広告IDは、AndroidのOSによって割り当てられる一意のコードで、広告主がユーザーのデバイスを一意に識別するために使用することがあります | | **amplitude_user_id** | 任意 | AmplitudeのユーザーID | | **amplitude_device_id** | 任意 | AmplitudeのデバイスID | | **mixpanel_user_id** | 任意 | MixpanelのユーザーID | | **appmetrica_profile_id** | 任意 | AppMetricaのユーザープロファイルID | | **appmetrica_device_id** | 任意 | AppMetricaのデバイスID | | **appsflyer_id** | 任意 | AppsFlyerの一意識別子 | | **adjust_device_id** | 任意 | AdjustのデバイスID | | **facebook_anonymous_id** | 任意 | Facebookがアプリやウェブサイトに匿名でアクセスするユーザー(Facebookにログインしていない状態)に対して生成する一意識別子 | | **branch_id** | 任意 | Branchの一意識別子 | | **attribution_source** | 任意 | アトリビューションのソースインテグレーション(例:appsflyer) | | **attribution_status** | 任意 | organic | | **attribution_channel** | 任意 | トランザクションをもたらしたアトリビューションチャネル | | **attribution_campaign** | 任意 | トランザクションをもたらしたアトリビューションキャンペーン | | **attribution_ad_group** | 任意 | トランザクションをもたらしたアトリビューション広告グループ | | **attribution_ad_set** | 任意 | トランザクションをもたらしたアトリビューション広告セット | | **attribution_creative** | 任意 | 広告やマーケティングキャンペーンで使用される特定のビジュアルまたはテキスト要素。クリック、コンバージョン、インストールなどの目的のアクションを促進する効果を測定するために追跡されます | | **custom_attributes** | 任意 | キーと値の形式のJSON辞書として最大30個のカスタム属性を定義します:形式:`"{'string_value': 'some_value', 'float_value': 123.0, 'int_value': 456}"`
形式内のダブルクォートとシングルクォートの使い方に注意してください。ブール値と整数は浮動小数点数に変換されることにご注意ください。
| ### 必須フィールド \{#required-fields\} 各プラットフォームには、**user_id**と対応するプラットフォーム固有の購入を識別するデータという2つの必須フィールドグループがあります。プラットフォームごとの必須フィールドは下記の表を参照してください。 | プラットフォーム | 必須フィールド | |--------|---------------| | iOS |user_id
apple_original_transaction_id
| | Android |user_id
google_product_id
google_purchase_token
google_is_subscription
| | Stripe |user_id
stripe_token
| これらのフィールドがなければ、Adaptyはトランザクションを取得できません。 正確なコホートアナリティクスのために、`created_at`を指定してください。指定しない場合、インストール日は最初の購入日と同じとみなされます。 ### Adaptyへのデータインポート \{#import-data-to-adapty\} [support@adapty.io](mailto:support@adapty.io)または[Adapty Dashboard](https://app.adapty.io/overview)のオンラインチャットからお問い合わせいただき、インポートファイルを共有してください。 --- # File: migrate-integrations-to-adapty --- --- title: "Adaptyへのインテグレーション移行" description: "レガシーソリューションからAdaptyへのアナリティクスおよびアトリビューションインテグレーションの切り替えを、イベントの重複やキャンペーンの中断なく行う方法。" --- Adaptyへの移行はSDKの切り替えだけでは完結しません。AmplitudeやAdjustなどのサードパーティのアナリティクス・アトリビューションインテグレーションも、並行して切り替える必要があります。慎重に進めれば、重複や欠落イベントを最小限に抑え、キャンペーンを中断させることなく移行できます。 ## イベントのマッピング \{#map-your-events\} ほとんどのAdaptyインテグレーションでは、イベント名をカスタマイズできます。ダッシュボードやキャンペーンですでに使用しているイベント名に合わせて設定することが可能です。これにより、切り替え後も同じイベント名でアナリティクスやキャンペーンのレポートを継続して利用できます。Adaptyで利用可能なイベントの一覧は、[イベント](events)をご確認ください。 Adjustの場合、インテグレーションではカスタムイベント名の代わりにイベントIDを使用します。AdjustダッシュボードのイベントIDをAdaptyのインテグレーション設定に移行してください。詳細は[Adjustインテグレーションガイド](adjust)を参照してください。 ## Adaptyによるインテグレーションイベントの作成方法 \{#how-adapty-creates-integration-events\} インテグレーションにイベントを送信するには、Adaptyにユーザーのプロファイルが必要です。プロファイルは以下のいずれかの方法で作成されます: - **過去データのインポート**:SDKが稼働する前に[過去のトランザクションデータをインポート](importing-historical-data-to-adapty)した際にプロファイルが作成されます。 - **SDKとのインタラクション**:ユーザーが初めてAdapty SDKを搭載したアプリを開いたときに自動的にプロファイルが作成されます。 Adaptyはレガシーシステムで行われた購入をリアルタイムで把握しますが、購入者のプロファイルが存在して初めてインテグレーションイベントを送信できます。プロファイルはユーザーがAdapty SDKを搭載したアプリを開いたときに作成されます。新バージョンにアップデートしないユーザーは、インテグレーションイベントを生成しません。 ## 移行前の準備 \{#prepare-before-migration-day\} ### 過去イベントの除外 \{#exclude-historical-events\} [インテグレーション設定](configuration)で **Exclude Historical Events** を有効にしてください。これにより、ユーザーの最初のAdapty SDKセッション以前のイベントがインテグレーションに送信されるのを防ぎます。 この設定は、大量の過去トランザクションをまとめて処理する[過去データのインポート](importing-historical-data-to-adapty)時に特に重要です。有効にしないと、それらのトランザクションがアナリティクスツールに大量のイベントを生成してしまいます。 ### インテグレーションを事前にセットアップする \{#set-up-the-integration-in-advance\} Adaptyでは、インテグレーションを無効のままテストや設定を行うことができます。認証情報、イベントのマッピング、フィルターを設定しておき、準備が整うまでインテグレーションを有効化しないことが可能です。設定は保存されるため、移行当日まで無効にしておいても何も失われません。 インテグレーションの確認方法については、[アトリビューションインテグレーション](attribution-integration)、[アナリティクスインテグレーション](analytics-integration)、[メッセージングサービスインテグレーション](messaging)、または[WebhookおよびETLインテグレーション](webhook-and-etl)を参照してください。 ## 移行当日の切り替え \{#switch-on-migration-day\} レガシーソリューションのインテグレーションを無効にすると同時に、Adaptyのインテグレーションを有効にしてください。両方を同時に動かすと、イベントが重複して送信されます。 移行当日は大規模な獲得キャンペーンを一時停止してください。これにより、切り替えのタイミングで発生するイベントのオーバーラップによるキャンペーン最適化エラーのリスクを軽減できます。 ## 移行後に想定されること \{#what-to-expect\} 移行中にインテグレーションイベントの欠落や重複がある程度発生するのは避けられません。ただし、正しく切り替えを行えば、影響を受けるイベントの数はごくわずかです。 欠落の主な原因は前述のタイミングの問題です。Adaptyは購入者のプロファイルが作成されて初めて、その購入に対するインテグレーションイベントを送信できます。レガシーシステムで行われた購入は、購入者がAdapty SDKを搭載したアプリを開くまでAdaptyのインテグレーションイベントを生成しません。 ## インテグレーションとサーバー間通知の違い \{#integrations-vs-server-to-server-notifications\} Adaptyは、ストアからの生のサーバー間通知をアナリティクスやアトリビューションツールに直接転送するのではなく、インテグレーションを使用することを推奨しています。 インテグレーションを利用するメリット: - **統一されたフォーマット**:App Store、Google Play、Stripeなど、すべてのストアからのイベントが同じイベントフォーマットで送信されます。 - **データの充実**:イベントにはサブスクリプションの状態やユーザー属性など、Adaptyが収集するデータが含まれます。生の通知にはこれらは含まれません。 --- # File: whats-new --- --- title: "最新情報" description: "Adaptyの最新機能と改善内容をご確認ください" --- 最新機能、改善内容、SDKアップデート、ドキュメントの更新情報をまとめています。アプリのマネタイズ戦略を最適化するのに役立つ、毎月の主要リリースをご紹介します。 :::note 新機能へのフィードバックをお聞かせください! ぜひご意見をお寄せください。[プロダクトフィードバックボード](https://adapty.featurebase.app/en?b=69831ba5e82e7a3391632ec2)からお気軽にご連絡ください。 ::: ## 2026年7月 \{#july-2026\} - **仮想通貨**: トークン、コイン、ジェムなどのアプリ内通貨を定義し、ユーザーごとに残高を付与・管理して、サーバーサイドAPIからその残高を読み取れます。[詳細を見る](virtual-currencies) - **Apple Ads ManagerのAIエージェント**: Apple Adsのパフォーマンスについてアドバイザリーチャットエージェントに質問すると、手動でレポートを作成しなくてもキャンペーンデータから回答を得られます。[詳細を見る](ads-manager-ai-agent) - **Apple Ads Manager の新しい自動化**: 既存のキーワードおよび検索語句の自動化に加え、2 つの新しいルールタイプでキャンペーンおよび広告グループレベルの変更を自動化できます。[キャンペーンルール](ads-manager-automations-campaign-rules) | [広告グループルール](ads-manager-automations-ad-group-rules) - **Adapty Mail のプロファイル**: サブスクライバーごとのビューで、各ユーザーのジャーニー、現在のサブスクリプション状態、購読解除ステータスを一か所で確認できます。[詳細を見る](mail-profiles) - **React Native、Flutter、Capacitor、Kotlin Multiplatform 向け SDK v4**: フロー対応の v4 SDK が登場しました。React Native、Flutter、Capacitor は正式リリース(GA)となり、Kotlin Multiplatform v4 もローンチ — それぞれ専用のマイグレーションガイドをご用意しています。[React Native](migration-to-react-native-sdk-v4) | [Flutter](migration-to-flutter-sdk-v4) | [Capacitor](migration-to-capacitor-sdk-v4) | [Kotlin Multiplatform](migration-to-kmp-sdk-v4) - **新しいwebhookフィールド**: webhookのペイロードに各トランザクションの元の価格と割引が含まれるようになりました。これにより、プロモーションオファーや初回オファーの価格をダウンストリームで追跡できます。これらのフィールドはwebhookのみで利用できます。[詳しくはこちら](webhook-event-types-and-fields) - **フローでの取り消し線付き価格**: フローBuilder内で、割引後の価格の横に取り消し線付きの元の価格と割引バッジを直接表示できます。[詳しくはこちら](strikethrough-price) - **フローテンプレートギャラリー**: 空白のキャンバスではなく、プロが作成したテンプレートから新しいフローを開始し、アプリに合わせてカスタマイズできます。[詳細はこちら](paywall-builder-templates) - **インストールツールボタン**: すべてのドキュメント記事のヘッダーに **Install tools** ボタンが追加されました。このボタンをクリックすると、Claude Code、Copilot CLI、Gemini CLI、Codex などの AI コーディングアシスタントに Adapty SDK インテグレーションスキルをインストールするためのコピー可能なコマンドが表示されるモーダルが開きます。[詳細はこちら](adapty-sdk-integration-skill) - **Unityの新しいSDKインストール方法**: Unity SDKをSwift Package Manager経由でインストールできるようになりました。よくあるセットアップ上の問題に対するトラブルシューティングガイダンスも追加されています。[詳細を見る](sdk-installation-unity) - **フロービルダーのフッターコンテナ**: 画面の残りの部分がスクロールしても下部に固定されるスティッキーパネルで、CTAボタン、法的テキスト、リンクの配置に最適です。[詳細を見る](builder-containers#footer) - **新しいフロービルダーの動画チュートリアル**: フローの構築方法をステップバイステップで解説するYouTubeプレイリストが充実しており、フロービルダーのガイド全体に埋め込まれています。[詳細を見る](adapty-flow-builder) ## 2026年6月 \{#june-2026\} - **FlowがAndroidに対応**: ペイウォールとオンボーディングのビジュアルノーコードビルダーが、iOSに加えてAndroid SDK v4以降でも利用できるようになりました。画面はウェブビューなしでネイティブにレンダリングされます。[詳細はこちら](adapty-flow-builder) - **Apple Ads ManagerでCPP A/B テスト**: Apple Ads内でカスタムプロダクトページ同士を比較できます。現在のデフォルトを含む2〜4ページを選択すると、Apple Adsがトラフィックをローテーションし、どのページが最もコンバージョンを獲得できるかをレポートします。[詳細はこちら](ads-manager-cpp-ab-tests) - **Adapty Mail API**: ユーザープロファイルとトランザクションを Adapty Mail へサーバーから直接送信できます。Adapty SDK を経由する必要はありません。購読者ベースの初期データ投入、他のアプリの購読者の再利用、またはバックエンドを信頼できる唯一の情報源として維持する際にご活用ください。[詳細はこちら](mail-send-data-via-api) - **初回起動時にApple Ads向けペイウォールを表示する**: Apple AdsのアトリビューションはSDKのアクティベーション後に届くため、早すぎるタイミングでペイウォールをリクエストするとApple Ads向けオーディエンスを見逃す可能性があります。`AdaptyProfile.appliedAttributionSources`を使って、アトリビューションデータが届いた時点でApple Ads向けペイウォールをすぐに表示しましょう。[iOS](ios-show-aa-targeted-paywall) | [React Native](react-native-show-aa-targeted-paywall) | [Capacitor](capacitor-show-aa-targeted-paywall) - **フロービルダーの自動保存**: フロービルダーが1分ごとに進行状況を自動保存するようになりました。ページを離れても未保存の作業が失われる心配はありません。**Cmd/Ctrl + S** で手動ドラフト保存も引き続き利用できます。[詳細はこちら](builder-save-publish) - **フロービルダーの新しい動画チュートリアル**: フロー画面間のナビゲーション構築と、選択済み・アクティブ・無効などの要素ステートのデザインを解説する2本のウォークスルー動画を追加しました。[フロー内のナビゲーション](onboarding-navigation-branching) | [要素のステート](builder-element-states) - **日本語とベトナム語のドキュメント**: Adaptyのドキュメントが日本語(日本語)とベトナム語(Tiếng Việt)で利用可能になりました。上部ナビゲーションの言語セレクターで切り替えができます。 ## 2026年5月 \{#may-2026\} - **フロー(ベータ版)**: ビジュアルなノーコードビルダーで画面シーケンス全体を作成できます — 単一画面のペイウォール、複数ステップのオンボーディング、そしてその間のあらゆる構成を1つのフローにまとめられます。画面はネイティブにレンダリングされ、ウェブビューは不要です。アプリのリリースなしに、テキスト、デザイン、ロジックを更新できます。現在は iOS、Android、React Native、Flutter、および Capacitor SDK v4 以上をサポートしています。[詳細はこちら](adapty-flow-builder) - **オートパイロットがテスト結果に適応するようになりました**: AI グロースマネージャーとして機能し、ラウンドが完了するたびに成長プランを更新します。次の仮説は、これまでに実施した実験、勝利した実験、まだ探索する価値のある方向性を踏まえて構築されます。固定された順序に従うのではありません。[詳細を見る](autopilot-how-it-works#how-ai-growth-advisor-decides-what-to-recommend) - **Autopilot マーケットインサイトのアクティベーション ARPU**: 新しいチャートで、アプリの新規インストールあたりの平均収益をカテゴリ平均と比較できます。コンバージョンファネルと組み合わせて使うと効果的で、コンバージョンが高いのにアクティベーション ARPU が低い場合は、価格が低すぎる可能性を示している可能性があります。[詳細を見る](autopilot-analysis#activation-arpu) - **Adapty Mail のアナリティクス**: 各キャンペーンの配信指標とメール経由の収益を一画面で比較できます。キャンペーン、セグメント、A/B バリアント、メッセージ、トリガーでグループ化・絞り込み・内訳表示が可能で、任意の行をドリルダウンすることもできます。[詳細を見る](mail-analytics) - **Adapty Mailにおけるブランドプロファイル**: メールのコピー、トーン、ビジュアル、ウェブペイウォールのコンテンツを一元管理するプロファイルです。アプリのストアリスティング、ランディングページ、法的ページ、ソーシャルプロファイルをもとにAdaptyが構築し、各セクションをインラインで確認・編集できます。[詳細を見る](mail-brand) - **Adapty UA の予測**: 各コホートの予測収益、ROAS、広告利益、ARPU、ARPPU を確認できるため、キャンペーンが成熟する前に比較できます。予測はアプリ独自の過去のコホートデータから構築され、毎日更新され、D0 から D360 または任意の日のコホート期間で利用できます。[詳細を見る](ua-predicted-metrics) - **Adapty UA カスタム S3 エクスポートの新しいフィールド**: カスタム S3 エクスポートに `bundle_id`、`device_brand`、`device_model`、`os_version`、`app_version`、`sdk_version` が追加されました。デバイスやアプリバージョンごとにアトリビューションデータをスライス・結合できます。[詳しくはこちら](ua-custom-s3) - **CLI でのプレースメントオーディエンス**: `adapty placements create` および `adapty placements update` コマンドに `--audiences` フラグが追加されました。`{segment_ids, paywall_id, priority}` エントリの JSON 配列を指定することで、ターミナルから異なるセグメントに異なるペイウォールをターゲティングできます。新しい `adapty paywalls placements` コマンドは、指定したペイウォールを使用しているすべてのプレースメントを一覧表示するため、切り替え前に影響を確認できます。[詳細はこちら](developer-cli-reference#placements) - **スペイン語版ドキュメント**: Adapty ドキュメントがスペイン語(Español)でもご利用いただけるようになりました。上部ナビゲーションの言語セレクターから切り替えてください。 ## 2026年4月 \{#april-2026\} - **Adapty Mail**: トライアルユーザーを有料サブスクライバーへ転換するAI生成メールキャンペーン。Adaptyプロジェクトからキャンペーンの作成・送信・アトリビューションをすべて管理でき、別途メールプラットフォームは不要です。[詳細を見る](adapty-mail) - **Autopilot でのペイウォール診断**: テストを始める前に、ペイウォールの改善点を把握できます。スクリーンショットをアップロードすると、Autopilot が同カテゴリの上位アプリのベンチマークに基づく推奨事項と、AI が生成したレイアウト・コピーの提案を返します。ベンチマーク結果はグロースプランの A/B テストラウンドになります。[詳細はこちら](autopilot-analysis#paywall-analysis) - **すべての Autopilot 提案がわかりやすくなりました**: 各仮説に、なぜそれが重要なのか(ペイウォールが確立されたパターンからどう外れているかをデータで説明)、何を変更すべきか・A/B テストの設定方法、そして結果の読み方を解説する「How to interpret your results」セクションが追加されました。[詳細を見る](autopilot-execute-plan#step-1-view-the-hypothesis) - **Autopilot成長プランを最新の状態に保つ**: 分析を更新して最新の市場データや新しい提案を取り込み、バージョン履歴から過去の提案を見直すこともできます。仮説はTop priority、All、Pricing、Visual、Geo-pricing、Archivedタブに分類されています。[詳しくはこちら](autopilot-growth-plan) - **Autopilot の期間別収益分布**: サブスクリプション期間が一つに偏っていないか確認できます。新しい Market Insights チャートでは、カテゴリーと国ごとの業界平均と並べて、期間別の収益構成を表示します。[詳細を見る](autopilot-analysis#revenue-distribution-by-duration) - **LTV と収益予測の更新**: 予測 LTV および収益は、十分な履歴データがある場合はアプリ独自のコホートリテンションデータを使用し、そうでない場合はクロスアプリの平均値を使用するようになりました。これにより、新しいアプリでも分析や A/B テストで実用的な予測が得られます。[詳細はこちら](predicted-ltv-and-revenue) - **Adapty UA でのすべてのイベント送信**: Meta と TikTok にコンバージョンの全体像を提供し、オーディエンスモデリングの精度を高めます。Adapty では、キャンペーンにマッチしたユーザーだけでなく、オーガニックや未アトリビューションユーザーのインストールおよびトランザクションをピクセルに転送できるようになりました。[Meta](ua-facebook#send-all-events) | [TikTok](ua-tiktok#send-all-events) - **ロシア語とトルコ語のドキュメント**: Adapty ドキュメントがロシア語(Русский)とトルコ語(Türkçe)で利用できるようになりました。上部ナビゲーションの言語セレクターで切り替えてください。 ## 2026年3月 \{#march-2026\} - **Developer CLI**: ダッシュボードを開かずにターミナルからAdaptyアカウントを管理できます。CLIを使うと、アプリの作成、アクセスレベルの定義、プロダクトのセットアップ、ペイウォールの作成、プレースメントの設定を行うことができ、自動化された環境でスクリプト化することも可能です。AIコーディングアシスタントがCLIを使いやすくなるための[Adapty CLIスキル](https://github.com/adaptyteam/adapty-cli/tree/main/skills/adapty-cli)も利用できます。[詳細を見る](developer-cli) - **Apple Ads ManagerのOverviewページ**: 主要なApple Ads指標をすべて1か所で確認でき、各指標にはトレンドチャートが表示されます。ヘッダーのドロップダウンでアプリを絞り込み、表示する指標のカスタマイズやチャートの種類・収益表示の調整も可能です。[詳細はこちら](ads-manager-overview) - **Apple Ads ManagerのMarket Intelligence**: 競合他社が50か国以上でどのキーワードに広告を出稿しているかを確認し、パフォーマンスの高いキーワードをキャンペーンに直接追加できます。[詳細はこちら](ads-manager-market-intelligence) - **Apple Ads Managerにおけるキーワードの完全サイクル自動化**: 定義したパフォーマンスルールに基づき、入札額の調整、キーワードの一時停止・有効化、広告グループ間の移動を自動で行えます。[詳細を見る](ads-manager-automations-keyword-rules) - **Apple Ads Managerにおける入札履歴**: 任意のキーワードのCPT入札額の変更ログ(変更日時、変更前後の値、トリガーとなった自動化ルール)を確認できます。[詳細を見る](ads-manager-manage-keywords#bid-history) - **Autopilotのビジュアルラウンド**: ペイウォールデザインの提案が、グロースプランのファーストクラスのラウンドとして追加されました。収益化ラウンドと並んでサイドバーに表示され、各ビジュアルラウンドにはデザインのモックアップ、そのパターンが最も効果的な場面の説明、および対象となる主要な指標が含まれています。[詳しくはこちら](autopilot-growth-plan#view-the-growth-plan) - **Autopilot に独自の仮説を追加する**: カスタムラウンドを追加して成長プランを拡張できます。タイトル、説明、ラウンドタイプ(マネタイゼーションまたはビジュアル)、目標指標、そしてマネタイゼーションラウンドの場合は関連プロダクトを設定できます。[詳細はこちら](autopilot-growth-plan#add-your-own-hypothesis) - **Autopilot ラウンドの並べ替え**: 成長プランのステージをドラッグして並べ替え、戦略に最適な順序で実験を実行できます。[詳細はこちら](autopilot) - **Autopilot のジオプライシングラウンド**: 成長プランの新しいラウンドタイプとして、国別の価格変更をテストできます。Market Insights のデータをもとに、Autopilot が各国で価格を上げるか、下げるか、維持するかを推奨します。推奨事項をジオプライシングラウンドとして追加すると、A/B テストとして実行できます(最大5件を同時実行可能)。[詳細はこちら](autopilot-growth-plan#geo-pricing-hypotheses) - **Apple Ads Managerの検索語句オートメーション**: 手動でレポートをダウンロードすることなく、勝利した検索語句を完全一致キーワードに自動的にプロモートし、ソースで除外できます。ルールはテンプレートから作成することも、カスタム条件やスケジュールを使って一から作成することもできます。[詳しくはこちら](ads-manager-automations-search-terms) - **Apple Ads ManagerのMaximize Conversions入札**: キャンペーン作成時に、入札戦略としてMaximize Conversionsを選択できるようになりました。Appleのアルゴリズムが、オプションの目標CPAをガイドラインとして、予算内でダウンロード数を最大化します。[詳細はこちら](ads-manager-create-campaign) - **Adapty UAでのFunnelFoxインテグレーション**: Adapty UAにFunnelFoxとの新しいインテグレーションが追加されました。[FunnelFox](ua-funnelfox) - **中国語ドキュメント**: Adaptyのドキュメントが中国語(中文)で利用できるようになりました。上部ナビゲーションの言語セレクターで言語を切り替えてください。 ## 2026年2月 \{#february-2026\} - **国別プロダクト価格設定**: Adapty ダッシュボードから直接、国ごとに異なる価格を設定できます。変更は App Store Connect と Google Play に自動で同期され、すべての価格更新は監査ログに記録されるため、変更を見逃すことはありません。[詳細を見る](edit-product) - **Autopilot における国レベルの競合価格比較**: 主要市場での競合他社のサブスクリプション価格と自社の価格を比較できます。[詳細を見る](autopilot-analysis#market-and-competitor-analysis) - **オンボーディングのバージョン管理**: オンボーディングのバージョンを完全な変更履歴とともに管理できます。変更内容を確認し、必要に応じてロールバックも可能です。 - **アナリティクスのペイウォールコンバージョンチャート**: 「ペイウォール表示 → トライアル」と「ペイウォール表示 → 有料」の2つの新しいコンバージョンチャートにより、ペイウォールが閲覧者をサブスクリプション登録者へどのように転換しているかを把握できます。[詳しくはこちら](analytics-conversion) - **セグメントの複製**: 既存のセグメントをすべてのフィルターごとコピーして、類似したセグメントをゼロから作り直す手間を省けます。重複するオーディエンスで複数のキャンペーンや A/B テストを実行する場合に便利です。[詳細を見る](segments#duplicate-segments) - **Adapty モバイルアプリでのプッシュ通知**: Adapty iOS アプリで 14 種類のイベントに対するプッシュ通知を設定することで、ダッシュボードを開かなくてもサブスクリプションの状況を把握できます。[詳細を見る](push-notifications) - **Kotlin Multiplatform SDK 3.15**: オンボーディングサポート、Webペイウォール、APIの改善を追加。[詳細はこちら](migration-to-kmp-315) - **Capacitor SDK 3.16**: Capacitor 8サポートを追加。Capacitor 7を使用しているプロジェクトはSDK v3.15のままにしてください。[詳細はこちら](migration-to-capacitor-316) - **LLM支援SDKインテグレーションガイド**: AIコーディングアシスタントの助けを借りてAdaptyを統合するためのステップバイステップガイド。ダッシュボードのセットアップから購入まで、実装全体をLLMと一緒に進められます。[iOS](adapty-cursor) | [Android](adapty-cursor-android) | [React Native](adapty-cursor-react-native) | [Flutter](adapty-cursor-flutter) | [Unity](adapty-cursor-unity) | [Kotlin Multiplatform](adapty-cursor-kmp) | [Capacitor](adapty-cursor-capacitor)。ワンコマンドの自動フローには、新しい**adapty-sdk-integration skill**(ベータ版)をお試しください: [iOS](adapty-sdk-integration-skill) | [Android](adapty-sdk-integration-skill-android) | [React Native](adapty-sdk-integration-skill-react-native) | [Flutter](adapty-sdk-integration-skill-flutter) | [Unity](adapty-sdk-integration-skill-unity) | [Kotlin Multiplatform](adapty-sdk-integration-skill-kmp) | [Capacitor](adapty-sdk-integration-skill-capacitor) ## 2026年1月 \{#january-2026\} - **Capacitor SDKが正式リリース**: Capacitor SDKが十分なテストを経て、プロダクション対応になりました。Adaptyとの完全な統合サポートにより、CapacitorでiOSおよびAndroid向けのサブスクリプションアプリを構築できます。[詳細はこちら](capacitor-sdk-overview) - **新規アプリ向けオートパイロット**: トランザクション履歴が少ないアプリでも、オートパイロット分析が利用できるようになりました。データに基づく価格最適化の提案を受け取り、初日から成長プランを作成できます。[詳細はこちら](autopilot) - **Autopilot のグローバル価格設定機会**: 国別の価格設定の推奨事項により、主要市場での収益ポテンシャルを把握できます。Autopilot は次の上位 5 か国のコンバージョン率と購買力を分析し、Adapty Pricing Index に基づいて価格を上げるべきか、下げるべきか、据え置くべきかについてデータに基づいたインサイトを提供します。[詳しくはこちら](autopilot) - **支払い回収のコンバージョン指標**: 支払い問題やグレース期間から回収された収益を追跡する新しいアナリティクスチャートが追加されました。「Billing issue converted」「Billing issue converted revenue」「Grace period converted」「Grace period converted revenue」の各指標で、リテンション回復の取り組みを測定できます。 - **Apple Ads Manager での広告管理**: プラットフォームを切り替えることなく、Adapty 内で直接 Apple Ads キャンペーンを作成・管理できます。[詳細を見る](ads-manager-manage-ads) - **Apple Ads Manager analytics**: Adapty 内で広告レベルの詳細なパフォーマンス指標とアトリビューションデータにアクセスできます。キャンペーンのパフォーマンス、広告グループのアナリティクス、アトリビューションのインサイトを統合ダッシュボードで確認できます。[詳細はこちら](adapty-ads-manager-analytics) - **Apple Ads アトリビューションチャート**: 複数のアトリビューション指標をカスタマイズ可能なチャートに組み合わせて、サブスクリプションデータと合わせて Apple Ads のパフォーマンスを分析できます。[詳細はこちら](adapty-ads-manager-analytics#charts) - **Apple Ads アトリビューション セグメント**: Apple Ads のアトリビューションデータをもとに、2クリックで素早くユーザーセグメントを作成できます。キャンペーン、広告グループ、またはキーワードでユーザーをターゲティングし、より精度の高い分析や実験を行いましょう。[詳しくはこちら](ads-manager-create-segments) - **新しいドキュメントプラットフォーム**: ドキュメントサイトを新しいプラットフォームに移行しました。検索・ナビゲーション・コンテンツ構成が強化され、機能の更新が迅速に行えるようになり、ユーザー体験が向上しています。 ## 2025年12月 \{#december-2025\} - **Apple Ads Manager ドキュメント**: Apple Search Ads のキャンペーンデータと収益指標を1つのアナリティクスダッシュボードで確認できます。新しいドキュメントでは、キャンペーンの作成、広告グループの管理、サブスクリプションのパフォーマンスと広告費用対効果のトラッキング方法を解説しています。[詳しく見る](ads-manager) - **アプリ内ウェブペイウォール**: アプリ内ブラウザを使ってウェブベースのペイウォールをアプリ内に表示し、外部へのリダイレクトなしでシームレスな体験を提供します。[iOS](ios-web-paywall#open-web-paywalls-in-an-in-app-browser) | [Android](android-web-paywall#open-web-paywalls-in-an-in-app-browser) | [React Native](react-native-web-paywall#open-web-paywalls-in-an-in-app-browser) | [Flutter](flutter-web-paywall#open-web-paywalls-in-an-in-app-browser) - **ローリングセグメント**: 動的なオーディエンスセグメントを作成できます。移動する時間ウィンドウに基づいて自動的に更新されるため、たとえば「過去7日以内にアプリをインストールしたユーザー」というセグメントを作成すると、常に最新のユーザーが表示された状態に保たれます。[詳細はこちら](segments#available-attributes) - **MetaおよびTikTokキャンペーン設定ガイド**: Meta(Facebook & Instagram)およびTikTokでキャンペーンを作成・追跡するためのステップバイステップのドキュメントです。コンバージョントラッキングやアナリティクス連携についても説明しています。[Meta](meta-create-campaign) | [TikTok](tiktok-create-campaign) - **手動ペイウォール実装クイックスタートガイド**: カスタムペイウォール UIにAdapty SDKを組み込む手順をステップバイステップで解説するクイックスタートガイドで、アプリ内課金をすばやく実装できます。[iOS](ios-implement-paywalls-manually) | [Android](android-implement-paywalls-manually) | [React Native](react-native-implement-paywalls-manually) | [Flutter](flutter-implement-paywalls-manually) | [Unity](unity-implement-paywalls-manually) | [Kotlin Multiplatform](kmp-quickstart-manual) | [Capacitor](capacitor-quickstart-manual) - **オンボーディングリンクのアプリ内ブラウザ対応**: オンボーディング内の外部リンクは、デフォルトでアプリ内ブラウザで開くようになり、ユーザーがアプリを離れません。必要に応じて外部ブラウザを使用するよう動作をカスタマイズすることも可能です。 [iOS](ios-present-onboardings#customize-how-links-open-in-onboardings) | [Android](android-present-onboardings#customize-how-links-open-in-onboardings) | [React Native](react-native-present-onboardings#customize-how-links-open-in-onboardings) - **Autopilot の提案が改善されました**: Autopilot がサブスクリプションデータをより詳細に分析し、価格最適化の提案精度が向上しました。[Autopilot を試す](autopilot) - **ドキュメントのダークモード対応**: ドキュメントがダークモードに対応しました。システム設定に合わせて自動切替、または右上のボタンで手動切替ができます。 --- # File: adapty-ecosystem --- --- title: "Adapty エコシステム" description: "Adapty はモバイルアプリ向けのアプリ内課金プラットフォームです。各プロダクトの役割と連携方法について説明します。" --- Adapty はモバイルアプリ向けのアプリ内課金プラットフォームで、「アプリを収益豊かにする」という一つのミッションのもとに構築されています。ユーザーの獲得・コンバージョン・サブスクリプション維持・離脱ユーザーの呼び戻しまで、収益成長に必要なすべてが揃っています。 サインアップ一度で、初日からAdatyのすべてのプロダクトにアクセスできます。Adaptyのロゴをクリックするだけでプロダクトを切り替えられます: - **Core** — StoreKitやGoogle Play Billingを直接触ることなく課金処理を行い、ノーコードでペイウォールをデザインし、収益をリアルタイムで追跡できます。他のプロダクトはこの基盤の上に構築されています。 - **Adapty Ads Manager** — Apple Adsの運用・最適化を、実際のサブスクリプション収益と照らし合わせながら行えます。 - **Adapty Attribution** — MMPなしで、収益を実際に生み出している広告チャネルを把握できます。 - **Adapty Mail** — 自動メールでトライアルユーザーをコンバートし、チャーンしたユーザーをウィンバックできます。 FunnelFox(ウェブからアプリへのファネルとホステッドチェックアウト)と **Adapty Finance**(将来のサブスクリプション収益を担保にした前払い)という2つのプロダクトも、コアの4つとともに提供されています。 ## プロダクトの全体像 \{#how-the-products-fit-together\} 各プロダクトは、ライフサイクルのそれぞれ異なるタイミングでユーザーに関わります。リンク付きの機能名にカーソルを合わせると簡単な説明が表示され、クリックするとドキュメントに移動します。
3. 表示された **Generate In-App Purchase Key** ウィンドウで、後から参照しやすいようにキーの名前を入力します。この名前はAdaptyでは使用されません。
4. **Generate** ボタンをクリックします。**Generate in-App Purchase Key** ウィンドウが閉じると、作成されたキーが **Active** リストに表示されます。
5. APIキーを生成したら、**Download In-App Purchase Key** ボタンをクリックして、キーをファイルとして取得します。
6. **Download in-App Purchase Key** ウィンドウで、**Download** ボタンをクリックします。ファイルがコンピューターに保存されます。
このファイルは、後でAdapty ダッシュボードにアップロードするために安全に保管することが非常に重要です。生成されたファイルはダウンロードが1回しかできないため、アップロードするまで安全に保管してください。**In-App Purchase**セクションで生成した.p8キーは、[AdaptyとApp Storeの初期連携設定](app-store-connection-configuration#step-3-upload-in-app-purchase-key-file)の際に使用されます。
**次のステップ:**
- [App Store連携を設定する](app-store-connection-configuration)
---
# File: app-store-connection-configuration
---
---
title: "App Store 連携を設定する"
description: "シームレスなサブスクリプション追跡のために App Store 接続を設定します。"
---
3. **Issuer ID** をコピーして、Adapty ダッシュボードの **In-app purchase Issuer ID** フィールドに貼り付けます。
4. **Key ID** をコピーして、Adapty ダッシュボードの **In-app purchase Key ID** フィールドに貼り付けます。
## ステップ 3. アプリ内購入キーファイルをアップロードする \{#step-3-upload-in-app-purchase-key-file\}
[App Store Connect でアプリ内購入キーを生成する](generate-in-app-purchase-key)セクションでダウンロードした **In-App Purchase Key** ファイルを
Adapty ダッシュボードの **Private key (.p8 file)** フィールドにアップロードします。
## ステップ 4. トライアルと特別オファー向け – プロモーションオファーを設定する \{#step-4-for-trials-and-special-offers--set-up-promotional-offers\}
:::important
このステップは、アプリに[トライアルやその他のプロモーションオファー](offers)がある場合に必要です。
:::
1. [ステップ 2](#step-2-provide-issuer-id-and-key-id) で使用したのと同じキー ID を、**App Store promotional offers** セクションの **Subscription key ID** フィールドにコピーします。
2. [ステップ 3](#step-3-upload-in-app-purchase-key-file) で使用したのと同じ **In-App Purchase Key** ファイルを、**App Store promotional offers** セクションの **Subscription key (.p8 file)** エリアにアップロードします。
## ステップ 5. App Store 共有シークレットを入力する \{#step-5-enter-app-store-shared-secret\}
**App Store shared secret**(App Store Connect Shared Secret とも呼ばれます)は、アプリ内購入とサブスクリプションのレシート検証に使用される 32 文字の16進数文字列です。
1. [App Store Connect](https://appstoreconnect.apple.com/apps) を開きます。アプリを選択し、**General** → **App Information** セクションに進みます。
2. **App-Specific Shared Secret** サブセクションまでスクロールします。
:::info
**App-Specific Shared Secret** サブセクションが表示されない場合は、Account Holder または Admin ロールを持っているか確認してください。Admin ロールを持っているにもかかわらず **App-Specific Shared Secret** サブセクションが表示されない場合は、アプリの Account Holder(App Store Connect でアプリケーションを作成した人)に App Store 共有シークレットを生成するよう依頼してください。その後、Admin にもサブセクションが表示されるようになります。
:::
3. **Manage** ボタンをクリックします。
4. 開いた **App-Specific Shared Secret** ウィンドウで、**Shared Secret** をコピーします。共有シークレットが表示されていない場合は、まず **Manage** または **Generate** のどちらか利用可能なボタンをクリックしてから、**Shared Secret** をコピーします。
5. コピーした **Shared Secret** を、Adapty ダッシュボードの **App Store shared secret** フィールドに貼り付けます。
6. Adapty ダッシュボードの **Save** ボタンをクリックして変更を確定します。
## ステップ 6. App Store Connect API キーを追加する \{#step-6-add-app-store-connect-api-key\}
App Store Connect API キーを生成して Adapty に追加すると、[Adapty ダッシュボードから App Store のプロダクトを管理](create-product#create-product-and-push-to-store)できるようになります。
1. App Store Connect で [**Users and Access > Integrations > Team keys**](https://appstoreconnect.apple.com/access/integrations/api) に移動し、**+** をクリックします。
2. **Generate API key** ウィンドウで、キーの名前を入力し、**Admin** アクセス権を付与します。
3. キーの横にある **Download** をクリックします。ダウンロードは一度しか行えません。
4. Adapty ダッシュボードで [**App settings > iOS SDK**](https://app.adapty.io/settings/ios-sdk) に移動し、**Connect API key** をクリックします。
5. ウィンドウの各フィールドに入力します:
- **Issuer ID**:[**Users and Access > Integrations > Team keys**](https://appstoreconnect.apple.com/access/integrations/api) からコピーします。**API keys** テーブルの上に表示されています。
- **Key ID**:[**Users and Access > Integrations > Team keys**](https://appstoreconnect.apple.com/access/integrations/api) からコピーします。**API keys** テーブルのキーの横に表示されています。
- **API key**:App Store Connect からダウンロードした API キーファイルをアップロードします。
6. **Connect** をクリックします。
**次のステップ**
- [App Store サーバー通知を有効にする](enable-app-store-server-notifications)
---
# File: enable-app-store-server-notifications
---
---
title: "App Store サーバー通知を有効にする"
description: "App Store サーバー通知を有効にして、サブスクリプションイベントをリアルタイムで追跡します。"
---
App Store サーバー通知を設定することは、データの正確性を確保するうえで非常に重要です。これにより、払い戻しやその他のイベントに関する情報を含む更新を App Store からリアルタイムで受け取ることができます。
:::important
App Store Server Notifications V2 を完全にサポートするには、Adapty iOS SDK 2.10.0 以降が必要です。
:::
1. Adapty ダッシュボードで **URL for App Store server notification** をコピーします。
2. [App Store Connect](https://appstoreconnect.apple.com/apps) を開きます。アプリを選択し、**General** → **App Information** セクションの **App Store Server Notifications** サブセクションに進みます。
3. コピーした **URL for App Store server notification** を **Production Server URL** と **Sandbox Server URL** フィールドに貼り付けます。
## 生イベントの転送 \{#raw-events-forwarding\}
Apple から生の S2S イベントを引き続き受け取りたい場合もあるかもしれません。Adapty を使用しながらこれを続けるには、**URL for forwarding raw Apple events** フィールドにエンドポイントを追加するだけで、Apple からの生イベントをそのままの形式で転送します。
**次のステップ**
以下のプラットフォーム向けに Adapty SDK を設定します:
- [iOS](sdk-installation-ios)
- [React Native](sdk-installation-reactnative)
- [Flutter](sdk-installation-flutter)
- [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)
- [Unity](sdk-installation-unity)
---
# File: troubleshoot-app-store-integration
---
---
title: "App Store インテグレーションのトラブルシューティング"
description: "保留中の契約、サーバー通知の遅延、価格の不一致など、Apple App Store のセットアップに関する一般的な問題を解決します。"
---
この記事では、App Store インテグレーションに関する一般的な問題を説明します。各セクションでは、症状・根本原因・解決方法を紹介します。
## プロダクトが表示されない \{#products-dont-appear\}
以下の 2 つの症状は、同じ根本原因を示しています。
- App Store Connect の API キーは正しく設定されているのに、Adapty がプロダクトをまったく取得できない。
- App Store Connect にプロダクトが存在するのに Adapty に表示されない、または期待より少ない数しか表示されない。購入を試みると SDK が「Product Id not found」と報告する。
最も一般的な根本原因は **Apple の契約が未署名** であることです — 有料契約・税務フォーム・銀行口座情報が保留中または未署名の状態になっています。契約が保留中の場合、App Store Connect API はプロダクト関連のエンドポイントに対してサイレントに 403 を返します。Adapty には明確なエラーが表示されず、プロダクトはサイレントに除外されます。
**App Store Connect → Agreements, Tax, and Banking** にアクセスして、保留中の契約にすべて署名してください。その後、Adapty の **App settings → iOS SDK** で再同期を行ってください。
## App Store Server Notifications が「Delayed」と表示される \{#app-store-server-notifications-show-delayed\}
App Store Connect で、App Store Server Notifications のステータスが **Delayed** と表示されることがあります。これは、Apple がサブスクリプションイベントの通知(更新・キャンセル・請求エラーなど)の送信を遅延させており、キューに入れられた通知が遅れて届くことを意味します。
インストール統計には影響しません。Adapty はインストールをサーバー側の通知からではなく、アプリの初回起動時にカウントします。
更新やキャンセルのデータが遅れている場合、Delayed ステータスが最も可能性の高い原因です。Apple がバックログを処理するにつれて、通常は自動的に解消されます。
## Adapty の価格が App Store と一致しない \{#prices-in-adapty-dont-match-app-store\}
Adapty のプロダクト編集ページの **price** フィールドは、プロダクトの追加方法によって動作が異なります。
Adapty でプロダクトを作成してダッシュボードからストアにプッシュする場合、この価格が初期ストア価格として使用されます。
すでにストアに存在するプロダクトを追加する場合、この価格はプレースホルダーです。Adapty のアナリティクス・インテグレーション・SDK は、App Store から取得した実際の価格を使用します。App Store の価格変更はプレースホルダーに同期されません。また、現時点ではダッシュボードからプレースホルダーを編集することもできません。
## CSV の価格エクスポートが空になる \{#csv-price-export-is-empty\}
CSV の価格エクスポートに列ヘッダーしか含まれていない場合、App Store Connect の API キーが完全に設定されていません。[ステップ 6 — App Store Connect API キーを追加する](app-store-connection-configuration#step-6-add-app-store-connect-api-key) を参照してください。
## 新しいプロダクトを App Store にプッシュできない \{#cant-push-new-products-to-app-store\}
Adapty はダッシュボードでプロダクトを作成したときに、App Store Connect にプッシュできます。App Store インテグレーションが完全に設定されていない場合、プッシュオプションはブロックされます。以下の 2 つの設定が必要です。
- **Apple app ID**: [ステップ 1 — Bundle ID と Apple app ID を入力する](app-store-connection-configuration#step-1-provide-bundle-id-and-apple-app-id) で設定してください。
- **App Store Connect API key**: [ステップ 6 — App Store Connect API キーを追加する](app-store-connection-configuration#step-6-add-app-store-connect-api-key) で設定してください。
---
# File: enabling-of-devepoler-api
---
---
title: "Google Play ConsoleでDeveloper APIを有効にする"
description: "AdaptyのDeveloper APIを有効にして、アプリのサブスクリプション管理を自動化・効率化しましょう。"
---
3. [**Google Play Android Developer API**](https://console.cloud.google.com/apis/library/androidpublisher.googleapis.com) ページを開きます。
4. **Enable** ボタンをクリックし、ステータスが **Enabled** になるまで待ちます。これでGoogle Android Developer APIが有効になります。
5. [**Google Play Developer Reporting API**](https://console.cloud.google.com/apis/library/playdeveloperreporting.googleapis.com) ページを開きます。
6. **Enable** ボタンをクリックし、ステータスが **Enabled** になるまで待ちます。
7. [**Cloud Pub/Sub API**](https://console.cloud.google.com/marketplace/product/google/pubsub.googleapis.com) ページを開きます。
8. **Enable** ボタンをクリックし、ステータスが **Enabled** になるまで待ちます。
Developer APIが有効になりました。
Google Cloud Consoleの [**APIs & Services**](https://console.cloud.google.com/apis/dashboard) ページで確認できます。ページを下にスクロールし、ページ下部の表に以下の3つのAPIがすべて含まれていることを確認してください:
- Google Play Android Developer API
- Google Play Developer Reporting API
- Cloud Pub/Sub API
**次のステップ**
- [Google Cloud Consoleでサービスアカウントを作成する](create-service-account)
---
# File: create-service-account
---
---
title: "Google Cloud ConsoleでServiceアカウントを作成する"
description: "Adaptyで安全なAPIアクセスのためのサービスアカウントの作成方法を学びましょう。"
---
Adaptyがデータアクセスを自動化するには、Google Play Consoleにサービスアカウントが必要です。
1. Google Cloud Consoleの[**IAM & Admin** -> **Service accounts**](https://console.cloud.google.com/iam-admin/serviceaccounts)セクションを開きます。正しいプロジェクトを使用していることを確認してください。
2. **Service accounts**ウィンドウで、**Create service account**ボタンをクリックします。
3. **Create service account**ウィンドウの**Service account details**サブセクションで、任意の**Service Account Name**を入力します。このアカウントの目的を明示するために、名前に「Adapty」を含めることをおすすめします。**Service account ID**は自動的に作成されます。
4. サービスアカウントのメールアドレスをコピーして、後で使用できるように保存しておきます。
5. **Create and continue**ボタンをクリックします。
6. **Grant this service account access to project**サブセクションの**Select a role**ドロップダウンリストで、**Pub/Sub -> Pub/Sub Admin**を選択します。このロールは、リアルタイム開発者通知を有効にするために必要です。
7. **Add another role**ボタンをクリックします。
8. 新しい**Role**ドロップダウンリストで、**Monitoring -> Monitoring Viewer**を選択します。このロールは、通知キューの監視を許可するために必要です。
9. **Continue**ボタンをクリックします。
10. 変更を加えずに**Done**ボタンをクリックします。**Service accounts**ウィンドウが開きます。
**次のステップ**
- [Google Play Consoleでサービスアカウントに権限を付与する](grant-permissions-to-service-account)
---
# File: grant-permissions-to-service-account
---
---
title: "Google Play ConsoleでサービスアカウントにGoogle Play Consoleを付与する"
description: "安全で効率的なAPIアクセスのため、サービスアカウントに権限を付与します。"
---
Adaptyがサブスクリプションの管理と購入の検証に使用するサービスアカウントに、必要な権限を付与します。
1. Google Play Consoleの[**Users and permissions**](https://play.google.com/console/u/0/developers/8970033217728091060/users-and-permissions)ページを開き、**Invite new users**ボタンをクリックします。
2. **Invite user**ページで、作成したサービスアカウントのメールアドレスを入力します。
3. **Account permissions**タブに切り替えます。
4. 以下の権限を選択します:
- View app information and download bulk reports (read-only)
- View financial data, orders, and cancellation survey responses
- Manage orders and subscriptions
- Manage store presence
5. **Invite user**ボタンをクリックします。
6. **Send invite?**ウィンドウで、**Send invite**ボタンをクリックします。サービスアカウントがユーザーリストに表示されます。
**次のステップ**
- [Google Play Consoleでサービスアカウントキーファイルを生成する](create-service-account-key-file)
---
# File: create-service-account-key-file
---
---
title: "Google Play ConsoleでサービスアカウントキーファイルをGoogleする"
description: "Adaptyとのシームレスな連携のためのサービスアカウントキーファイルの作成方法を学びましょう。"
---
Play StoreのモバイルアプリをAdaptyと連携するには、Google Play Consoleで特別なサービスアカウントキーファイルを生成してAdaptyにアップロードする必要があります。これらのファイルはアプリのセキュリティを強化し、不正アクセスを防ぎます。
:::warning
新しいサービスアカウントが有効になるまで、通常は少なくとも24時間かかります。ただし、[回避策](https://stackoverflow.com/a/60691844)があります。[Google Play Console](https://play.google.com/apps/publish/)でサービスアカウントを作成した後、任意のアプリを開いて **Monetize** -> **Products** -> **Subscriptions/In-app products** に移動します。任意のプロダクトの説明を編集して保存すると、サービスアカウントがすぐに有効化されます。その後、変更を元に戻すことができます。
:::
1. Google Play Consoleの[**Service accounts**](https://console.cloud.google.com/iam-admin/serviceaccounts)セクションを開きます。正しいプロジェクトが選択されていることを確認してください。
2. 開いたウィンドウで **Add key** をクリックし、ドロップダウンメニューから **Create new key** を選択します。
3. **Create private key for [Your_project_name]** ウィンドウで **Create** をクリックします。秘密鍵がJSONファイルとしてコンピューターに保存されます。**Private key saved to your computer** ウィンドウに表示されたファイル名を使って確認できます。
4. **Create private key for Your_project_name** ウィンドウで **Create** ボタンをクリックします。これにより、秘密鍵がJSONファイルとしてコンピューターに保存されます。必要に応じて、表示された **Private key saved to your computer** ウィンドウのファイル名を使ってファイルを見つけることができます。
このファイルは、[Google Play Store連携を設定する](google-play-store-connection-configuration)際に必要になります。
:::warning
新しいサービスアカウントが有効になるまで、通常は少なくとも24時間かかります。ただし、[回避策](https://stackoverflow.com/a/60691844)があります。[Google Play Console](https://play.google.com/apps/publish/)でサービスアカウントを作成した後、任意のアプリを開いて **Monetize** -> **Products** -> **Subscriptions/In-app products** に移動します。任意のプロダクトの説明を編集して保存すると、サービスアカウントがすぐに有効化されます。その後、変更を元に戻すことができます。
:::
**次のステップ**
- [Google Play Store連携を設定する](google-play-store-connection-configuration)
---
# File: google-play-store-connection-configuration
---
---
title: "Google Play Storeとの連携を設定する"
description: "AdaptyでGoogle Play Storeの接続を設定し、アプリ内課金をスムーズに処理しましょう。"
---
このセクションでは、Google Play経由で販売されているモバイルアプリをAdaptyと連携する手順を説明します。Play StoreのアプリケーションデータをAdapty ダッシュボードに入力する必要があります。この作業は、AdaptyがPlay Storeから購入を検証し、サブスクリプションの更新情報を受け取るために欠かせないステップです。
この設定は初回オンボーディング時に行うか、後からAdapty ダッシュボードの **App Settings** で変更できます。
:::danger
設定の変更は、Adaptyのペイウォールをアプリにリリースするまでのみ許容されます。リリース後に変更すると連携が壊れ、モバイルアプリでペイウォールが表示されなくなります。
:::
## ステップ1. パッケージ名を入力する \{#step-1-provide-package-name\}
パッケージ名は、Google Play StoreにおけるアプリのユニークなIDです。サブスクリプション処理などAdaptyの基本機能に必要です。
1. [Google Play Developer Console](https://play.google.com/console/u/0/developers)を開きます。
2. IDを確認したいアプリを選択します。**Dashboard** 画面が開きます。
3. アプリケーション名の下にあるプロダクトIDを確認し、コピーします。
4. AdaptyトップメニューからA[**App settings**](https://app.adapty.io/settings/android-sdk)を開きます。
5. **App settings** 画面の **Android SDK** タブで、コピーした **Package name** を貼り付けます。
## ステップ2. アカウントキーファイルをアップロードする \{#step-2-upload-the-account-key-file\}
1. [サービスアカウントキーファイルの作成](create-service-account)ステップで作成したサービスアカウントの秘密鍵ファイル(JSON形式)を、**Service account key file** エリアにアップロードします。
変更を確定するために、**Save** ボタンをクリックするのを忘れずに。
**次のステップ**
- [Google Play ConsoleでRTDN(リアルタイム デベロッパー通知)を有効にする](enable-real-time-developer-notifications-rtdn)
---
# File: enable-real-time-developer-notifications-rtdn
---
---
title: "Google Play ConsoleでリアルタイムデベロッパーNotification(RTDN)を有効にする"
description: "Google Play ConsoleでリアルタイムデベロッパーNotification(RTDN)を有効にしてAdaptyのデータ精度を維持しましょう。払い戻しやその他の重要なイベントに関する即時更新を受け取るためのRTDNセットアップ方法を学びます"
---
リアルタイムデベロッパーNotification(RTDN)を設定することは、データ精度を確保するうえで非常に重要です。これにより、払い戻しやその他のイベントに関する情報を含む、Play Storeからの更新をリアルタイムで受け取れるようになります。
## 通知を有効にする \{#enable-notifications\}
1. **Google Cloud Pub/Sub** が有効になっていることを確認してください。[こちらのリンク](https://console.cloud.google.com/flows/enableapi?apiid=pubsub)を開き、アプリのプロジェクトを選択します。**Google Cloud Pub/Sub** をまだ有効にしていない場合は、ここで有効にする必要があります。
2. Adaptyのトップメニューから [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) に移動し、**Google Play RTDN topic name** タイトルの横にある **Enable Pub/Sub API** フィールドの内容をコピーします。
:::note **Enable Pub/Sub API** フィールドの内容が正しくない形式の場合(正しい形式は `projects/...` で始まります)、[Enable Pub/Sub APIフィールドの形式を修正する](enable-real-time-developer-notifications-rtdn#fixing-incorrect-format-in-enable-pubsub-api-field) セクションを参照してください。 ::: 3. [Google Play Console](https://play.google.com/console/) を開き、アプリを選択して、**Monetize with Play** -> **Monetization setup** に進みます。**Google Play Billing** セクションで、**Enable real-time notifications** チェックボックスをオンにします。 4. Adaptyの **App Settings** でコピーした **Enable Pub/Sub API** フィールドの内容を、**Topic name** フィールドに貼り付けます。 5. Google Play Consoleで **Save changes** をクリックします。
## 通知をテストする \{#test-notifications\}
リアルタイムデベロッパーNotificationへの登録が成功したかどうかを確認するには:
1. Google Play Consoleの設定で変更を保存します。
2. Google Play Consoleの **Topic name** の下にある **Send test notification** をクリックします。
3. AdaptyのメニューにあるトップメニューからAdaptyの [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) に移動します。テスト通知が送信されると、トピック名の上にそのステータスが表示されます。
## Enable Pub/Sub APIフィールドの形式を修正する \{#fixing-incorrect-format-in-enable-pubsub-api-field\}
**Enable Pub/Sub API** フィールドの内容が誤った形式の場合(正しい形式は `projects/...` で始まります)、以下の手順に従って問題を解決してください。
### 1. APIの有効化と権限を確認する \{#1-verify-api-enablement-and-permissions\}
必要なAPIがすべて有効になっており、サービスアカウントに正しく権限が付与されていることを慎重に確認してください。これらの手順をすでに完了している場合でも、サブステップが抜けていないことを確かめるために再度確認することが重要です。以下のセクションの手順を繰り返してください:
1. [Google Play ConsoleでデベロッパーAPIを有効にする](enabling-of-devepoler-api)
2. [Google Cloud Consoleでサービスアカウントを作成する](create-service-account)
3. [Google Play Consoleでサービスアカウントに権限を付与する](grant-permissions-to-service-account)
4. [Google Play Consoleでサービスアカウントのキーファイルを生成する](create-service-account-key-file)
5. [Google Play Storeインテグレーションを設定する](google-play-store-connection-configuration)
### 2. ドメインポリシーを調整する \{#2-adjust-domain-policies\}
**Domain restricted contacts** および **Domain restricted sharing** ポリシーを変更します:
1. [Google Cloud Console](https://console.cloud.google.com/) を開き、アプリを管理するためのサービスアカウントを作成したプロジェクトを選択します。
2. **Quick Access** セクションで、**IAM & Admin** を選択します。
3. 左ペインで **Organization Policies** を選択します。
4. **Domain restricted contacts** ポリシーを見つけます。
5. **Actions** 列の省略記号ボタンをクリックし、**Edit policy** を選択します。
6. ポリシー編集ウィンドウで:
1. **Policy source** の下で、**Override parent's policy** ラジオボタンを選択します。
2. **Policy enforcement** の下で、**Replace** ラジオボタンを選択します。
3. **Rules** の下で、**ADD A RULE** ボタンをクリックします。
4. **New rule** -> **Policy values** の下で、**Allow All** を選択します。
5. **SET POLICY** をクリックします。
7. **Domain restricted sharing** ポリシーについても、手順4〜6を繰り返します。
最後に、**Google Play RTDN topic name** タイトルの横にある **Enable Pub/Sub API** フィールドの内容を再作成します。フィールドは正しい形式になります。
リアルタイムデベロッパーNotification(RTDN)の有効化に成功したら、更新したポリシーの **Policy source** を **Inherit parent's policy** に戻すことを忘れずに行ってください。
## 生イベントの転送 \{#raw-events-forwarding\}
場合によっては、Googleからの生のS2Sイベントを引き続き受け取りたいこともあるでしょう。Adaptyを使用しながらそれらを受け取り続けるには、**URL for forwarding raw Google events** フィールドにエンドポイントを追加するだけで、Googleからの生イベントをそのまま送信します。
---
**次のステップ**
以下のプラットフォーム向けにAdapty SDKを設定します:
- [Android](sdk-installation-android)
- [React Native](sdk-installation-reactnative)
- [Flutter](sdk-installation-flutter)
- [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)
- [Unity](sdk-installation-unity)
---
# File: stripe
---
---
title: "Stripeとの初期連携"
description: "StripeをAdaptyと連携して、サブスクリプション決済をシームレスに処理しましょう。"
---
Adaptyは、[Stripe](https://stripe.com/)を通じたウェブ決済・サブスクリプションを追跡することで、web2appのサブスクリプションフローをサポートしています。
この連携は、ウェブ起点の購入(Stripe Checkout、ホスト型決済ページ、またはカスタムウェブフロー)に対応しており、モバイルアプリのアクセスやアナリティクスと同期します。
以下のようなシナリオで役立ちます:
- ウェブで購入した後にアプリをインストールしてログインしたユーザーに、有料機能へのアクセスを自動的に付与する
- コホート、予測、その他のアナリティクスツールを含む、すべてのサブスクリプションアナリティクスをAdapty ダッシュボード一か所で管理する
ウェブ購入はアプリにとってますます一般的になりつつありますが、Apple App Storeがアプリ内課金以外のシステムを許可しているのはアメリカ国内のデジタルコンテンツに限られています。他の国でウェブサブスクリプションをアプリ内で宣伝しないようにしてください。違反するとアプリが審査で却下されたり、BANされる可能性があります。
以下の手順でStripe連携を設定します。
:::important
この連携は、Stripeのウェブ購入の追跡と同期を目的としています。アプリからウェブチェックアウトにユーザーを誘導する場合は、[ウェブペイウォール](web-paywall)をご覧ください。
:::
## 1\. StripeをAdaptyに接続する \{#1-connect-stripe-to-adapty\}
この連携は主に、AdaptyがWebhook経由でStripeからサブスクリプションデータを取得することで機能します。そのため、APIキーを提供し、AdaptyのWebhook URLをStripeに設定することで、AdaptyアカウントとStripeアカウントを接続する必要があります。Webhookのセットアップをできるだけラクにするために、StripeにAdatyアプリをインストールしてください:
:::note
以下の手順はStripeのProductionモードとTestモードで共通ですが、それぞれ異なるAPIキーを使用する必要があります。
:::
0. テストモードとライブモードのどちらでStripeを接続するかを決めます。最初にテストモードで設定する場合は、後でライブモードでも同じ手順を繰り返す必要があります。
1. [Stripe App Marketplace](https://marketplace.stripe.com/apps/adapty)にアクセスしてAdatyアプリをインストールします。サンドボックスモードではアプリのインストールに対応していないため、本番環境またはテストモードでのみ実行できます。
2. アプリに必要な権限を付与します。これにより、Adaptyがサブスクリプションデータと履歴にアクセスできるようになります。その後、**Continue to app settings** をクリックして続行します。
権限ポップアップの下部で、ライブモードまたはテストモードのどちらでアプリをインストールするかを選択できます。
3. ポップアップで新しい制限付きキーを生成します。メール、Touch ID、またはセキュリティキーを使って本人確認が必要です。キーを生成した後は再度確認できないため、パスワードマネージャーや秘密管理ストアに安全に保存してください。
4. ポップアップから生成されたキーをコピーし、Adaptyの[App Settings → Stripe](https://app.adapty.io/settings/stripe)に移動します。モードに合わせて **Stripe App Restricted API Key** セクションにキーを貼り付けます。テストモードとライブモードでは異なるキーを生成する必要があることに注意してください。
以上で完了です!次は、Stripeでプロダクトを作成してAdaptyに追加しましょう。
2. **Secret key** タイトルの横にある **Reveal live (test) key button** をクリックしてキーをコピーし、Adaptyの[App Settings → Stripe](https://app.adapty.io/settings/stripe)に移動します。ここにキーを貼り付けます:
3. 次に、AdaptyのStripe設定ページ下部からWebhook URLをコピーします。Stripeの[**Developers** → **Webhooks**](https://dashboard.stripe.com/webhooks)に移動し、**Add endpoint** ボタンをクリックします:
4. AdaptyのWebhook URLを **Endpoint URL** フィールドに貼り付けます。次にWebhookの **Version** フィールドで **Latest API version** を選択します。その後、以下のイベントを選択します:
- charge.refunded
- customer.subscription.created
- customer.subscription.deleted
- customer.subscription.paused
- customer.subscription.resumed
- customer.subscription.updated
- invoice.created
- invoice.updated
- payment_intent.succeeded
5. "Add endpoint" を押し、"Signing secret" の下にある "Reveal" を押します。これはAdapty側でWebhookデータを復号するために使用されるキーです。表示後にコピーしてください:
6. 最後に、このキーをAdaptyの App Settings → Stripe の "Stripe Webhook Secret" に貼り付けます:
:::warning
現時点でAdaptyがサポートしているのは、**Flat rate**(例:$9.99/月)または **Package pricing**(例:$9.99/10ユニット)のみです。これらはアプリストアと同様の動作をします。**Tiered pricing**、**Usage-based fee**、**Customer chooses price** のオプションはサポートされていません。
:::
## 3\. StripeプロダクトをAdatyに追加する \{#3-add-stripe-products-to-adapty\}
:::warning
プロダクトは必須です!Adapty ダッシュボードでStripeプロダクトを作成してください。Adaptyはこれらのプロダクトに紐づいたトランザクションのイベントのみ追跡します。このステップをスキップすると、トランザクションイベントが作成されません。
:::
AdaptyではStripeをApp StoreやGoogle Playと同様に扱います。つまり、デジタルプロダクトを販売する別のストアとして設定します。設定方法も同様で、StripeプロダクトのIDを(`product_id`と`price_id`を)AdaptyのProductsセクションに追加するだけです:
StripeのプロダクトIDは `prod_...`、価格IDは `price_...` の形式になっています。Stripeの[Product Catalog](https://dashboard.stripe.com/products?active=true)でプロダクトを開けば、簡単に確認できます:
必要なプロダクトをすべて追加したら、次はStripeに購入者のユーザーIDを伝える設定をしましょう。これにより、AdaptyがStripeからの情報を正しく取り込めるようになります。
## 4\. ウェブ購入にユーザーIDを付加する \{#4-enrich-purchases-made-on-the-web-with-your-user-id\}
Adaptyは、アクセスレベルの付与・更新において、Stripeからのwebhookを唯一の情報源として利用しています。ただし、この連携を正しく機能させるためには、Stripe連携時にお客様側から追加情報を提供する必要があります。
プラットフォーム(ウェブまたはモバイル)を横断して一貫したアクセスレベルを維持するには、AdaptyがWebhookから認識できる単一のユーザーIDに依存する必要があります。これはユーザーのメールアドレス、電話番号、または利用している認証システムのその他のIDが使えます。
ユーザーを識別するためにどのIDを使用するかを決めてください。次に、Stripeで決済を初期化しているコード部分にアクセスし、そのユーザーIDを[Stripe Subscription](https://docs.stripe.com/api/subscriptions/object#subscription_object-metadata)(`sub_...`)または[Checkout Session](https://docs.stripe.com/api/checkout/sessions/create#create_checkout_session-metadata)オブジェクト(`ses_...`)の`metadata`に`customer_user_id`として以下のように追加してください:
```json showLineNumbers title="Stripe Metadata contents"
{'customer_user_id': "YOUR_USER_ID"}
```
コードに必要な変更はこれだけです。これにより、AdaptyはStripeから受け取ったすべてのWebhookを解析し、この`metadata`を抽出して、サブスクリプションを正しくユーザーに紐付けます。
:::warning
ユーザーIDは必須です
これがなければ、ユーザーを特定してモバイル側でアクセスレベルを付与する方法がありません。
`metadata`に`customer_user_id`を指定しない場合は、AdaptyがStripeの他の情報からIDを探すよう設定できます:StripeのCustomerオブジェクトの`email`、またはStripeのSessionの`client_reference_id`のいずれかです。
プロファイル作成の挙動の設定方法については[こちら](stripe#profile-creation-behavior)をご覧ください。
:::
:::note
StripeのCustomerも必須です
Checkout Sessionsを使用している場合は、`customer_creation`を`always`に設定して[Stripe Customerを作成する](https://docs.stripe.com/api/checkout/sessions/create#create_checkout_session-customer_creation)ようにしてください。
:::
## 5\. モバイルユーザーへのアクセス付与 \{#5-provide-access-to-users-on-the-mobile\}
ウェブから来たモバイルユーザーが有料機能にアクセスできるようにするには、前のステップで提供したのと同じ`customer_user_id`を使って`Adapty.activate()`または`Adapty.identify()`を呼び出すだけです(詳細は
2. キーに名前を付け、有効期限を設定します。AdapyでAPIキーを機能させるには、すべてのエンティティに対して**Read**権限を付与する必要があります。**Save**をクリックします。
3. **Copy key**をクリックします。
4. Adaptyで[App Settings → Paddle](https://app.adapty.io/settings/paddle)に移動し、**Paddle API key**セクションにキーを貼り付けます。
:::warning
Paddle APIキーに有効期限を設定した場合、有効期限が切れる前に手動で新しいキーを生成し、Adaptyで更新する必要があります。キーが期限切れになると、警告なしに連携が停止し、ユーザーが購入できなくなります。
:::
### 1.2. Adaptyに送信するイベントの追加 \{#12-add-events-that-will-be-sent-to-adapty\}
1. AdapyのPaddleページから**Webhook URL**をコピーします。
2. Paddleで[**Developer Tools → Notifications**](https://vendors.paddle.com/notifications-v2)に移動し、**New destination**をクリックしてウェブフックを追加します。
3. ウェブフックにわかりやすい名前を付けます。後で簡単に見つけられるよう、名前に「Adapty」を含めることをお勧めします。
4. AdapyからコピーしたWebhook URLを**URL**フィールドに貼り付けます。正しい環境のウェブフックを使用していることを確認してください。
5. **Notification type**を**Webhook**に設定します。
6. 以下のイベントを選択します:
- `subscription.created`
- `subscription.updated`
- `transaction.created`
- `transaction.updated`
- `adjustment.created`
- `adjustment.updated`
7. **Save destination**をクリックしてウェブフックの設定を完了します。
### 1.3. ウェブフックシークレットキーの取得と追加 \{#13-retrieve-and-add-the-webhook-secret-key\}
1. **Notifications**ウィンドウで、作成したウェブフックの横にある三点ドットをクリックし、**Edit destination**を選択します。
2. **Edit destination**パネルに**Secret key**という新しいフィールドが表示されます。それをコピーします。
3. Adaptyで[App Settings → Paddle](https://app.adapty.io/settings/paddle)に移動し、**Notification secret key**フィールドにキーを貼り付けます。このキーはAdapyでウェブフックデータを検証するために使用されます。
### 1.4. PaddleのカスタマーとAdapyのプロファイルを対応付ける \{#14-match-paddle-customers-with-adapty-profiles\}
Adaptyは、アプリ内で使用できるよう各購入を[カスタマープロファイル](profiles-crm)に紐付ける必要があります。デフォルトでは、AdapyがPaddleからウェブフックを受信したときにプロファイルが自動的に作成されます。Adaptyの`customer_user_id`として使用する値を選択できます:
1. **デフォルト・推奨:** `custom_data`フィールドで渡す`customer_user_id`([Paddleドキュメント](https://developer.paddle.com/build/transactions/custom-data)参照)
2. PaddleのCustomerオブジェクトの`email`([Paddleドキュメント](https://developer.paddle.com/paddle-js/methods/paddle-checkout-open/#parameters)参照)
3. `ctm-...`形式のPaddle Customer ID([Paddleドキュメント](https://developer.paddle.com/paddle-js/methods/paddle-checkout-open/#parameters)参照)
4. プロファイルを作成しない。カスタマープロファイルをより細かく制御して自分で管理したい場合はこのオプションを選択します。
使用する値は[App Settings → Paddle](https://app.adapty.io/settings/paddle)の**Profile creation behavior**フィールドで設定できます。
## 2. AdapyにPaddleプロダクトを追加する \{#2-add-paddle-products-to-adapty\}
:::warning
PaddleプロダクトをAdapty ダッシュボードに追加するか、既存のプロダクトにPaddleプロダクトIDを追加してください。Adaptyは、これらのプロダクトに紐付いたトランザクションのイベントのみを追跡します。この手順をスキップすると、トランザクションイベントが作成されません。
:::
PaddleはApp StoreやGoogle Playと同様にAdapyで動作します。つまり、デジタルプロダクトを販売するもう一つのプラットフォームです。設定するには、Adaptyの[Products](https://app.adapty.io/products)セクションで、Paddleの関連する`product_id`と`price_id`の値を追加します。
Paddleでは、プロダクトIDは`pro_...`、価格IDは`pri_...`の形式です。特定のプロダクトを開くと、[Paddleプロダクトカタログ](https://vendors.paddle.com/products-v2)で確認できます:
プロダクトを追加したら、次のステップはAdapyが購入を正しいユーザーに紐付けられるようにすることです。
## 3. モバイルでユーザーにアクセスを付与する \{#3-provide-access-to-users-on-the-mobile\}
ウェブで購入したユーザーがモバイルでもアクセスできるようにするには、購入時に渡したものと同じ`customer_user_id`を使って`Adapty.activate()`または`Adapty.identify()`を呼び出します。詳細は[ユーザーの識別](identifying-users)をご覧ください。
## 4. 連携をテストする \{#4-test-your-integration\}
すべての設定が完了したら、連携をテストできます。PaddleのTest環境で行われたトランザクションはAdapyに**Test**として表示されます。本番環境のトランザクションは**Production**として表示されます。
連携が完了しました。ユーザーはウェブサイトでサブスクリプションを購入し、モバイルアプリのプレミアム機能に自動的にアクセスできるようになります。また、統合されたAdapy ダッシュボードですべてのサブスクリプション分析を追跡できます。
## 重要な注意事項 \{#important-considerations\}
- Adaptyの分析では、トランザクション金額に税金とPaddle手数料が含まれます。これはPaddleダッシュボードとは異なり、Paddleでは税金と手数料を差し引いた金額が表示されます。そのため、Adaptyに表示される数値はPaddleダッシュボードの数値より高くなります。
- 他のストアとは異なり、Paddleでの返金は特定のトランザクションのみに影響し、サブスクリプションを自動的にキャンセルしません。サブスクリプションは明示的にキャンセルされない限り有効なままです。
- `custom_data`フィールドに`variation_id`を含めることで、購入を特定のペイウォールインスタンスに紐付けることもできます。Adaptyはウェブフックからこのデータを処理し、分析に含めます。
### 有料トライアル \{#paid-trials\}
Paddleで有料トライアルを使用する場合、Adaptyで2つのプロダクトを作成する必要があります:
1. 非サブスクリプションプロダクトを作成し、トライアル期間の料金を請求するPaddle価格に紐付けます。
2. サブスクリプションプロダクト(月次/週次など)を作成し、無料トライアルコンポーネントを持つPaddle価格に紐付けます。
Paddleの観点では、これは1つのプロダクトに2つの価格が含まれる単一のトランザクションです。1つはトライアル料金(例:$0.99)、もう1つは無料トライアル($0.00)の価格です。
Adaptyの観点では、これにより2つの別々のイベントが作成されます:トライアル支払いの非サブスクリプション購入と、サブスクリプションプロダクトのトライアル開始イベントです。
例えば、ユーザーが月額$9.99のサブスクリプションに対して$0.99の有料トライアルを開始すると、Paddleは両方の価格を含む1つのトランザクションを作成しますが、Adaptyはこれを$0.99の非サブスクリプション購入(即時支払い)と$0.00のトライアル開始イベント(将来的に月額$9.99のサブスクリプション)として処理します。
:::note
ユーザーが有料トライアルをキャンセルすると、**Trial expired**と**Trial renewal canceled**イベントが発生します。
:::
## Paddleデータをさらに活用する \{#get-more-from-your-paddle-data\}
:::important
PaddleイベントをインテグレーションS(integrations)で動作させるには、ユーザーが少なくとも一度App Store / Google Playアカウントでアプリにログインする必要があります。
:::
Paddleとの連携が完了すると、Adaptyはすぐに分析情報を提供できる状態になります。Paddleデータを最大限に活用するには、追加のAdapy連携を設定してPaddleイベントを転送し、すべてのサブスクリプション分析を単一のAdapy ダッシュボードに集約できます。
Paddleイベントの転送と分析に使用できる連携:
- [AppsFlyer](appsflyer)
- [Webhook](webhook)
- [Posthog](posthog)
## 現在の制限事項 \{#current-limitations\}
- **キャンセル**: Paddleにはサブスクリプションキャンセルの2つのオプションがあります:
1. 即時キャンセル:サブスクリプションが即座にキャンセルされます。
2. 期間終了時のキャンセル:現在の請求期間が終了した時点でサブスクリプションがキャンセルされます(アプリストアのアプリ内サブスクリプションと同様)。
- **返金**: Adaptyは全額返金と部分返金を追跡します。
- **グレース期間**: デフォルトでは、Paddleは請求の問題に対して30日間の固定グレース期間を適用し、その間サブスクリプションは有効なままです。[グレース期間の長さと期間終了後のアクション(サブスクリプションの一時停止またはキャンセル)はカスタマイズできます](https://developer.paddle.com/build/retain/configure-payment-recovery-dunning#prerequisites)。
**トライアル**: トライアル終了後に支払いの収集が失敗した場合、サブスクリプションのステータスは`past_due`に変わります。本番環境では、PaddleのRetainがダニングウィンドウを適用してサブスクリプションがキャンセルまたは一時停止される前に支払い回収を試みます。サンドボックスではRetainが利用できないため、支払いの再試行は行われず、サブスクリプションは無期限で`past_due`のままになります。
---
**関連情報:**
- [PaddleでのPurchaseを検証し、アクセスレベルを取得し、PaddleのトランザクションHistory をサーバーサイドAPIでインポートする](api-adapty/operations/validatePaddlePurchase)
---
# File: custom-store
---
---
title: "他のストアとの初期連携"
description: "App StoreとのAdapty初期連携:クイックガイド"
---
Adaptyへようこそ!アプリで最高の成果を達成できるよう、スムーズなスタートをサポートします。
初期連携が必要なのは [App Store](initial_ios)、[Google Play](initial-android)、[Stripe](stripe)、[Paddle](paddle) のみです。Adaptyはこれらのストアでアプリ、プロダクト、オファーを検証するためです。
Adaptyは他のアプリストアとのデータ検証や購入処理は行いません。ただし、他のストアで販売されたプロダクトをAdaptyに登録することで、購入完了後に有料コンテンツへのアクセス付与、アナリティクスへのトランザクション反映、インテグレーション経由での共有が可能です。
:::important バックエンドで購入を処理し、[Adaptyサーバーサイドコンフィグ](getting-started-with-server-side-api)を使用してトランザクションをAdaptyに送信してください。Adaptyはトランザクションを受信して初めて、アクセスの付与、トランザクションイベントのトリガー、インテグレーションへの送信、アナリティクスへの反映を行います。 ::: プロダクトをカスタムアプリストア経由で販売するものとしてマークするには、プロダクト作成時にアプリストアを選択します。必要なストアが一覧にない場合は、以下の手順で作成してください。 1. **Products** ページで、カスタムアプリストア経由で販売したいプロダクトを開きます。 2. 販売先のアプリストアを選択します。一覧にない場合は、**Create Custom Store** ボタンをクリックします。
3. ストアの **Title** と **Store ID** を入力します。
4. **Create store** ボタンをクリックします。
バックエンドが正しく設定されていれば、Adaptyはこのカスタムストアからのプロダクトトランザクションを受信し、アナリティクス、[**Event Feed**](event-feed)、[インテグレーション](https://app.adapty.io/integrations)に反映し、適切にアクセスを付与します。
## カスタムストアデータをさらに活用する \{#get-more-from-your-custom-store-data\}
:::important
カスタムストアのイベントをインテグレーションで機能させるには、ユーザーが少なくとも1回はApp Store / Google Playアカウントでアプリにログインしている必要があります。
:::
カスタムストアのインテグレーションをセットアップすると、Adaptyはすぐにインサイトを提供できる状態になります。データを最大限に活用するために、追加のAdaptyインテグレーションを設定してカスタムストアのイベントを転送し、すべてのサブスクリプションアナリティクスを一つのAdapty ダッシュボードに集約できます。
カスタムストアのイベントを転送・分析するために利用できるインテグレーション:
- [AppsFlyer](appsflyer)
- [Webhook](webhook)
- [Posthog](posthog)
---
# File: transfer-apps
---
---
title: "アプリを別のアカウントに移管する"
description: "Adapty でアプリのオーナーを変更する"
---
会社が買収された場合、アプリを売却する場合、または事業体を再編する場合に、アプリを別のオーナーに移管できます。移管プロセスでは、サービスを継続するために Adapty、App Store Connect、Google Play Console での変更を連携して行う必要があります。
## アプリのオーナーシップを移管する \{#transfer-app-ownership\}
ストアでの移管を先に完了してから、Adapty でのアプリ移管を行ってください。この順序により、移管中も購入が正常に機能し続けます。
:::note
移管プロセス中はプロダクトを削除・再作成しないでください。移管が正常に完了したことを確認するまで、プロダクト ID を変更しないでください。
:::
### App Store(iOS)の移管 \{#app-store-ios-transfer\}
:::important
App Store Connect の API キー(Issuer ID、Key ID、.p8 ファイル)はアプリ単位ではなくアカウント単位でスコープされています。移管後は、新しいオーナーのアカウントから新しい API キーを生成し、Adapty で更新する必要があります。
アプリ固有の共有シークレットは移管期間中もレシートの検証を継続しますが、移管完了後に新しいオーナーが再生成して Adapty を更新する必要があります。
:::
1. **新しいオーナー:** アカウントをお持ちでない場合は、[app.adapty.io](https://app.adapty.io) で Adapty アカウントを作成してください。
2. **旧オーナー:** Apple の[移管ガイド](https://developer.apple.com/help/app-store-connect/transfer-an-app/overview-of-app-transfer)に従って、App Store Connect でアプリの移管を開始してください。
3. **新しいオーナー:** App Store Connect で移管を承認してください。
4. **旧オーナー:** Adapty でのアプリ移管を依頼するため、[support@adapty.io](mailto:support@adapty.io) にメールを送ってください。アプリ名と新しいオーナーのメールアドレスを記載してください。
5. **新しいオーナー:** Adapty でアプリを受け取ったら、[App Store 連携ガイド](initial_ios)を参照して、自分のアカウントで必要なすべての認証情報を生成・設定してください。
### Google Play(Android)の移管 \{#google-play-android-transfer\}
1. **新しいオーナー:** アカウントをお持ちでない場合は、[app.adapty.io](https://app.adapty.io) で Adapty アカウントを作成してください。
2. **両オーナー:** 両方の Google Play デベロッパーアカウントが完全に登録済みであることを確認してください。
3. **旧オーナー:** Google Play Console または Google Play デベロッパーサポートから移管リクエストを送信してください。Google から DUNS 番号、契約書、売却証明書などの追加書類の提出を求められる場合があります。
4. **新しいオーナー:** 移管リクエストを確認して承認してください。
5. **Google:** Google サポートチームが移管を処理します。通常数営業日かかりますが、アカウントの確認、サブスクリプションの複雑さ、支払い設定によってはさらに時間がかかる場合があります。
6. **旧オーナー:** Google が移管を完了したら、Adapty でのアプリ移管を依頼するため、[support@adapty.io](mailto:support@adapty.io) にメールを送ってください。アプリ名と新しいオーナーのメールアドレスを記載してください。
7. **新しいオーナー:** Adapty でアプリを受け取ったら、[Google Play 連携ガイド](initial-android)を参照して、自分のアカウントで必要なすべての認証情報を生成・設定してください。
移管にはユーザー、サブスクリプション、統計情報、評価、ストアのリスティングが含まれます。既存のサブスクライバーへの課金は継続されますが、収益の振り込みは移管完了後に新しいオーナーのマーチャントアカウントに切り替わります。移管前の支払いレポートと注文は元のアカウントに残ります。詳細な要件については、Google の[移管ガイド](https://support.google.com/googleplay/android-developer/answer/6230247)を参照してください。
## リスクの軽減とタイミング \{#risk-mitigation-and-timing\}
**移管中も継続して機能するもの:**
- 購入と更新(アプリ固有の共有シークレットが移管期間中もレシートを検証し続けます)
- 既存のサブスクライバーのアクセス
- SDK の動作
**一時的に機能しなくなるもの:**
- App Store Connect の API 呼び出し(新しいキーが設定されるまで)
- サーバー通知(エンドポイントが再設定されるまで)
- 認証情報の移行中はアナリティクスに欠損が生じる場合があります
**推奨タイミング:**
- 主なユーザーのタイムゾーンで午前3時〜6時など、トラフィックの少ない時間帯に移管を完了させてください
- ストアの移管を承認した後、すぐに認証情報を設定できるよう新しいオーナーが準備しておいてください
- ストアの移管承認から Adapty の連携完了まで、15〜30 分の余裕を見てください
**移管完了後:**
- レシート検証をすぐにテストしてください
- 48 時間、自動更新の成功率を監視してください
- サーバー通知がシステムに届いていることを確認してください
- 新しい購入が正しくトラッキングされていることを確認してください
## 移管が正常に完了したことを確認する \{#verify-transfer-completed-successfully\}
Adapty とストアの両方で移管が完了したら:
1. **ダッシュボードへのアクセスを確認する:** 新しいオーナーが自分の Adapty ダッシュボードにアプリが表示されていることを確認してください。
2. **API キーの接続を確認する:** 新しい App Store Connect API キーまたは Google Play サービスアカウントが Adapty で正常に接続されていることを確認してください。
3. **SDK の接続をテストする:** アプリを実行して、Adapty SDK がエラーなく初期化されることを確認してください。
---
# File: installation-of-adapty-sdks
---
---
title: "Adapty SDK のインストール"
description: "iOS、Android、クロスプラットフォームアプリ向けの Adapty SDK をインストールします。"
---
始め方は、以下の3つのパスから選べます:
- **プラットフォーム別のクイックスタートガイドに従う**: ガイドにはプロダクション対応のコードスニペットが含まれているため、実装はすぐに完了します。
- [iOS](ios-sdk-overview)
- [Android](android-sdk-overview)
- [React Native](react-native-sdk-overview)
- [Flutter](flutter-sdk-overview)
- [Unity](unity-sdk-overview)
- [Kotlin Multiplatform](kmp-sdk-overview)
- [Capacitor](capacitor-sdk-overview)
- **LLM を活用する**: ドキュメントは LLM フレンドリーな設計です。Adapty ドキュメントで LLM を最大限に活用する方法については、[ガイド](adapty-cursor)をご覧ください。
- **サンプルアプリを試す**:
- [iOS (Swift)](https://github.com/adaptyteam/AdaptySDK-iOS/tree/master/Examples)
- [Android (Kotlin)](https://github.com/adaptyteam/AdaptySDK-Android/tree/master/app)
- [React Native (純粋な RN によるベーシックなサンプル)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/BasicExample)
- [React Native (アドバンストサンプル – より複雑なケースを扱えるため、開発時に便利)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/AdaptyDevtools)
- [React Native (Expo dev ビルド)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/FocusJournalExpo)
- [React Native (Expo Go & Web)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/ExpoGoWebMock)
- [Flutter (Dart)](https://github.com/adaptyteam/AdaptySDK-Flutter/tree/master/example)
- [Unity (C#)](https://github.com/adaptyteam/AdaptySDK-Unity/tree/main/Assets)
- [Kotlin Multiplatform](https://github.com/adaptyteam/AdaptySDK-KMP/tree/main/example)
- [Capacitor](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples)
---
# File: sample-apps
---
---
title: "サンプルアプリ"
description: ""
---
Adapty SDK をすぐに使い始められるよう、主要な機能の統合方法と使い方を示したサンプルアプリを用意しています。ペイウォール、購入処理、アナリティクスのトラッキングすぐに使える実装例が揃っています。
## サンプルアプリを使う理由 \{#why-use-sample-apps\}
- **すぐに統合できる:** 実際のアプリで Adapty SDK の動作を確認できます。
- **ベストプラクティス:** 推奨される実装パターンに従えます。
- **デバッグ・テスト:** 自分のプロジェクトに Adapty を統合する前に、サンプルアプリを使ってトラブルシューティングや実験ができます。
## 利用可能なサンプルアプリ \{#available-sample-apps\}
- [iOS (Swift)](https://github.com/adaptyteam/AdaptySDK-iOS/tree/master/Examples)
- [Android (Kotlin)](https://github.com/adaptyteam/AdaptySDK-Android/tree/master/app)
- [React Native (純粋な RN によるベーシックな例)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/BasicExample)
- [React Native (より複雑なケースにも対応した開発向けの高度な例)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/AdaptyDevtools)
- [React Native (Expo dev ビルド)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/FocusJournalExpo)
- [React Native (Expo Go & Web)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/ExpoGoWebMock)
- [Flutter (Dart)](https://github.com/adaptyteam/AdaptySDK-Flutter/tree/master/example)
- [Unity (C#)](https://github.com/adaptyteam/AdaptySDK-Unity/tree/main/Assets)
- [Kotlin Multiplatform](https://github.com/adaptyteam/AdaptySDK-KMP/tree/main/example)
- [Capacitor (React)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/basic-react-example)
- [Capacitor (Vue.js)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/basic-vue-example)
- [Capacitor (Angular)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/basic-angular-example)
- [Capacitor (高度な開発ツール)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/adapty-devtools)
---
# File: paywall-builder-templates
---
---
title: "フローを作成する"
description: "カスタムデザインのギャラリーテンプレートまたはシンプルなスターターから新しいフローを始めましょう。"
---
フローはテンプレートから作成することも、一から作成することもできます。
:::link
フローの作成についてさらに詳しく知りたいですか?[YouTubeプレイリスト](https://www.youtube.com/playlist?list=PLMksWqaZiWtM)でステップバイステップの動画チュートリアルをご覧ください。
:::
## フローを作成する \{#create-flow\}
1. **Flows** ページを開きます。
2. **Create flow** をクリックします。
3. オプションを選択します:
- **Browse templates**(テンプレートライブラリを開く)
- **Start from scratch**(空のフローを作成する)
4. エディターでフローの名前を変更します。ヘッダーのフロー名をクリックして新しい名前を入力してください。
:::warning
Adapty では同じ名前のフローを複数作成できます。新しいフローを作成するたびに名前を変更しないと、区別しにくい **Untitled** フローが複数できてしまいます。
:::
### テンプレートを使う \{#use-a-template\}
テンプレートライブラリには、フローの出発点として使えるテンプレートが複数用意されています。それぞれのテンプレートは複数のスクリーン、インタラクティブな要素、ナビゲーション機能を備えた完成済みのフローです。任意の要素を編集してカスタマイズできます。
テンプレートを適用するには:
1. テンプレートライブラリでテンプレートカードを確認します。各カードにはフローのプレビュースクリーンショットが表示されます。
2. 使いたいカードの **Use as template** をクリックします。
テンプレートがビルダーに読み込まれます。ここから、任意の要素、画面、またはプロパティを変更できます。
### ゼロから始める \{#start-from-scratch\}
「ゼロから始める」を選ぶと、空白の画面が1つだけあるフローが作成されます。[エレメントライブラリ](builder-elements)のエレメントを使って画面をデザインしてください。
## テンプレートを変更する \{#change-the-template\}
ビルダー内からテンプレートを切り替えられます。Screens パネルを開き、**Templates** Templates ボタンをクリックしてテンプレートライブラリを再度開き、新しいテンプレートを選んでください。
:::warning
新しいテンプレートを適用すると、現在のフローの下書きが置き換えられます。Adapty が確認を求めるので、続行する場合は **Use template** を、下書きを残す場合は **Cancel** をクリックしてください。確定後は以前の下書きを復元できません。公開済みのフローはそのまま有効です。
:::
## テンプレートのカスタムフォント \{#custom-fonts-in-templates\}
:::link
関連記事:[フローボルダーのカスタムフォント](using-custom-fonts-in-flow-builder)
:::
**Custom font** チップが付いているテンプレートはカスタムフォントを使用しています。これらのフォントは SDK には同梱されていません。チップにカーソルを合わせると、テンプレートで使用されているフォントを確認できます。
デバイス上で意図したタイポグラフィを表示するには、フォントファイルをアプリバンドルに追加してください。フォントが同梱されていない古いバージョンのアプリでは、システムフォントにフォールバックします。
フォントを変更しても古いバージョンに影響を与えないようにするには、フローを複製し、コピー側でフォントを変更して、そのコピーを[該当フォントが含まれるアプリバージョンのユーザー](segments)に限定してください。
---
# File: builder-ui
---
---
title: "フロービルダーUI"
description: "フロービルダーのインターフェースとワークスペースの概要。"
---
フロービルダーのメインUIには、ビジュアル要素の追加、プロパティの編集、ユーザーフローのロジック変更に必要なすべてのツールが揃っています。この記事では、インターフェースの各エリアについて、その機能と場所を説明します。
:::link
フローの作成についてさらに詳しく知りたいですか?[YouTubeプレイリスト](https://www.youtube.com/playlist?list=PLMksWqaZiWtM)でステップバイステップの動画チュートリアルをご覧ください。
:::
## プロジェクトのコントロールと便利なショートカット(上部ツールバー) \{#project-controls-and-useful-shortcuts-top-toolbar\}
* **Close** Close: フローエディターを終了してフロー一覧ページに戻ります。
* **App name** App: そのフローが属するアプリを識別します。
* **All flows** Flows: このアプリのすべてのフロー一覧を開きます。
* **Flow status**: フロー名の左側にあるアイコンは、現在の[フローのステータス](builder-save-publish#flow-status)を示します:
- **Draft** Draft
- **Publishing**(スピナー)
- **Failed** Failed
- または **Live** Live。
* **フローの名前変更**: フロー名をクリックして名前を変更します。複数のフローが同じ名前を持つことができますが、[各フローには固有の名前をつけてください](paywall-builder-templates#create-flow)。
* **表示モードの切り替え**: デザインビュー Cursor と[リモートコンフィグビュー](customize-flow-with-remote-config)Remote Config を切り替えます。
* **元に戻す / やり直す**: 矢印アイコンをクリックしてフローの変更を元に戻す Undo か、やり直す Redo ことができます。⌘Z / Ctrl+Z で元に戻すこともできます。
* **下書き保存 / 公開**: **Save draft** をクリックすると、公開せずに進捗を保存できます(⌘ / Ctrl+S)。ドロップダウン Open dropdown を開いて [**Publish**](builder-save-publish) ボタンにアクセスします。フローを[プレースメント](create-placement)に追加できるのは、公開後のみです。
## プレビューエリア(中央) \{#preview-area-center\}
ワークスペースの中央エリアでは、フローがモバイルデバイス上でどのように表示されるかをシミュレートできます。
* 要素を選択してプロパティを編集するには、その要素をクリックします。コンテナ内の子要素を選択するには、まずコンテナをクリックし、次に子要素をクリックします。
* 画面自体のプロパティを編集するには、要素の外側をクリックするか、**Screens and Layers** パネルで画面を選択します。
* 要素の順序を変更するには、**Screens and Layers** パネルでその要素のエントリを上下にドラッグします。
:::warning
フローエディターはレスポンシブレイアウトを作成するために設計されています。そのため、**要素の位置を手動で変更することはできません** — 変更できるのは順序のみです。各コンテナのレイアウト設定によって、内部の要素の配置方法が決まります。
:::
### アクティブスクリーンバー(デバイスプレビューの上部) \{#active-screen-bar-above-the-device-preview\}
- **Screen name** — 現在のスクリーン名が表示されたピル。
- **Toggle animations** Toggle animations — 要素のアニメーションプレビューのオン/オフを切り替えます。オフにするまで継続的に再生されます。アクティブなスクリーンに[アニメーション](builder-styling#animation)が含まれている場合のみ表示されます。実機上のアニメーション表示には影響しません。
- **Add element** Plus — 現在のスクリーンの[要素ライブラリ](builder-elements)を開きます。スクリーンとレイヤーパネル上部の **+** と同じ機能で、パネルが折りたたまれているときに便利です。
### 表示コントロール(下部ツールバー) \{#view-controls-bottom-toolbar\}
下部ツールバーのツールを使って、プレビューを操作できます。
* **Device**: 利用可能な iPhone および Android の端末モデルを選択して、ビューポートのサイズやデバイスの外枠を変更できます。
* **Screen orientation**: 縦向き Portrait と横向き Landscape を切り替えて、フローをさまざまな向きでプレビューできます。
* **Color scheme**: ライト Light mode とダーク Dark mode を切り替えて、デザインがテーマに応じてどのように変わるか確認できます。
* **Locale**: ロケールを選択して、ローカライズされたコンテンツでフローをプレビューできます。
* **View options**: デバイスのベゼルおよびセーフエリアガイドの表示・非表示を切り替えられます。
## 画面と要素のプロパティ(右パネル) \{#screen-and-element-properties-right-panel\}
### 画面の設定とレイアウト \{#screen-settings-and-layout\}
:::link
関連記事:[スクリーンとレイヤー](paywall-layout-and-products)
:::
要素が選択されていない状態では、右パネルでアクティブな[フロー画面](paywall-layout-and-products)のプロパティを調整できます。設定できる項目は次のとおりです:
* システム UI との連携(ステータスバーの表示・非表示など)
* 自動レイアウトのルール
* 背景(色・画像・動画)
* パディングサイズ
* 縦方向のスクロール動作
画面に[インタラクティブクイズ](onboarding-quizzes)などの要素が含まれている場合、このリストには関連するプロパティが追加されます。
### 要素のプロパティ \{#element-properties\}
要素を選択すると、右パネルからスタイルやインタラクティブなプロパティを変更できます。
#### デザインプロパティ \{#design-properties\}
:::link
詳細はこちら: [レイアウトと配置](manage-paywall-ui-elements)、[スタイルと外観](builder-styling)
:::
**Design** タブでは、選択した要素のビジュアル外観とレイアウトを設定できます。
* **Visibility**: 要素の表示・非表示を切り替えます。**Conditional** visibility を有効にすると、要素を表示する条件を設定できます。
* **Position**: Relative、Absolute、Fixed のいずれかのポジションを選択します。
* **Content**(テキスト要素のみ): 要素のテキストを編集し、[変数](#variables)を挿入して、ローカライズを管理します。
* **Typography**(テキスト要素のみ): フォント、ウェイト、サイズ、カラー、配置、装飾、省略設定を行います。
* **Spacing**: 要素のマージンとパディングを設定します。
* **Effects**: ドロップシャドウ、インナーシャドウ、背景ブラー、レイヤーブラーを追加します。
* **Animation**: アニメーション効果(Pulse など)を追加し、タイミングや強度を設定します。
* **Appearance**: 不透明度と回転を調整します。
* **Layout**: レイアウトの方向(縦または横)を選択し、子要素の配置方法を決定します。
#### インタラクションのプロパティ \{#interactions-properties\}
:::link
詳細情報: [アクション](onboarding-actions)、[ナビゲーションとインタラクション](onboarding-navigation-branching)
:::
**Interactions** タブでは、選択した要素にユーザーが操作したときの動作を定義できます。各インタラクションは **トリガー** と1つ以上の **アクション** で構成されています。
* **トリガー**は「*いつ*」何かが起きるかを定義します。例えば **On Tap**(ユーザーがその要素をタップしたとき)などです。
* **アクション**は「*何が*」起きるかを定義します。例えば別の画面に遷移したり、変数の値を変更したりします。1つのトリガーに複数のアクションを追加すると、それらを順番に連鎖実行できます。
同じ要素に複数のトリガーを追加して、複数のアクションを順に実行することも可能です。
## 左パネル \{#left-panel\}
左パネルはアクティブなボタンに応じて機能が変わります。以下から選択できます:
* [スクリーンとレイヤー](#screens-and-layers)
* [要素の追加](#element-selection)
* [プロダクト](#products)
* [スタイル](#saved-styles)
* [変数](#variables)
* [ローカライズ](#localization)
### スクリーンとレイヤー \{#screens-and-layers\}
:::link
メイン記事:[スクリーンとレイヤー](paywall-layout-and-products)
:::
レイヤー Layers ボタンを押すと「スクリーンとレイヤー」が開きます(フロービルダーを開いたときにデフォルトで表示されます)。
各画面がレイヤーのツリーとして表示されます。画面上の各要素がレイヤーとなり、コンテナにはその子要素がネストされています。レイヤーをドラッグ&ドロップして並べ替えることができます。
### 要素の選択 \{#element-selection\}
:::link
メイン記事:[要素](builder-elements)
:::
プラス Plus ボタンをクリックすると、左パネルに利用可能な UI 要素とそのバリエーションが表示されます。エントリをクリックすると、現在の画面に新しいレイヤーとして追加されます。
### プロダクト \{#products\}
:::link
メイン記事:[プロダクト](paywall-product-block)
:::
プロダクト Products ボタンを押すとプロダクト一覧が開きます。フロー内の各画面に割り当てられたプロダクトが表示されます。
この一覧は読み取り専用です。画面にプロダクトを割り当てるには、Product 要素を追加して右パネルで設定してください。プロダクトの作成・編集は、Adapty ダッシュボードの **Products** ページで行います。
### 保存済みスタイル \{#saved-styles\}
:::info
詳細はこちら:
- [スタイルと外観](builder-styling)
- [テキストコンテンツ](onboarding-text)
- [ダークモード](paywall-dark-mode)
:::
スタイル Styles ボタンをクリックすると、保存済みスタイルが開きます。
ここでは、グローバルスタイルを編集・管理できます。フロー内の複数の要素で同じタイポグラフィやカラーを使用している場合は、そのデータをグローバルスタイルとして保存しておきましょう。保存しておけば、ワンクリックで再利用できます。
現在、フローのビルダーは、フォントスタイルとカラースタイルという2種類のグローバルスタイルをサポートしています。各カラースタイルには、ダークモード用の個別の値をオプションで設定できます。
### 変数 \{#variables\}
:::link
メイン記事:[変数](onboarding-variables)
:::
ブラケット Variables ボタンをクリックすると、変数パネルが開きます。
ここでは、フローで使用する変数を作成・管理できます。実行時、SDKは変数プレースホルダーをユーザー属性、プロダクト価格、ローカライズ済み文字列などの実際の値に置き換えます。
変数は2つのタブに分類されます:
* **カスタム**: アクションを通じて自分で作成・管理する変数です。
* **要素**: クイズの回答、トグルの状態、タブの選択など、ユーザー操作によって決まる値です。
価格、名称、その他のプロダクトデータなどのプロダクト変数は、このパネルには表示されません。テキスト要素を編集する際に直接参照してください。
変数の主な用途:
* **テキストのバインド**: 静的な文字列の代わりに動的なコンテンツを表示する。
* **表示の制御**: 条件に基づいて要素の表示・非表示を切り替える(例:プレミアムユーザーにはアップグレードボタンを非表示にする)。
* **ユーザーとのインタラクション**: フォームやクイズなどのユーザー入力フィールドからデータを取得する。
### ローカライゼーション \{#localization\}
:::link
メイン記事: [ローカライゼーション](add-flow-remote-config-locale)
:::
ローカライゼーションビューでは、フロー内のすべての翻訳可能なコンテンツを一元管理できます。テキスト文字列と画像を画面ごとに整理したテーブルが表示され、各ロケールの列が並んでいます。このビューからできることは次のとおりです:
* 新しいロケールの追加と、ローカライズされた文字列のインライン編集。
* 翻訳ステータスの確認 — 各行は **Done** または **Missing** としてマークされます。
* 画面でのフィルタリングや、未翻訳のコンテンツのみ表示。
* **AI Translate** による自動翻訳、または **Import/Export** を使った一括インポート/エクスポート。
---
# File: flow-builder-recipes
---
---
title: "よくあるフローのレシピ"
description: "フロービルダーでよく使われる画面テンプレートを作成するためのステップバイステップガイド。"
---
このセクションでは、フロービルダーでよく使われる画面テンプレートの作り方を、レイアウトの選択からインタラクションまで、要素ごとに順を追って説明します。各ガイドは独立した内容で、標準的なフロービルダーの要素を使用しています。
3. 購入ボタン、リンク、閉じるボタンにはあらかじめアクションが設定されています。リンクについては、[ユーザーの遷移先URLを設定してください](#links)。その他のボタンタイプについては、**Interactions** パネルに移動してください。そこの **Button triggers** セクションで、ボタンが実行する[アクション](onboarding-actions)を設定します。
4. **Design** パネルで[ボタンのデザイン](builder-styling)を設定します。
## ボタンの種類 \{#button-types\}
### 購入ボタン \{#purchase-buttons\}
:::link
購入ボタンを機能させるには、プロダクトをスクリーンに紐付けて **Products** 要素を追加してください。詳しくは[ガイド](paywall-product-block)をご覧ください。
:::
購入ボタンは、ユーザーがスクリーンで選択したプロダクトのアプリ内課金を開始します。SDK がトランザクションを自動で処理するため、アプリのコードで購入処理を実装する必要はありません。
購入ボタンを追加するには:
1. **+** をクリックして **Button** を選択し、ボタンのプリセットを選びます。
2. ボタンを選択した状態で、右パネルの **Interactions** タブを開きます。
3. **Add trigger** > **On tap** をクリックし、**Add action** をクリックします。
4. **Action** を **Purchase**、**Product** を `products.selectedProduct` に設定します。`products.selectedProduct` 変数は、画面上で現在選択されているプロダクトに常に解決されます。
:::tip
購入ボタンにアニメーションを追加すると、より注目を集められます。ペイウォールビルダーは現在、**Pulse** アニメーションタイプをサポートしています。
**デザイン**パネルでアニメーションスタイルを設定します。
:::
### リンク \{#links\}
:::important
**Terms of Use** および **Privacy Policy** ボタンには、**Open URL** アクションが組み込まれています。リンク先の URL はそこで設定してください。Open URL が空のままの場合や[インラインリンク](onboarding-text#inline-link)が未設定の場合、プレビューと公開がブロックされます。
:::
一部のストア要件に対応するため、以下へのリンクを追加できます:
- 利用規約
- プライバシーポリシー
- 購入の復元
リンクを追加するには:
1. **+** をクリックし、**Button > Links** を選択します。これにより、購入の復元またはURLを開くといったアクションがあらかじめ設定されたインラインボタンの行が追加されます。含まれているボタンがすべて必要でない場合は、レイヤーパネルで不要なものを削除してください。
2. 次に、ボタンのアクションを設定します:
- **Restore purchases** ボタンは、すでに購入の復元を処理します。
- 残りの各リンクについて:
1. ボタンをクリックして選択し、右側の **Interactions** タブに切り替えます。
2. フィールドにURLを貼り付けます。
3. デフォルトでは、URLはシームレスなユーザー体験のためにアプリ内ブラウザで開かれます。外部ブラウザに遷移させたい場合は、**Open in external browser** チェックボックスを選択してください。
### フローを閉じる \{#close-flow\}
**Close** ボタンをクリックすると、フローが自動的に閉じます。
閉じるボタンを追加するには、**+** をクリックして **Button > Close flow** を選択してください。
:::tip
**Absolute** ポジションを使用すると、閉じるボタンを画面の隅に配置できます。
:::
フローを閉じる[アクション](onboarding-actions)を使って、他のボタンでもフローを閉じるよう設定できます。
### カスタムボタン \{#custom-buttons\}
追加できるすべてのボタンは、タップ時に任意のアクションを実行するように設定できます:
- 次の画面へ移動する
- アラートを表示する
- [変数](onboarding-variables)を設定する
- [画面要素の表示・非表示を切り替える](onboarding-element-visibility)
- URLを開く
- 購入を復元する
- 条件付きアクションを実行する
---
# File: builder-tabs
---
---
title: "タブ"
description: "フロー内でコンテンツパネルを切り替えるタブナビゲーションを追加します。"
---
**タブ**は、画面のセクションを切り替え可能なコンテンツパネルに分割します。ユーザーがタブヘッダーをタップすると、その下のパネルが対応する内容に切り替わります。
{/* TODO: on-device GIF */}
## タブの追加・削除・選択 \{#add-remove-and-select-tabs\}
各タブは2つのパーツで構成されています。
- **タブヘッダー** — クリックできるラベル(Tab 1、Tab 2 など)。
- **タブコンテンツ** — タブごとに1つのコンテナ。コンテンツコンテナに配置したものが、そのタブが選択されたときに表示されます。
**Add tab** をクリックすると、新しいタブが追加されます。追加した各タブには、対応するコンテンツコンテナが自動的に作成されます。
画面が最初に表示されたときに特定のタブをアクティブにするには、**Selected by default** をオンにしてください。
## タブのスタイル設定 \{#style-the-tabs\}
### テンプレート \{#templates\}
フロービルダーでは、すぐに使える3種類のタブテンプレートを用意しています。
- **Segment control** — 選択中のタブに角丸の枠が付いた、ピル形状のスイッチャー。
- **Button Tabs** — ボタン風のスタイルを持つ独立したタブ。
- **Underline** — 選択中のタブをアンダーラインで示すテキストラベル。
### タブの状態 \{#tab-states\}
各タブには状態切り替え(**Default / Selected**)があり、アクティブ状態と非アクティブ状態のスタイルをそれぞれ個別に設定できます。テキストスタイル、色、塗りつぶし、ボーダーを状態ごとに変更できます。
## 選択グループ \{#selectable-group\}
タブは**単一選択グループ**です。常にひとつのタブだけがアクティブになります。グループの管理は **Screen settings** パネルの [Selectable groups](paywall-layout-and-products#selectable-groups) セクションから行えます。
グループは2つの変数を提供します。
- `tabs.selectedOptionId` — 選択中のタブのID。条件式で使用できます。
- `tabs.selectedOptionTitle` — 選択中のタブのラベル。動的テキストで使用できます。
グループ名を変更した場合は、`tabs` の部分をカスタムの **Group ID** に置き換えてください。
詳細は [選択可能な要素とグループ](flow-selectable-elements) をご覧ください。
---
# File: builder-toggles
---
---
title: "トグル"
description: "ペイメントフローにトグルスイッチを追加します。"
---
:::warning
デフォルトでオンに設定されたトライアルトグルを使用するアプリは、Appleに拒否される可能性があります。デフォルトで「オン」になっているトグルは、App Store Review Guidelinesに基づき、ユーザーの明示的な選択なしにフライアルへの同意を示す不正なダークパターンとみなされる場合があります。
拒否を避けるため、トグルはデフォルトで **オフ** に設定し、ユーザー自身がトライアルを選択できるようにしてください。
:::
トライアルトグルは、ペイウォール上で標準プロダクトとトライアルベースのプロダクトをユーザーが切り替えられるバイナリスイッチです。ユーザーが状態を変更すると、プロダクトグループの入れ替え、変数の更新、要素の表示・非表示といったアクションを即座にトリガーできます。
トライアルトグルを追加するには、対象の画面で **+** をクリックし、**Trial toggle** を選択します。
各トライアルトグルは **Toggle** タイプの選択可能な要素です。選択可能な要素にはそれぞれ状態を反映する変数が割り当てられており、たとえば `trial` という名前のトグルには `True` または `False` の値を持つ `trial.is_selected` 変数が付与されます。
他の要素をトグルの状態に連動させるには、この変数を基にした条件付き[アクション](onboarding-actions)または[条件付き表示](onboarding-element-visibility)を設定してください。
---
# File: builder-reviews-and-testimonials
---
---
title: "レビューと口コミ"
description: "ペイウォールにレビュー、評価、ソーシャルプルーフを追加します。"
---
**User Engagement** 要素カテゴリには、ペイウォールにレビュー、評価、ソーシャルプルーフを表示するための4つのテンプレートが用意されています。各テンプレートは完全に編集可能なコンポジションです。プレースホルダーテキストを置き換え、フローの他の部分に合わせて[カラースタイル](builder-styling)と[タイポグラフィ](onboarding-text)を適用してください。
## レビュー \{#review\}
1つの評価、引用文、著者のクレジットを含むカードです。印象的なユーザーの言葉を紹介するのに使用します。
## 評価 \{#rating\}
「17000+ rating」のような件数と星のリストです。評価の数の多さを強調するのに使用します。
## アプリ評価 \{#app-rating\}
「4.9 / Based on 1000+ reviews」のようなサンプルサイズ付きのスコア表示です。高い総合評価を際立たせるのに使用します。
## ソーシャルプルーフ \{#social-proof\}
「Join 50,000+ users」のようなメンバー数付きのアバターグループです。コミュニティの規模を強調するのに使用します。
---
# File: flow-timer
---
---
title: "カウントダウンタイマー"
description: "ペイウォールにカウントダウンタイマーを追加します。"
---
**カウントダウンタイマー**は、設定した時間からゼロに向かってカウントダウンし、ゼロに達すると表示が停止します。
## テンプレート \{#templates\}
このカテゴリーには4つのビジュアルバリアントがあります:
- **Blocks** — 日・時・分・秒をそれぞれラベル付きのセルに分けて表示します。
- **Inline Units** — 単位のサフィックスを付けた1行テキスト表示です。
- **Inline** — 数字のみの表示です。
- **Badge** — ピル形状の数字表示です。
## 設定 \{#settings\}
### 時間を設定する \{#set-the-duration\}
右パネルの **Countdown** セクションで、開始時間を日・時・分・秒で入力します。
### 動作を設定する \{#configure-the-behavior\}
**Behavior** ドロップダウンでタイマーの開始タイミングを設定します:
- **Every appear** — ユーザーが画面を開くたびに再スタートします。デフォルト設定です。
- **First appear** — 現在のアプリセッション中にユーザーが初めて画面を表示したときにスタートします。同じセッション中に戻ってきた場合はカウントを継続し、アプリを新たに起動するとリセットされます。
- **First appear (persisted)** — ユーザーが初めて画面を開いたときにスタートし、アプリを再起動してもカウントを継続します。
### タイマー終了時にアクションをトリガーする \{#trigger-an-action-when-the-timer-ends\}
:::link
関連記事:[アクション](onboarding-actions)
:::
カウントダウンがゼロになったときにアクションを実行するには、**On timer end** トリガーを追加します。たとえば、別の画面に遷移したり、割引バッジを非表示にしたりすることができます。
---
# File: onboarding-quizzes
---
---
title: "フローのクイズ"
description: "Adapty フローにインタラクティブなクイズを追加して、ユーザーの好みを収集し、パーソナライズされたフローを実現しましょう — コード不要です。"
---
クイズを使うと、あらかじめ定義した選択肢をユーザーに提示できます。入力フィールドと異なり、クイズにはテキスト入力欄がなく、ユーザーは用意された選択肢から選ぶだけです。好みの収集、ユーザーのセグメント分け、回答に基づくフローの分岐などに活用できます。
### クイズを追加する \{#add-a-quiz\}
1. 左上の **+** をクリックします。
2. **Quiz** を選択します。
3. クイズの種類を選択します。
- **Icon/image/emoji options:** アイコン、画像、または絵文字とテキストラベルがセットになった選択肢を縦並びで表示します。
- **Icon/image/emoji grid:** アイコン、画像、または絵文字付きの選択肢をグリッド形式で表示します。
- **Rating:** 数値またはスター形式でユーザーが評価を表現できるスケールです。
### 条件付きナビゲーションを設定する \{#set-up-conditional-navigation\}
ユーザーの選択に応じて異なる画面へ誘導するには、クイズのオプションではなく**ナビゲーションボタン**に条件付きアクションを設定します。
1. ナビゲーションボタンを選択します。
2. **Interactions** パネルで、**On Tap** トリガーに **Conditional** アクションを追加します。
3. **Edit Action** ダイアログで **if** 行を設定します。
- 左側の `{}` をクリックし、**Elements → Screen → `
2. 右上の **Create product** をクリックします。Adapty はサブスクリプション、非消耗型(永続アクセスを含む)、消耗型アイテムなど、すべてのプロダクトタイプに対応しています。
3. **Create a new product and push to stores** を選択します。
4. 以下の情報を入力します。
- **Product name**: Adapty ダッシュボードで使用するプロダクト名を入力します。この名前は主に管理用ですので、Adapty ダッシュボード全体で使いやすい名前を自由に選んでください。
- **Access Level**: プロダクトが属する[アクセスレベル](access-level)を選択します。アクセスレベルは、プロダクトを購入した後に解放される機能を決定します。このリストには、事前に作成されたアクセスレベルのみ表示されます。`premium` アクセスレベルは Adapty でデフォルトで作成されていますが、[アクセスレベルを追加する](access-level)こともできます。
- **Subscription duration**: リストからサブスクリプションの期間を選択します。
- **Weekly/Monthly/2 Months/3 Months/6 Months/Annual**: サブスクリプションの期間。
- **Lifetime**: アプリのプレミアム機能を永続的に解放するプロダクトには、永続期間を使用します。
- **Non-Subscriptions**: サブスクリプションではなく、期間のないプロダクトには Non-Subscriptions を使用します。追加機能や消耗型プロダクトなどに利用できます。
- **Consumables**: 消耗型アイテムは複数回購入できます。アプリのライフサイクル中に使い切るものです。ゲーム内通貨や追加アイテムが例として挙げられます。消耗型プロダクトはアクセスレベルに影響しないことに注意してください。買い切り購入でアクセスレベルを付与するには、**Non-Subscriptions** を使用してください。
- **Price (USD)**: プロダクトの USD 価格です。この価格を基準に、全国の価格が自動的に計算・設定されます。後から[国や地域ごとに価格をカスタマイズ](edit-product#set-country-specific-prices)することもできます。
5. **Save & Continue** をクリックします。
6. App Store に公開する予定がある場合は、App Store 向けのプロダクト情報を設定します。
- **Product ID**: プロダクトの恒久的なユニーク ID を作成します。
- **Product group**: App Store Connect で作成した既存のプロダクトグループを選択するか、**Create new Product Group** をクリックしてグループ名を設定します。Adapty がグループを作成した後、ドロップダウンから選択できます。
- **Screenshot**: 提供するアイテムやサービスが明確に表示されているアプリ内課金のスクリーンショットをアップロードします。このスクリーンショットは App Store の審査にのみ使用され、App Store 上には表示されません。スクリーンショットのサイズとフォーマットの要件は[こちら](https://developer.apple.com/help/app-store-connect/reference/app-information/screenshot-specifications/)をご確認ください。
7. **Push data to App Store** をクリックします。
:::warning
このアプリで初めてのプロダクトの場合は、App Store Connect で手動で審査に提出する必要があります。これは初回のみ必要です。審査が完了すると、Adapty 上のプロダクトのステータスは自動的に更新されます。
:::
8. Google Play に公開する予定がある場合は、Google Play 向けのプロダクト情報を設定します。
- **Base Product ID**: プロダクトの恒久的なユニーク ID を作成します。
- **Subscription**: Google Play Console で作成した既存のサブスクリプショングループを選択するか、**Create new Product Group** をクリックしてグループ名と ID を設定します。Adapty がグループを作成した後、ドロップダウンから選択できます。
:::note
グレース期間とアカウント保留期間は、Play Store のルールに従ってデフォルト値が自動設定されます。後から Google Play Console で変更できます。
:::
9. **Push data to Play Store** をクリックします。
10. iOS の場合は、ドロップダウンから **Free duration** を選択して初回オファー(無料トライアル)を設定します。この初期設定では無料トライアルの初回オファーを追加できます。メインプロダクトがストアの審査に通過したら、ストアコンソールの既存 ID を紐付けることで[さらにオファーを追加](offers)(プロモーションオファーやウィンバックオファーなど)できます。
:::important
初回オファーは Google Play と自動的に同期されません。App Store とは異なり、Google Play には「初回オファー」という独立したタイプがありません。無料トライアルや割引オファーはすべて、ベースプランの**オファー**として設定します。[Google Play Console でオファーを作成し、Adapty プロダクトに紐付けてください](google-play-offers)。
:::
11. 最後に **Save** をクリックしてプロダクトの作成を確定します。
## プロダクトを作成して既存のストアプロダクトに接続する \{#create-product-and-connect-existing-store-products\}
:::warning
始める前に、以下を確認してください。
- 必要なストアとのインテグレーションが設定済みであること:
- [App Store](initial_ios)
- [Google Play](initial-android)
- 必要なストアでプロダクトが作成済みであること:
- [App Store](app-store-products)
- [Google Play](android-products)
**プロダクトをまだ作成していない場合**は、[ストアへのプッシュ](#create-product-and-push-to-store)ガイドに従って、Adapty とストアの両方に同時に作成することをおすすめします。
:::
2. 右上の **Create product** をクリックします。Adapty はサブスクリプション、非消耗型(永続アクセスを含む)、消耗型アイテムなど、すべてのプロダクトタイプに対応しています。
3. **Connect an existing store product** を選択します。
4. 以下の情報を入力します。
- **Product name**: Adapty ダッシュボードで使用するプロダクト名を入力します。この名前は主に管理用ですので、Adapty ダッシュボード全体で使いやすい名前を自由に選んでください。
- **Access Level ID**: プロダクトが属する[アクセスレベル](access-level)を選択します。アクセスレベルは、プロダクトを購入した後に解放される機能を決定します。このリストには、事前に作成されたアクセスレベルのみ表示されます。`premium` アクセスレベルは Adapty でデフォルトで作成されていますが、[アクセスレベルを追加する](access-level)こともできます。
- **Subscription duration**: リストからサブスクリプションの期間を選択します。
- **Weekly/Monthly/2 Months/3 Months/6 Months/Annual**: サブスクリプションの期間。
- **Lifetime**: アプリのプレミアム機能を永続的に解放するプロダクトには、永続期間を使用します。
- **Non-Subscriptions**: サブスクリプションではなく、期間のないプロダクトには Non-Subscriptions を使用します。追加機能や消耗型プロダクトなどに利用できます。
- **Consumables**: 消耗型アイテムは複数回購入できます。アプリのライフサイクル中に使い切るものです。ゲーム内通貨や追加アイテムが例として挙げられます。消耗型プロダクトはアクセスレベルに影響しないことに注意してください。買い切り購入でアクセスレベルを付与するには、**Non-Subscriptions** を使用してください。
- **Price (USD)**: プロダクトの USD 価格です。プロダクトがすでにストアにある場合、この値はストアの実際の価格には影響しません。リストから任意の値を選択できます。後から Adapty ダッシュボード上で[地域ごとの価格をカスタマイズ](edit-product#set-country-specific-prices)することもできます。
5. **Continue** をクリックします。
6. 各ストアのプロダクト情報を設定します。
- **App Store:**
- **App Store Product ID:** デバイス上でプロダクトにアクセスするために使用する一意の識別子です。リストから選択してください。リストに表示されない場合は、App Store Connect での設定を確認し、正しくこのアプリに紐付けられているかご確認ください。
- **Play Store:**
- **Google Play Product ID:** Play Store でのプロダクト識別子です。リストから選択してください。リストに表示されない場合は、Google Play Console での設定を確認し、正しくこのアプリに紐付けられているかご確認ください。
- **Base Plan ID:** Play Store でプロダクトのベースプランを定義するために使用する ID です。Play Store でサブスクリプションのプロダクト ID を追加する際は、ベースプラン ID の指定が必要です。ベースプランは、請求期間、更新タイプ(自動更新またはプリペイド)、および関連する価格を含むサブスクリプションの基本情報を定義します。Adapty では、同じサブスクリプションでも異なるベースプランの組み合わせはそれぞれ別のプロダクトとして扱われます。
- **Legacy fallback product**: フォールバックプロダクトは、古いバージョンの Adapty SDK(バージョン 2.5 以前)を使用するアプリ専用です。Google Play Console でプロダクトを後方互換としてマークすることで、Adapty は古い SDK バージョンで購入可能かどうかを識別できます。このフィールドには `
## 国別価格を設定する \{#set-country-specific-prices\}
Adapty ダッシュボード上で地域ごとに異なる価格を設定でき、その国別価格は App Store Connect や Google Play Console のプロダクトに自動的に反映されます。
国別価格を設定するには:
1. [編集用にプロダクトを開きます](#edit-product)。
2. **Download** をクリックして、ストアから正しい形式で現在の価格をエクスポートするか、新しい CSV ファイルを作成します。
3. CSV ファイルで価格を更新します。[フォーマット](#csv-file-format)に従ってください。ある国の価格を変更しないまま残したり、ファイルに含めなかったりした場合、何も変更されません。CSV をアップロードすると、Adapty は価格を比較して異なるものだけを更新します。
4. **Edit** ウィンドウで **Upload** をクリックし、CSV ファイルを選択します。
5. 既存のサブスクライバーにも変更を適用したい場合は、**Apply to existing subscribers** を選択します。
6. 適用される変更内容を確認して、**Save changes** をクリックします。
### CSV ファイルのフォーマット \{#csv-file-format\}
:::tip
同じアプリに類似したプロダクトがある場合や、異なるアプリで同じ価格を設定したい場合は、同じ CSV ファイルを再利用できます。
:::
CSV で価格を編集する最も簡単な方法は、[現在の価格が含まれたファイルをダウンロードして直接編集する](#set-country-specific-prices)ことです。
ご自身で作成する場合は、ファイルに以下のカラムが必要です:
- `region_name`
- `region_code`
- `app_store_currency`
- `app_store_requested_price`
- `play_store_currency`
- `play_store_requested_price`
例:
```
region_name,region_code,app_store_currency,app_store_requested_price,play_store_currency,play_store_requested_price
United States,US,,8.99,,8.99
United Arab Emirates,AE,USD,8.99,AED,39.99
Germany,DE,USD,8.99,USD,8.99
```
## 監査ログを確認する \{#view-audit-log\}
Adapty は各プロダクトのすべての価格変更を記録しているため、誰がいつ変更を行ったかを追跡できます。監査ログを確認するには:
1. Adapty のメインメニューから **[Products](https://app.adapty.io/products)** に移動します。
2. プロダクトの横にある三点メニューをクリックして **Audit log** を選択します。
監査ログテーブルには、各価格変更の日付、チームメンバーの名前と役割、変更件数が表示されます。
イベントの詳細な CSV を取得するには、そのイベントの行にあるダウンロードアイコンをクリックします。
---
# File: delete-product
---
---
title: "プロダクトを削除する"
description: "アプリの収益フローを妨げることなく、Adapty でサブスクリプションプロダクトを削除する方法をご確認ください。"
---
削除できるのは、ペイウォールで使用されていないプロダクトのみです。
プロダクトを削除するには:
1. Adapty メインメニューから **[Products](https://app.adapty.io/products)** に移動します。
2. プロダクトの横にある **3-dot** ボタンをクリックし、**Delete** を選択します。
2. 削除しようとしているプロダクトの名前を入力します。
3. **Delete forever** をクリックします。
---
# File: add-product-to-paywall
---
---
title: "ペイウォールにプロダクトを追加する"
description: "Adaptyのペイウォールにプロダクトを追加・管理する方法を説明します。"
---
アプリのユーザーが[ペイウォール](paywalls)でプロダクトを表示・選択できるようにするには、以下の手順に従ってください。
1. [ペイウォールの設定](create-paywall)中に、**Products** タイトルの下にある **Add product** をクリックします。
2. 表示されるドロップダウンリストから、顧客に表示するプロダクトを選択します。リストには事前に作成済みのプロダクトのみ表示されます。プロダクトの順序はSDK側でそのまま反映されるため、ペイウォールを設定する際は表示順序を考慮することが重要です。また、必要に応じてプロダクトにオファーを指定することもできます。
3. ペイウォールのステータスに応じて、**Create as draft** または **Save and publish** をクリックします。
なお、ペイウォールを作成した後は、ペイウォールの指標に影響を与える可能性があるため、プロダクトの編集・追加・削除は推奨されません。
---
# File: virtual-currencies
---
---
title: "仮想通貨"
description: "Adaptyでアプリ内通貨を定義し、プロダクトにリンクして自動的にクレジットを付与し、すべてのユーザーの残高を追跡します。"
---
Google Play Consoleでオファーを作成するには:
1. **Add offer**をクリックし、リストからベースプランを選択します。
2. オファーIDを入力します。後で分析やAdaptyダッシュボードで使用されるため、わかりやすい名前をつけてください。
3. 利用資格の条件を選択します:
1. **New customer acquisition**:過去にこのオファーを利用したことのない新規サブスクライバーのみが対象になります。最も一般的なオプションで、デフォルトとして使用することを推奨します。
2. **Upgrade**:他のサブスクリプションからアップグレードするユーザーが対象になります。たとえば、ブロンズからゴールドプランへのアップグレードなど、既存のサブスクライバーにより高額なプランを訴求したい場合に使用します。
3. **Developer determined**:アプリのコードからオファーの利用対象を制御できます。無料または割引サブスクリプションを繰り返し有効化される可能性があるため、本番環境での使用には注意が必要です。解約済みサブスクライバーのウィンバックに適したオファータイプです。
4. オファーに最大2つの料金フェーズを追加します。利用可能なフェーズタイプは3種類あります:
1. **Free trial**:設定した期間(最短3日)、サブスクリプションを無料で使用できます。最も一般的なオファーです。
2. **Single payment**:最初にまとめて支払うことでサブスクリプションが割引になります。例えば、通常は月額$9.99のプランが、このオファータイプでは最初の3ヶ月で$19.99(30%割引)になります。
3. **Discounted recurring payment**:最初の`n`期間、サブスクリプションが割引になります。例えば、通常は月額$9.99のプランが、このオファータイプでは最初の3ヶ月間、毎月$4.99(50%割引)になります。
オファーには2つのフェーズを設定できます。この場合、最初のフェーズはFree trialとし、2番目はSingle paymentまたはDiscounted recurring paymentにする必要があります。この順番で適用されます。
:::important
ペイウォールビルダーで作成したペイウォールは、複数フェーズのGoogle Playサブスクリプションオファーのうち、最初のフェーズのみを表示します。ただし、ユーザーがプロダクトを購入した際には、Google Playで設定したとおりすべてのオファーフェーズが適用されますのでご安心ください。
:::
5. アプリで使用するためにオファーをアクティベートします。
6. [AdaptyへのオファーAdaptyへのオファーの追加](create-offer)に進みます。
:::note
オファーIDは、異なるベースプラン間で同じものを使用できます。
:::
## 次のステップ \{#next-steps\}
オファーを追加したら、次のセットアップに進みます:
- **App Storeにもアプリがある**場合は、[App Storeガイド](app-store-offers)をご覧ください。
- **Google Playのみにアプリがある**場合は、[このガイド](create-offer)に従ってAdaptyにオファーを追加してください。
---
# File: create-offer
---
---
title: "Adaptyへのオファーの追加"
description: "Adaptyのツールを使って特別なサブスクリプションオファーを作成・管理しましょう。"
---
Adaptyでは、新規・既存・解約済みのサブスクライバーに対してトライアルや割引を提供できます。
App Store ConnectやGoogle Play Consoleで設定した後、Adaptyに追加するには2つのステップが必要です:
1. [ストアのオファーIDを使ってAdaptyのプロダクトにオファーを追加する。](#1-create-offer)
2. [フローまたはペイウォールでオファーを表示する。](#2-display-offer)
:::warning
初回オファー(App Store)は、ユーザーが対象である場合に自動的に適用されます。Adaptyのプロダクトに追加する必要はありません。
このガイドでは、プロモーションオファー(App Store)、ウィンバックオファー(App Store)、およびすべてのGoogle Playオファーの設定方法を説明します。
:::
## 0. 開始前の確認事項 \{#0-before-you-start\}
Adaptyでオファーの設定を始める前に、以下を確認してください:
1. 必要なオファーをストアで作成済みであること:
- [App Store](app-store-offers)
- [Google Play](google-play-offers)
2. Adaptyで[プロダクト](create-product)を作成し、IDを追加済みであること。
3. App Storeの場合:[プロモーションオファー用のアプリ内購入キー](app-store-connection-configuration#step-4-for-trials-and-special-offers--set-up-promotional-offers)をアップロード済みであること。
## 1. Adaptyのプロダクトにオファーを追加する \{#1-add-offer-to-product-in-adapty\}
Play StoreおよびApp Storeのプロモーションオファー、またはApp StoreのWin-backオファーをアプリストアで設定したら、Adaptyへの追加はシンプルです:
1. Adaptyのメインメニューから[**Products**](https://app.adapty.io/products)を開き、オファーを追加したいプロダクトを探します。
2. オファーを追加したいプロダクトを見つけ、**Actions**列のプロダクト横にある**3-dot**ボタンをクリックして**Edit**を選択します。
3. **Edit product**ウィンドウで、**+**をクリックして**Add offers**を選択します。
4. **Add offer**をクリックします。
5. プロダクトのオファー詳細を入力します。
オファーのフィールドは以下のとおりです:
- **Offer name**:Adaptyで識別しやすいようにオファー名を入力します。任意の名前を使用できます。
- **App Store Offer type**:追加するApp Storeオファーのタイプ(PromotionalまたはWin-back)を選択します。(初回オファーは追加不要です—対象の場合は自動的に適用されます。)
- **App Store Offer ID**:[App Storeで設定した](app-store-products)オファーの固有IDです。
- **Play Store Offer ID**:同様に、[Play Storeで設定した](android-products)オファーの固有IDです。
:::tip
**App Store Offer ID**または**Play Store Offer ID**フィールドが非アクティブの場合は、**Products**タブに切り替えてプロダクトIDを選択してください。
:::
6. (任意)**Add offer**をクリックして、必要に応じてオファーを追加します。
7. **Save**をクリックしてオファーをプロダクトに追加します。
## 2. オファーを表示する \{#2-display-offer\}
オファーをプロダクトに紐付けたら、ユーザーがそのプロダクトを見る場所—フローまたはペイウォール—に表示します。
### フローにオファーを追加する \{#add-offer-to-flow\}
[フロービルダー](adapty-flow-builder)では、オファーはProductsエレメントのプロダクトに紐付けられます。まずプロダクトエレメントを追加してプロダクトを割り当ててください—[購入の設定](paywall-product-block)を参照してください。
オファーを紐付けるには:
1. キャンバス上で、オファーを表示するプロダクトカードを選択します。
2. 右側のパネルの**Product**で、プロダクトを選択し、**Select offer (optional)**ドロップダウンからオファーを選びます。
### ペイウォールにオファーを追加する \{#add-offer-to-paywall\}
:::info
**live**ステータスのペイウォールにオファーを追加することはできません。既存のペイウォールにオファーを追加したい場合は、[複製](duplicate-paywalls)して新しいペイウォールでプロダクトを設定してください。
:::
アプリのユーザーが[ペイウォール](paywalls)内でオファーを確認・選択できるようにするには、次の手順に従ってください:
1. ペイウォールの作成または編集時に、**General**タブでオファーを追加したプロダクトを追加します。
2. このプロダクトに作成したオファーを**Offer**リストから選択します。リストはオファーが設定されているプロダクトにのみ表示されます。
3. 必要に応じてプロダクトとオファーを追加できますが、各プロダクトにつき1つのオファーのみ追加できます。
## Adaptyでのオファーの動作について \{#how-adapty-works-with-offers\}
オファーの動作について以下の点にご注意ください:
- ユーザーがオファーの対象である場合、Adaptyは購入時に設定したオファーを自動的に適用します。
- App StoreでプロダクトにIntroductory offerとPromotional offerの両方が設定されている場合、対象ユーザーはまずIntroductory offerを受け取ります。その期間が終了した後、ユーザーがまだPromotional offerの対象であり、Adaptyでそのオファーを設定している場合、再度プロダクトを購入しようとしたときに適用されます。
- オファーの適用方法をより細かく制御したい場合や、特定のケースでオファーなしにプロダクトを販売したい場合は、いくつかの選択肢があります:
- App StoreまたはGoogle Play Consoleで対象条件を設定する
- App StoreまたはGoogle Play Consoleでオファーなしの別プロダクトを作成する
- Adaptyでオファーなしの別プロダクトを作成し、両方のプロダクトバリアントを含むペイウォールを[プレースメント](placements)に追加して、オーディエンス[セグメント](segments)を使ってどのペイウォールをどのユーザーに表示するかを制御する。たとえば、**Subscription product**や**Paid access level**に基づいたセグメントを作成したり、[カスタム属性](profiles-crm)を使って独自のロジックを実装したりすることができます。
---
# File: create-access-level
---
---
title: "アクセスレベルの作成"
description: "ユーザーセグメンテーションを改善するために、Adaptyでアクセスレベルを作成・割り当てる方法を説明します。"
---
アクセスレベルを使うと、プロダクトIDをハードコードすることなく、アプリ内でユーザーに許可する操作を制御できます。各プロダクトは、ユーザーが特定のアクセスレベルを得られる期間を定義します。ユーザーが購入を行うと、Adaptyはサブスクリプションの場合は一定期間、永続購入の場合は永続的にアプリへのアクセスを付与します。
Adapty ダッシュボードでアプリを作成すると、`premium` アクセスレベルが自動的に生成されます。これはデフォルトのアクセスレベルとして機能し、削除することはできません。
:::tip
[Developer CLI](developer-cli-reference#adapty-access-levels-create) を使用してアクセスレベルをプログラムで作成することもできます。
:::
新しいアクセスレベルを作成するには:
1. Adaptyのメインメニューから **[Products](https://app.adapty.io/access-levels)** に移動し、**Access levels** タブを選択します。
2. **Create access level** をクリックします。
3. **Create access level** ウィンドウで、IDを設定します。このIDはモバイルアプリ内での識別子として機能し、ユーザーが購入した際に追加機能へのアクセスを有効にします。また、この識別子はアプリ内で他のアクセスレベルと区別するためにも役立ちます。わかりやすく、理解しやすいIDを設定してください。
4. **Create access level** をクリックして、アクセスレベルの作成を確定します。
---
# File: assigning-access-level-to-a-product
---
---
title: "プロダクトにアクセスレベルを割り当てる"
description: "サブスクリプション管理を最適化するために、プロダクトにアクセスレベルを割り当てます。"
---
すべての[プロダクト](product)には、購入時にユーザーが対応するコンテンツにアクセスできるよう、アクセスレベルを関連付ける必要があります。Adapty はサブスクリプションの期間を自動的に判別し、それをアクセスレベルの有効期限として設定します。永続アクセスのプロダクトを購入した場合、アクセスレベルは有効期限なしで永続的に有効になります。
プロダクトにアクセスレベルを紐付けるには:
1. [プロダクトの設定](create-product)中に、**Access Level ID** リストからアクセスレベルを選択します。
2. **Save** をクリックします。
---
# File: give-access-level-to-specific-customer
---
---
title: "特定の顧客にアクセスレベルを付与する"
description: "Adaptyの高度なツールを使用して、顧客に特定のアクセスレベルを割り当てます。"
---
Adapty ダッシュボードから、特定の顧客のアクセスレベルを手動で調整できます。これはサポート対応などの場面で特に便利です。たとえば、素晴らしいレビューを投稿してくれたお礼として、ユーザーのプレミアム利用期間を1週間延長したい場合などに活用できます。
## Adapty ダッシュボードで特定の顧客にアクセスレベルを付与する \{#give-access-level-to-a-specific-customer-in-the-adapty-dashboard\}
1. Adapty のメインメニューから **[Profiles and Segments](https://app.adapty.io/placements)** に移動します。
2. アクセスを付与したい顧客をクリックします。
3. **Add access level** をクリックします。
4. 付与するアクセスレベルと、その顧客に対する有効期限を選択します。
5. **Apply** をクリックします。
## API で特定の顧客にアクセスレベルを付与する \{#give-access-level-to-a-specific-customer-via-api\}
Adapty API を使用して、サーバーから顧客にアクセスレベルを付与することもできます。紹介報酬やプロダクトに関連するその他のイベントに対してボーナスを提供する場合に便利です。詳しくは [サーバーサイド API でアクセスレベルを付与する](api-adapty/operations/grantAccessLevel) のページをご覧ください。
---
# File: local-access-levels
---
---
title: "ローカルアクセスレベル"
description: "一時的な障害発生時にアクセスレベルを管理します。"
---
:::important
以下の点に注意してください:
- ローカルアクセスレベルは、Adapty SDK バージョン 3.12 以降でサポートされています。
- セキュリティ上の理由から、Android ではデフォルトでローカルアクセスレベルが無効になっています。必要な場合は、SDK のアクティベーション時に有効にしてください: [Android](sdk-installation-android#enable-local-access-levels)、[React Native](sdk-installation-reactnative)、[Flutter](sdk-installation-flutter#enable-local-access-levels-android)。
:::
設定した各プロダクトには [**アクセスレベル**](access-level) が紐付けられています。ユーザーが購入を行うと、Adapty SDK はそのアクセスレベルをユーザーの[プロファイル](profiles-crm)に付与します。アプリ内の有料コンテンツへのアクセス可否の判定には、このアクセスレベルを使用する必要があります。
Adapty SDK は非常に信頼性が高く、サーバーが利用できなくなるケースはほとんどありません。しかし、万が一そのような状況が発生しても、ユーザーが気づくことはありません。
ユーザーが購入を行ったとき、Adapty がレスポンスを受信できない場合、SDK はストアで直接購入を検証する処理に切り替わります。これによりアクセスレベルはアプリ内でローカルに付与され、有効にするための追加設定は不要です。SDK がバックグラウンドで自動的に処理するため、ユーザーは通常どおり購入したコンテンツにアクセスできます。
ローカルアクセスレベルの動作について、以下の点に注意してください:
- ユーザーがオンラインに戻ると、トランザクション情報が自動的に Adapty サーバーへ送信され、サーバーはそのトランザクションをユーザープロファイルに適用して、更新されたプロファイルを SDK に返します。
- データが送信されるまで、更新された情報は Adapty アナリティクスに反映されません。
- ローカルアクセスレベルは、Adapty サーバーがダウンしている場合にのみ機能します。それ以外の場合、SDK はキャッシュされたデータを使用します。
- ローカルアクセスレベルは消耗型アイテムには機能しません。ただし、Adapty ダッシュボードで消耗型アイテムにサブスクリプションタイプ(月次、年次、週次など)が設定されている場合は除きます。
---
# File: choose-meaningful-placements
---
---
title: "意味のあるプレースメントの選び方"
description: "Adaptyを使ってフローとペイウォールのプレースメントを最適化し、ユーザーエンゲージメントと収益を向上させましょう。"
---
[プレースメントを作成する](create-placement)際は、アプリの論理的なフローと、ユーザーに提供したいエクスペリエンスを考慮することが重要です。ほとんどのアプリでは、実験を実施できる能力を損なわずに済む[プレースメント](placements)の数は5つ以下が目安です。以下はプレースメントの構成例です。
1. **オンボーディングフロー:** このステージは、ユーザーがアプリと最初に接触する場面です。フロー、オンボーディング、ペイウォールのプレースメントを組み合わせて、アプリの価値提案をユーザーに紹介する絶好の機会です。サブスクリプションの80%以上はオンボーディング中に有効化されるため、ここで最も収益性の高いサブスクリプションを訴求することが重要です。Adaptyを使えば、オーディエンスに応じて異なる[フロー](adapty-flow-builder)、[オンボーディング](onboardings)、[ペイウォール](paywalls)を簡単に設定でき、A/B テストで最適な選択肢を見つけることができます。たとえば、米国のユーザーに対してより高額なサブスクリプションを50%の確率で表示するA/B テストを実施できます。
2. **アプリ設定:** オンボーディング中にサブスクリプションしなかったユーザーに対して、アプリ内にフローまたはペイウォールのプレースメントを設置できます。これはアプリ設定内や、ユーザーが特定のターゲットアクションを完了した後などに配置できます。アプリ内のユーザーはサブスクリプションをより慎重に検討する傾向があるため、ここで提供するプロダクトはオンボーディング段階のものよりやや安価に設定するとよいでしょう。
3. **プロモ:** フローやペイウォールを複数回見てもサブスクリプションしなかったユーザーには、価格が高すぎるか、サブスクリプション自体に躊躇している可能性があります。この場合、最も手頃なサブスクリプションや永続アクセスプロダクトを含む特別オファーを表示できます。これにより、価格を重視するユーザーやサブスクリプションに懐疑的なユーザーの購買意欲を高めることができます。
ほとんどのアプリはこれと同様のロジックとプレースメント構成を持ち、ユーザージャーニーとフロー・ペイウォール・オンボーディング・A/B テストを表示してコンバージョンと収益を促進できる重要なポイントに沿って設計されます。各プレースメントで設定を行い、マネタイズ戦略を実験・最適化しましょう。
---
# File: create-placement
---
---
title: "プレースメントを作成する"
description: "Adapty でプレースメントを作成・管理して、フローとペイウォールのパフォーマンスを向上させましょう。"
---
[プレースメント](placements)とは、モバイルアプリ内でフロー、ペイウォール、オンボーディング、または A/B テストを表示できる特定の場所のことです。たとえば、サブスクリプションの選択画面をスタートアップフローに表示したり、ゲームでコインが不足したときに消耗型アイテム(ゴールドコインなど)を表示したりできます。
同じフロー、ペイウォール、オンボーディング、または A/B テストを複数のプレースメントで表示したり、異なるユーザーセグメント(Adapty では「オーディエンス」と呼びます)に対して異なるコンテンツを表示したりすることも可能です。
適切なプレースメントの選び方については、[意味のあるプレースメントを選ぶ](choose-meaningful-placements)セクションをご参照ください。
:::tip
[Developer CLI](developer-cli-reference#adapty-placements-create) を使ってプレースメントをプログラムで作成することもできます。
:::
:::info
プレースメントの作成プロセスはフロー、ペイウォール、オンボーディングで似ていますが、1 つのプレースメントで複数のタイプを兼用することはできません。プレースメントの種類ごとに処理される指標が異なるためです。
:::
## プレースメントを作成・設定する \{#create-and-configure-a-placement\}
1. Adapty のメインメニューから **[Placements](https://app.adapty.io/placements)** に移動します。作成したいプレースメントの種類に応じて、**Flows**、**Paywalls**、または **Onboardings** タブに切り替えます。
2. **Create placement** をクリックします。
3. **Placement name** を入力します。これは Adapty ダッシュボード内の内部識別子です。後から編集することもできます。
4. **Placement ID** を入力します。この ID は、Adapty SDK でプレースメントの[フロー](adapty-flow-builder)、[ペイウォール](paywalls)、[オンボーディング](onboardings)、[A/B テスト](ab-tests)を呼び出す際に使用します。各プレースメントで一意のため、後から編集することはできません。
次に、プレースメントにフロー、ペイウォール、オンボーディング、または A/B テストを割り当てます。Adapty は[セグメント](segments)に基づくユーザーセグメントである[オーディエンス](audience)をサポートしており、異なるユーザーグループに異なるコンテンツを表示できます。ターゲティングが不要な場合は、デフォルトの *All users* オーディエンスがすべてのユーザーをカバーします。
:::note
続行する前に、実行したいフロー、ペイウォール、オンボーディング、またはA/B テストと、指定したいオーディエンスを作成済みであることを確認してください。
:::
1. **Placements/ Your placement** ウィンドウで、デフォルトの *All users* オーディエンスに表示するフロー、ペイウォール、オンボーディング、またはA/B テストを追加します。これを行うには、**Run flow**、**Run paywall**、または **Run A/B test** ボタン(ラベルはプレースメントの種類によって異なります)をクリックし、ドロップダウンリストから目的のフロー、ペイウォール、オンボーディング、またはA/B テストを選択します。
2. プレースメントで複数のオーディエンスを使用して、異なるユーザーグループ向けにパーソナライズされたコンテンツを作成したい場合は、**Add audience** ボタンをクリックして、リストから目的のユーザーセグメントを選択します。
エクスポートされたCSVファイルには、プレースメントに関する以下の情報が含まれます:
- プレースメントID
- プレースメント名
- オーディエンス名
- セグメント名
- クロスプレースメント A/B テスト名
- A/B テスト名
- フロー名、ペイウォール名、またはオンボーディング名(エクスポートしたタブによって異なります)
:::note
クロスプレースメント A/B テストはフローのプレースメントには対応していないため、フローのエクスポートではその列は空になります。
:::
---
# File: delete-placement
---
---
title: "プレースメントの削除"
description: "フローやペイウォールのパフォーマンスに影響を与えずに、Adapty でプレースメントを削除する方法をご確認ください。"
---
[プレースメント](placements)は、モバイルアプリ内でフロー、ペイウォール、オンボーディング、または A/B テストを表示する特定の場所を指定するものです。
:::danger
任意のプレースメントを削除することは可能ですが、モバイルアプリで現在使用中のプレースメントを削除しないよう十分に注意してください。アクティブなフローやペイウォールのプレースメントを削除すると、[フォールバックペイウォールを設定している場合](fallback-paywalls)はそれが永続的に表示され続け、リリース済みのアプリバージョンでは動的なフローやペイウォールに切り替えることが一切できなくなります。
:::
既存のプレースメントを削除するには、次の手順に従ってください。
1. Adapty のメインメニューから **[Placements](https://app.adapty.io/placements)** に移動します。削除したいプレースメントの種類に応じて、**Flows**、**Paywalls**、または **Onboardings** タブに切り替えます。
2. プレースメントの横にある **3-dot** ボタンをクリックし、**Delete** オプションを選択します。
3. 表示された **Delete placement** ウィンドウで、削除しようとしているプロダクト名を入力します。
4. **Delete forever** ボタンをクリックして削除を確定します。
---
# File: add-audience-paywall-ab-test
---
---
title: "オーディエンスとフロー、ペイウォール、またはA/Bテストをプレースメントに追加する"
description: "Adaptyで異なるオーディエンスセグメントに対してフローとペイウォールのA/Bテストを実施します。"
---
Adaptyの**オーディエンス**は、[セグメント](segments)で定義されたユーザーのグループです。オーディエンスを使うことで、フロー、ペイウォール、オンボーディング、A/Bテストを適切なユーザーに表示できます。各グループに最適なコンテンツが届くよう、フィルターを使ってセグメントを作成しましょう。
[プレースメント](placements)にオーディエンスを追加すると、特定のユーザーグループに対してフロー、ペイウォール、オンボーディング、またはA/Bテストをターゲティングできます。オーディエンスをプレースメントに紐付けることで、適切なユーザーが、アプリの利用フローの適切なタイミングで、適切なコンテンツを目にできるようになります。
フロー、ペイウォール、オンボーディング、またはA/Bテストを追加したいプレースメントを開くか、[Placements](https://app.adapty.io/placements) メニューから新しく作成してください。
:::note
続行する前に、実行したいフロー、ペイウォール、オンボーディング、またはA/B テストと、指定したいオーディエンスを作成済みであることを確認してください。
:::
1. **Placements/ Your placement** ウィンドウで、デフォルトの *All users* オーディエンスに表示するフロー、ペイウォール、オンボーディング、またはA/B テストを追加します。これを行うには、**Run flow**、**Run paywall**、または **Run A/B test** ボタン(ラベルはプレースメントの種類によって異なります)をクリックし、ドロップダウンリストから目的のフロー、ペイウォール、オンボーディング、またはA/B テストを選択します。
2. プレースメントで複数のオーディエンスを使用して、異なるユーザーグループ向けにパーソナライズされたコンテンツを作成したい場合は、**Add audience** ボタンをクリックして、リストから目的のユーザーセグメントを選択します。
このような場合、オーディエンス優先度が重要になります。オーディエンス優先度は数値による順序で、#1 が最も高い優先度を持ちます。これにより、オーディエンスをチェックする順番が決まります。簡単に言うと、オーディエンス優先度はペイウォール、オンボーディング、またはA/Bテストを表示する際にどのオーディエンスを最初に適用するかを Adapty が判断するための指針です。優先度が低いオーディエンスは、条件に合うユーザーが他のより高い優先度のオーディエンスに割り振られてしまい、スキップされる可能性があります。
クロスプレースメントオーディエンス([クロスプレースメントA/Bテスト](ab-tests#ab-test-types)向けに作成されたもの)は、常に通常のオーディエンスより優先されます。
「全ユーザー」オーディエンスは、他のどのオーディエンスにも一致しないすべてのユーザーを含むフォールバックであるため、常に最低優先度となります。
プレースメントのオーディエンス優先度を調整するには:
1. 新しいプレースメントの作成中または既存のプレースメントの編集中に、**Edit priority** をクリックします。このボタンは、プレースメントに少なくとも3つのオーディエンス(「全ユーザー」とその他2つ)が追加されている場合にのみ表示されます。それ未満の場合は順序が自明のため(「全ユーザー」が最後)、ボタンは表示されません。
2. 表示された **Edit audience priorities** ウィンドウで、オーディエンスをドラッグ&ドロップして正しい順序に並べ替えます。
3. **Save** ボタンをクリックします。
---
# File: placement-metrics
---
---
title: "プレースメント指標"
description: "Adaptyのプレースメント指標を分析して、ペイウォールのパフォーマンスを改善しましょう。"
---
Adaptyでは、アプリ内に複数のプレースメントを作成・管理でき、それぞれに異なるペイウォールやA/B テストを紐付けることができます。この柔軟性により、特定のユーザーセグメントをターゲットにしたり、異なるオファーや価格モデルを試したり、アプリの収益化戦略を最適化したりすることが可能です。
プレースメントのパフォーマンスやオファーに対するユーザーエンゲージメントに関する有益なインサイトを収集するため、Adaptyは表示されたペイウォールに関連するさまざまなユーザーインタラクションとトランザクションを追跡します。この強力な分析システムは、ビュー数、ユニークビュー数、購入数、トライアル数、返金数、コンバージョン率、収益などの指標を収集します。
収集された指標はリアルタイムで継続的に更新され、Adaptyの使いやすいダッシュボードから簡単にアクセスして分析できます。分析する時間範囲を自由にカスタマイズし、さまざまなパラメーターに基づいてフィルターを適用し、複数のプレースメント、ユーザーセグメント、プロダクト間で指標を比較することができます。
プレースメント指標はプレースメント一覧で確認でき、すべてのプレースメントのパフォーマンス概要を把握できます。この高レベルのビューでは、各プレースメントの集計指標が表示され、パフォーマンスの比較やトレンドの特定が可能です。
各プレースメントをより詳しく分析するには、プレースメントの詳細指標ページに移動します。このページでは、選択したプレースメントに特化した包括的な指標が表示されます。これらの指標により、特定のプレースメントのパフォーマンスをより深く把握し、有効性を評価してデータに基づいた意思決定を行うことができます。
### インストール日による指標のフィルタリング \{#filter-metrics-by-install-date\}
ペイウォール、トライアル、購入の指標は、2つの異なる日付でグループ化できます:
- **イベント日** — ペイウォールが表示された日、トライアルが開始された日、または購入が行われた日。
- **インストール日** — ユーザーが初めてアプリを開いた日。
同じ日付範囲でも、この2つのビューは大きく異なる数値を示すことがあります。**Filter metrics by install date** チェックボックスで、ダッシュボードがどちらを使用するかを制御します:
- **チェックなし(デフォルト)**:指標はイベント日でグループ化されます。
- **チェックあり**:指標はインストール日でグループ化されます。
**例。** 日付範囲を4月1日〜30日に設定し、トライアルを確認します。
- **チェックなし**:それらのユーザーがいつインストールしたかに関わらず、4月に*開始*されたトライアルを表示します。
- **チェックあり**:トライアルがいつ開始されたかに関わらず、4月に*インストール*したユーザーのトライアルを表示します。
特定のコホートのユーザー獲得パフォーマンスを測定するにはインストール日ビューを使用し、特定の期間のペイウォールやオンボーディングのアクティビティを測定するにはイベント日ビューを使用してください。
### 指標のコントロール \{#metrics-controls\}
システムは選択した時間帯に基づいて指標を表示し、4段階のインデントを持つ左側の列パラメーターに従って整理されます。
#### 指標データの表示オプション \{#view-options-for-metrics-data\}
プレースメント指標ページでは、ペイウォールベースとオーディエンスベースの2つの表示オプションが用意されています。
ペイウォールベースのビューでは、指標はペイウォールに紐付いたプレースメントごとにグループ化されます。これにより、異なるプレースメント別に指標を分析できます。
オーディエンスベースのビューでは、指標はペイウォールのターゲットオーディエンスごとにグループ化されます。ユーザーは異なるオーディエンスセグメントに特有の指標を確認できます。
#### 時間範囲 \{#time-ranges\}
指標データを分析する時間範囲を選択でき、日、週、月、カスタム日付範囲など特定の期間に絞り込むことができます。
#### 利用可能なフィルターとグループ化 \{#available-filters-and-grouping\}
:::link
メイン記事:[分析コントロール](controls-filters-grouping-compare-proceeds)
:::
Adaptyは、ニーズに合わせて指標分析をフィルタリングおよびカスタマイズするための強力なツールを提供しています。Adaptyの指標ページでは、さまざまな時間範囲、グループ化オプション、フィルタリング機能が利用できます。
- ✅ フィルター対象:オーディエンス、ペイウォール、ペイウォールグループ、プレースメント、国、ストア
- ✅ グループ化対象:セグメント、ストア、プロダクト
#### 単一指標チャート \{#single-metrics-chart\}
プレースメント指標ページの主要コンポーネントの1つがチャートセクションで、選択した指標を視覚的に表示して分析を容易にします。
プレースメント指標ページのチャートセクションには、選択した指標の値を視覚的に表す水平棒グラフが含まれています。グラフの各バーは指標の値に対応しており、サイズが比例しているため一目でデータを理解できます。水平線は分析対象の期間を示し、垂直列には指標の数値が表示されます。すべての指標値の合計はグラフの隣に表示されます。
また、チャートセクションの右上にある矢印アイコンをクリックすると、ビューが拡張され、選択した指標がチャートの全幅で表示されます。
#### 合計指標サマリー \{#total-metrics-summary\}
単一指標チャートの隣には合計指標サマリーセクションが表示されます。ここでは特定の時点における選択した指標の累積値が確認でき、ドロップダウンメニューで表示する指標を変更することもできます。
### 指標の定義 \{#metrics-definitions\}
プレースメント指標の包括的な定義で、その可能性を最大限に活用しましょう。収益からコンバージョン率まで、アプリのマネタイズ戦略を強化し、成功へ導く貴重なインサイトを得られます。
:::note
Adapty は [currencylayer.com](https://currencylayer.com/) の為替レート(8時間ごとに更新)を使用して他の通貨を USD に変換します。レートは**取引時点で固定**されるため、その後の変動は変換結果に影響しません。
:::
#### 収益 \{#revenue\}
この指標は、特定のプレースメント内での購入および更新によって生成された収益の合計額(USD)を表します。収益の計算にはApple App StoreまたはGoogle Play Storeの手数料は含まれず、手数料控除前の金額として計算されます。
#### 手取り収益(Proceeds) \{#proceeds\}
この指標は、特定のプレースメント内での購入および更新から、Apple App StoreまたはGoogle Play Storeの適用手数料を差し引いた後にアプリオーナーが実際に受け取る金額(USD)を表します。アプリの収益に直接貢献する純収益を反映しています。手取り収益の計算方法の詳細については、Adaptyの[ドキュメント](analytics-cohorts#revenue-vs-proceeds)を参照してください。
#### ARPPU \{#arppu\}
ARPPUは「Average revenue per paying user(課金ユーザー1人あたりの平均収益)」の略で、特定のプレースメント内での課金ユーザー1人あたりの平均収益を測定します。総収益をユニーク課金ユーザー数で割って計算されます。例えば、総収益が15,000ドルで課金ユーザーが1,000人の場合、ARPPUは15ドルになります。
#### ARPAS \{#arpas\}
ARPASは「Average revenue per active subscriber(アクティブサブスクライバー1人あたりの平均収益)」の略で、特定のプレースメント内でのアクティブサブスクライバー1人あたりの平均収益を測定します。総収益をトライアルまたはサブスクリプションを有効化したサブスクライバー数で割って計算されます。例えば、総収益が5,000ドルでサブスクライバーが1,000人の場合、ARPASは5ドルになります。この指標はサブスクライバー1人あたりの平均収益化ポテンシャルを評価するのに役立ちます。
#### ARPU \{#arpu\}
オンボーディングプレースメント専用。ARPUはオンボーディングを閲覧したユーザー1人あたりの平均収益です。ユニーク閲覧者数で総収益を割って計算されます。
#### ユニーク購入コンバージョン率(Unique CR to purchases) \{#unique-cr-to-purchases\}
購入へのユニークコンバージョン率は、特定のプレースメント内での購入数をユニークビュー数で割って計算されます。購入数とユニークビュー数の比率に注目することで、特定のプレースメント内でユニーク訪問者を課金顧客に転換する効果についてのインサイトが得られます。
#### 購入コンバージョン率(CR to purchases) \{#cr-to-purchases\}
購入へのコンバージョン率は、特定のプレースメント内での購入数をペイウォールの総ビュー数で割って計算されます。特定のプレースメント内でのビューのうち購入に至った割合を示し、ペイウォールがユーザーを課金顧客に転換する効果についてのインサイトが得られます。
#### ユニークトライアルコンバージョン率(Unique CR to trials) \{#unique-cr-to-trials\}
トライアルへのユニークコンバージョン率は、特定のプレースメント内で開始されたトライアル数をユニークビュー数で割って計算されます。特定のプレースメント内でのユニークビューのうちトライアル有効化に至った割合を測定し、ペイウォールがユニーク訪問者をトライアルユーザーに転換する効果についてのインサイトが得られます。
#### 購入数(Purchases) \{#purchases\}
購入数は、特定のプレースメント内でのペイウォール上のさまざまなトランザクションの累計合計を表します。この指標には以下のトランザクションが含まれます(更新は含まれません):
- 特定のプレースメント内で直接行われた新規購入
- 特定のプレースメント内で最初に有効化されたトライアルのトライアル転換
- 特定のプレースメント内で行われたサブスクリプションのダウングレード、アップグレード、クロスグレード
- 特定のプレースメント内でのサブスクリプション復元(自動更新なしで期限切れになったサブスクリプションが再有効化された場合など)
これらのさまざまな種類のトランザクションを考慮することで、購入数指標は特定のプレースメント内での全体的な獲得および収益化活動の包括的なビューを提供します。
#### トライアル数(Trials) \{#trials\}
トライアル数指標は、特定のプレースメント内で有効化されたトライアルの総数を表します。これらのプレースメント内でペイウォールを通じてトライアル期間を開始したユーザーの数を反映します。この指標はトライアル提供の効果を追跡し、トライアルから有料サブスクリプションへのユーザーエンゲージメントとコンバージョンに関するインサイトを得るのに役立ちます。
#### トライアルキャンセル数(Trials canceled) \{#trials-canceled\}
トライアルキャンセル数指標は、特定のプレースメント内で自動更新機能がオフにされたトライアルの数を表します。これはユーザーが手動でトライアルを解約した場合に発生し、トライアル期間終了後にサブスクリプションを継続しないという意思を示しています。トライアルキャンセル数の追跡は、ユーザー行動に関する貴重な情報を提供し、特定のプレースメント内でユーザーがトライアルを離脱する割合を把握するのに役立ちます。
#### 返金数(Refunds) \{#refunds\}
返金数指標は、特定のプレースメント内での返金された購入およびサブスクリプションの数を表します。これには、顧客のリクエスト、支払いの問題、その他の返金ポリシーなど、さまざまな理由で取り消しまたは返金されたトランザクションが含まれます。
#### 返金率(Refund rate) \{#refund-rate\}
返金率は、特定のプレースメント内での返金数を初回購入数(更新は含まれません)で割って計算されます。例えば、返金が5件で初回購入が1,000件の場合、返金率は0.5%になります。
#### ビュー数(Views) \{#views\}
ビュー数指標は、特定のプレースメント内のペイウォールがユーザーに閲覧された総回数を表します。ユーザーがそのプレースメント内のペイウォールを訪れるたびに、個別のビューとしてカウントされます。ビュー数の追跡により、ペイウォールに対するエンゲージメントとユーザーインタラクションのレベルを把握でき、アプリの特定エリア内でのユーザー行動やペイウォールの配置およびデザインの有効性についてのインサイトが得られます。
#### ユニークビュー数(Unique views) \{#unique-views\}
ユニークビュー数指標は、特定のプレースメント内のペイウォールがユーザーに閲覧されたユニークなインスタンスの数を表します。各訪問を個別のビューとしてカウントする総ビュー数とは異なり、ユニークビュー数は、ユーザーがそのプレースメント内のペイウォールに何度アクセスしても、各ユーザーの訪問を1回としてカウントします。ユニークビュー数の追跡は、特定のプレースメント内でのユーザーエンゲージメントとペイウォールのリーチをより正確に測定するのに役立ちます。総訪問数ではなく個々のユーザーに注目しているためです。
#### 完了数とユニーク完了数(Completions & unique completions) \{#completions--unique-completions\}
オンボーディングプレースメント専用。完了数はユーザーがオンボーディングプレースメントを完了した(最初から最後のスクリーンまで進んだ)回数をカウントします。同じユーザーが2回完了した場合、**完了数**は2ですが**ユニーク完了数**は1になります。
#### ユニーク完了率(Unique completions rate) \{#unique-completions-rate\}
オンボーディングプレースメント専用。ユニーク完了数をユニークビュー数で割った値です。この指標は、オンボーディングプレースメントに対するユーザーのエンゲージメントを把握し、無視されていることに気づいた場合に改善を加えるのに役立ちます。
---
# File: create-paywall
---
---
title: "ペイウォールを作成する"
description: "Adaptyのペイウォールビルダーを使って、コンバージョン率の高いペイウォールを作成する方法を学びましょう。"
---
[ペイウォール](paywalls)とは、提供するプロダクトを定義するAdaptyの設定です。Adaptyでは、アプリ内でプロダクトを取得する唯一の方法がペイウォールです。
表示方法に関わらず、ペイウォールは必ず必要です:
- [**ペイウォールビルダー**](adapty-paywall-builder):ノーコードエディタで画面をデザインします。Adaptyがレンダリングと購入処理を行います。
- **カスタムペイウォール**:独自のUIを実装し、ペイウォールの設定を使ってプロダクトを取得します。
作成後は、ペイウォールを[プレースメント](placements)に割り当てます。プレースメントによって、ユーザーに表示されるペイウォールが決まります。公開中のペイウォールのプロダクトは固定されているため、指標は常に同じ組み合わせを反映し、異なるプロダクトや価格設定のパフォーマンスを比較できます。
:::tip
[Developer CLI](developer-cli-reference#adapty-paywalls-create)を使ってプログラムでペイウォールを作成することもできます。
:::
## 次のステップ \{#next-steps\}
最初のペイウォールを作成したら:
1. [プレースメント](placements)に追加します。プレースメントIDがハードコードされる唯一の要素になります。販売するプロダクトの取得にこれを使用します。
2. 次のペイウォールの作業方法は実装方法によって異なります:
- [Adaptyペイウォールビルダー](adapty-paywall-builder)を使用する場合は、ノーコードエディタでペイウォールをデザインします。Adaptyがペイウォールのレンダリングと購入ロジックを処理するため、アプリのコードではペイウォールを表示するだけで済みます。
- カスタムペイウォールを使用する場合は、各プラットフォームでAdaptyを使ったアプリ内課金を実装するためのガイドを参照してください:
- [iOS](ios-implement-paywalls-manually)
- [Android](android-implement-paywalls-manually)
- [React Native](react-native-implement-paywalls-manually)
- [Flutter](flutter-implement-paywalls-manually)
- [Unity](unity-implement-paywalls-manually)
- [Kotlin Multiplatform](kmp-implement-paywalls-manually)
---
# File: customize-paywall-with-remote-config
---
---
title: "リモートコンフィグでペイウォールをデザインする"
description: "Adapty のリモートコンフィグを使用してペイウォールをカスタマイズし、より精度の高いターゲティングを実現しましょう。"
---
:::important
このガイドはクラシックペイウォールのリモートコンフィグについて説明しています。フロービルダーについては、[フローのリモートコンフィグカスタマイズ](customize-flow-with-remote-config)をご参照ください。
:::
ペイウォールのリモートコンフィグは、柔軟な設定オプションを提供する強力なツールです。カスタム JSON ペイロードを使用して、ペイウォールを細かく調整できます。タイトル、画像、フォント、カラーなど、さまざまなパラメーターを定義することが可能です。
3. **Remote config** タブに切り替えます。
リモートコンフィグには 2 つの表示形式があります:
- [テーブル](customize-paywall-with-remote-config#table-view-of-the-remote-config)
- [JSON](customize-paywall-with-remote-config#json-view-of-the-remote-config)
**Table** と **JSON** の両方のビューには同じ設定要素が含まれています。違いは好みの問題ですが、唯一の相違点はテーブルビューにコンテキストメニューが用意されている点で、ローカライズのエラー修正に役立ちます。
**Table** または **JSON** タブをクリックすることで、いつでも表示を切り替えられます。
どちらのビューでペイウォールをカスタマイズした場合でも、SDK から `AdaptyPaywall` の `remoteConfig` または `remoteConfigString` プロパティを使用してこのデータにアクセスし、ペイウォールを調整できます。また、[サーバーサイド API](api-adapty/operations/updatePaywall) を使用してリモートコンフィグの値をプログラム的に更新することで、ダッシュボードを手動で更新することなくペイウォールの設定を動的に変更することも可能です。リモートコンフィグの活用例をいくつか紹介します。
### リモートコンフィグのテーブルビュー \{#table-view-of-the-remote-config\}
コードに慣れていない場合や JSON の値を修正したい場合は、Adapty の **Table** ビューが便利です。
JSON をテーブル形式で表示するため、読みやすく理解しやすくなっています。カラーコーディングによって異なるデータ型を識別できます。
キーを追加するには、**Add row** ボタンをクリックします。値と型のマッピングを自動でチェックし、修正内容が無効な JSON につながる可能性がある場合はアラートを表示します。
追加の行オプションは、主に[ペイウォールのローカライズ](add-remote-config-locale)で役立ちます:
次は[プレースメントを作成](create-placement)してペイウォールを追加しましょう。その後、モバイルアプリでリモートコンフィグのペイウォールを
4. **Locales** をクリックして対応させたい言語を選択します。変更を保存すると、これらのロケールがペイウォールに追加されます。
これで、コンテンツを手動で翻訳したり、AI を使ったり、外部の翻訳者向けにローカライズファイルをエクスポートしたりできます。
## AI を使ったペイウォールの翻訳 \{#translate-paywalls-with-ai\}
AI による翻訳は、ペイウォールをローカライズするための迅速かつ効率的な方法です。
**String** と **List** の両方の値を翻訳できます。デフォルトではすべての行が選択されています(紫色でハイライト表示)。すでに翻訳済みの行は緑色でマークされ、新しい翻訳にはデフォルトで含まれません。選択されていない行や未翻訳の行はグレーで表示されます。
1. 翻訳する行を選択します。ID・URL・変数が含まれる行はチェックを外しておくと、AI による誤訳を防げます。
2. 翻訳する言語を選択します。
3. **AI Translate** をクリックして翻訳を適用します。選択した行が翻訳されてペイウォールに追加され、翻訳済みの行は緑色でマークされます。
## 外部翻訳向けのローカライズファイルのエクスポート \{#exporting-localization-files-for-external-translation\}
AI によるローカライズが普及しつつある一方、プロの人間翻訳者や実績のある翻訳会社を使うといった、より確実な方法を好む場合もあるでしょう。そのような場合は、ローカライズファイルをエクスポートして翻訳者に共有し、翻訳結果を Adapty にインポートし直すことができます。
**Export** ボタンでエクスポートすると、各言語の `.json` ファイルが個別に作成され、1 つのアーカイブにまとめられます。1 つのファイルだけが必要な場合は、言語ごとのメニューから直接エクスポートできます。
翻訳済みのファイルを受け取ったら、**Import** ボタンを使って一括またはファイルごとにアップロードします。Adapty は自動的にファイルを検証して、正しい形式かどうかを確認します。
### インポートファイルの形式 \{#import-file-format\}
インポートを成功させるには、インポートファイルが以下の要件を満たす必要があります。
- **ファイル名と拡張子:**
ファイル名は表すロケールと一致し、拡張子は `.json` である必要があります。Adapty ダッシュボードでロケール名を確認してコピーできます。名前が認識されない場合、インポートは失敗します。
- **有効な JSON:**
ファイルは有効な JSON である必要があります。そうでない場合、インポートは失敗します。
## 手動ローカライズ \{#manual-localization\}
翻訳を微調整したり、特定のロケール向けに異なる画像を追加したり、リモートコンフィグを直接調整したりしたい場合もあるでしょう。
1. 翻訳したい要素を選んで新しい値を入力します。**String** と **List** の両方の値を更新したり、ロケールに適した画像に差し替えたりできます。
2. 英語ロケールのコンテキストメニューを活用して、ローカライズの問題を効率的に解決できます。
- **Copy this value to all locales**:選択した行について、英語ロケールの値で他のすべてのロケールの変更を上書きします。
- **Revert all row changes to original values**:現在のセッション中に行った変更をすべて破棄し、最後に保存した状態に戻します。
ペイウォールにロケールを追加したら、アプリのコードにロケールコードを正しく実装してください。
3. ⚠️ Stripeを選択する場合、インターフェースに **Sandbox** と表示されていても、**Test Mode** 環境のキーを使用してください。そうしないとWebペイウォールが動作しません。Stripeの **Sandboxes** はまだサポートされていません。
### Apple Payドメイン認証の設定 \{#set-up-apple-pay-domain-verification\}
**Settings > Domains** で、ドメイン認証に使用するメインの決済プロバイダーを選択します。次に、それぞれのプロバイダーでペイウォールのドメインを認証してください:
**Stripe**:
1. [Payment method domain settings](https://dashboard.stripe.com/settings/payment_method_domains) にアクセスし、**Add a new domain** をクリックします。
2. `app.funnelfox.com` と個人用のペイウォールサブドメイン(`paywalls-....fnlfx.com` のような形式)を追加します。サブドメインを確認するには、**Settings > Domains** に移動して **Hosted subdomain** の値をコピーしてください。
**Paddle**:
1. Paddleコンソールで **Checkout > Website approval** に移動し、**Add a new domain** をクリックします。
2. `app.funnelfox.com` と個人用のペイウォールサブドメイン(`paywalls-....fnlfx.com` のような形式)を追加します。サブドメインを確認するには、**Settings > Domains** に移動して **Hosted subdomain** の値をコピーしてください。
Paddleの承認プロセスは手動なので、ドメインが `Pending` から `Approved` に変わるまで待つ必要があります。
**FunnelFox Billing**:
[FunnelFox Billingの連携手順](https://funnelfox.com/docs/billing/integration-billing-funnelfox)に従ってください。
**SolidGate**:
1. SolidgateダッシュボードでDevelopers > Apple Pay Domains** に移動します。
2. **+ Add new domain** をクリックし、プロジェクトドメイン(FunnelFoxの **Settings > Domains** から確認)を貼り付けます。カスタムドメインがある場合はそちらも追加してください。
3. プレビューモードでApple Payを使用するには、`http://app.funnelfox.com/` も追加してください。
## Webペイウォールの作成と設定 \{#create-and-configure-a-web-paywall\}
1. Webペイウォールの一覧ページで **Create a paywall** をクリックします。
2. ペイウォール名を入力し、**Create** をクリックします。
3. 2つのサブスクリプションオプションとApple Pay購入ボタンを含む基本テンプレートに移動します。
最初の画面にはサブスクリプションプランの一覧が表示されます。2番目と3番目の画面はチェックアウト画面で、それぞれが提供するプランに対応しています。プランが1つだけの場合は、余分な画面を削除してください。プランが複数ある場合は、チェックアウト画面を複製する必要があります。
購入完了後にユーザーが最後に見る画面では、アプリに戻れることを明確に示す必要があります。
4. プラン一覧を設定します:プランと価格を追加または削除してください。画面に表示される価格やプランは動的に追加されないため、手動で設定する必要があります。
5. プランごとにチェックアウト画面を追加または設定します。ユーザーが購入ボタンをクリックする前に支払金額を確認できるよう、各チェックアウト画面に合計金額を表示することをお勧めします。
6. チェックアウト画面にはすでにApple Payボタンがあります。機能させるには、各画面で以下を設定してください:
1. **Product type**:トライアル期間または割引を追加するかどうかを選択します。
2. **Trial period**:トライアル期間の長さを入力します。
3. **Product**:決済プロバイダーからプロダクトを選択します。
:::important
プロダクトがAdaptyに追加されていることを確認してください。そうでない場合、購入結果はデフォルト値になります。
:::
4. **Subscription discount**:オプションで、決済プロバイダーからクーポンを選択します。
7. 次に、プランとチェックアウト画面を紐付ける必要があります。プラン選択画面で **Continue** ボタンをクリックし、各プランの遷移先画面を選択します。
ペイウォールの準備が完了したら、Adaptyでこのペイウォールを有効化するためのリンクを取得する必要があります。取得方法は、テスト中か本番環境での公開かによって異なります:
1. **サンドボックステスト用**:右上の **Preview** をクリックしてリンクをコピーします。
2. **本番環境用**:右上の **Publish** をクリックします。**Home** をクリックし、**URL** 列からリンクをコピーします。
以上です!このリンクを使用して[設定を続けてください](web-paywall#step-2-trigger-the-paywall)。
---
# File: fallback-paywalls
---
---
title: "フォールバックペイウォール"
description: "Adaptyでシームレスなユーザーエクスペリエンスを確保するためにフォールバックペイウォールを使用します。"
---
スムーズなユーザー体験を維持するために、[ペイウォール](paywalls)と[オンボーディング](onboardings)の**フォールバックバージョン**を設定することが重要です。
アプリがペイウォールを読み込む際、Adapty SDKはサーバーにペイウォールの設定データをリクエストします。しかし、ネットワークの問題やサーバー障害によりデバイスがAdaptyに接続できない場合はどうなるでしょうか?
* ユーザーが以前にペイウォールにアクセスしており、デバイスにデータがキャッシュされている場合、アプリは**キャッシュから**ペイウォールデータを読み込みます。
* デバイスにペイウォールがキャッシュされていない場合、アプリはローカルに保存された設定ファイルを探します。これにより、エラーなしにペイウォールを表示できます。
Adaptyはフォールバック設定ファイルを自動的に生成するので、ダウンロードしてすぐに使えます。各ファイルには、*すべての*プレースメントに対するプラットフォーム固有の設定が含まれています。
## はじめに \{#get-started\}
1. Adaptyから[フォールバック設定ファイルをダウンロード](/local-fallback-paywalls)します。
2. Adapty SDKを使用してフォールバックペイウォールを設定します:
* [iOS](ios-use-fallback-paywalls)
* [Android](android-use-fallback-paywalls)
* [React Native](react-native-use-fallback-paywalls)
* [Flutter](flutter-use-fallback-paywalls)
* [Unity](unity-use-fallback-paywalls)
* [Kotlin Multiplatform](kmp-use-fallback-paywalls)
* [Capacitor](capacitor-use-fallback-paywalls)
## 制限事項 \{#limitations\}
フォールバックペイウォールはハードコードされてローカルに保存されるため、通常のAdaptyペイウォールのような動的な機能はありません。
* フォールバックペイウォールは[国際化](paywall-localization)をサポートしていません。Adaptyが設定ファイルを生成する際、デフォルトの`en`ロケールが使用されます。
* 各プレースメントに設定できるフォールバックペイウォールは1つだけです。設定に異なる[オーディエンス](audience)向けの複数のペイウォール設定が含まれている場合、Adaptyは「すべてのユーザー」向けの設定を使用します。
* フォールバックペイウォールは[A/B テスト](ab-tests)をサポートしていません。ペイウォールがA/B テストに参加している場合、フォールバック設定ファイルには最も重みの高いバリアントが含まれます。
* フォールバックペイウォールは[リモートで管理](customize-paywall-with-remote-config)できません。設定ファイルを更新する場合は、App Store / Google Playでアプリの新しいバージョンをリリースする必要があります。
---
# File: local-fallback-paywalls
---
---
title: "フォールバックペイウォールをダウンロードする"
description: "Adapty のローカルフォールバックペイウォールを使用して、シームレスなサブスクリプションフローを確保しましょう。"
---
Adapty はプラットフォームごとに[フォールバックペイウォール](/fallback-paywalls)用の JSON 設定ファイルを自動生成します。これらのファイルにはオンボーディングのフォールバックデータも含まれています。
1 つのプレースメントに複数のペイウォールまたはオンボーディングがある場合、フォールバックバージョンには最も高いウェイトまたは最も広いオーディエンスを持つバリアントが含まれます。Adapty はペイウォールやオンボーディングを変更するたびにこれらのファイルを更新します。
フォールバック設定をダウンロードするには、以下の手順に従ってください。
1. **[Placements](https://app.adapty.io/placements)** ページを開きます。
2. **Fallbacks** ボタンをクリックします。
3. ドロップダウンからターゲットプラットフォーム(*iOS* または *Android*)を選択します。
4. SDK バージョンを選択してダウンロードを開始します。
## ダウンロード後の手順 \{#after-the-download\}
各プラットフォームのセットアップガイドに従ってください。
* [iOS](ios-use-fallback-paywalls)
* [Android](android-use-fallback-paywalls)
* [React Native](react-native-use-fallback-paywalls)
* [Flutter](flutter-use-fallback-paywalls)
* [Unity](unity-use-fallback-paywalls)
* [Kotlin Multiplatform](kmp-use-fallback-paywalls)
* [Capacitor](capacitor-use-fallback-paywalls)
---
# File: paywall-metrics
---
---
title: "ペイウォール指標"
description: "ペイウォールのパフォーマンス指標を追跡・分析して、サブスクリプション収益を改善しましょう。"
---
Adapty はペイウォールのパフォーマンスをより正確に計測するための一連の指標を収集しています。ビューを除くすべての指標はリアルタイムで更新され、ビューは数分おきに更新されます。ビューを除くすべての指標は、ペイウォール内のプロダクトに紐付けられます。このドキュメントでは、利用可能な指標の定義と計算方法を説明します。
ペイウォール指標はペイウォール一覧ページで確認でき、すべてのペイウォールのパフォーマンスを一覧で把握できます。この統合ビューでは各ペイウォールの指標が集計表示され、効果の評価や改善点の特定に役立ちます。
各ペイウォールの詳細な分析には、ペイウォール詳細指標ページに移動します。ここでは選択したペイウォールに特化した詳細な指標を確認でき、パフォーマンスへの深い洞察が得られます。
### インストール日でフィルタリング \{#filter-metrics-by-install-date\}
ペイウォール、トライアル、購入の指標は、2つの異なる日付でグループ化できます:
- **イベント日** — ペイウォールが表示された日、トライアルが開始された日、または購入が行われた日。
- **インストール日** — ユーザーが初めてアプリを開いた日。
同じ日付範囲でも、この2つのビューは大きく異なる数値を示すことがあります。**Filter metrics by install date** チェックボックスで、ダッシュボードがどちらを使用するかを制御します:
- **チェックなし(デフォルト)**:指標はイベント日でグループ化されます。
- **チェックあり**:指標はインストール日でグループ化されます。
**例。** 日付範囲を4月1日〜30日に設定し、トライアルを確認します。
- **チェックなし**:それらのユーザーがいつインストールしたかに関わらず、4月に*開始*されたトライアルを表示します。
- **チェックあり**:トライアルがいつ開始されたかに関わらず、4月に*インストール*したユーザーのトライアルを表示します。
特定のコホートのユーザー獲得パフォーマンスを測定するにはインストール日ビューを使用し、特定の期間のペイウォールやオンボーディングのアクティビティを測定するにはイベント日ビューを使用してください。
### 指標コントロール \{#metrics-controls\}
システムは選択した期間に基づいて指標を表示し、左側の列パラメータに3段階のインデントで整理します。
ライブのペイウォールの指標は、ペイウォールの開始日から現在までの期間を対象とします。非アクティブなペイウォールの指標は、開始日から選択した期間の終了日までの全期間を対象とします。下書きおよびアーカイブ済みのペイウォールも指標テーブルに含まれますが、データがない場合は指標なしで一覧表示されます。
#### 指標データの表示オプション \{#view-options-for-metrics-data\}
ペイウォールページでは、プレースメントベースとオーディエンスベースの2つの表示オプションを利用できます。
プレースメントベースのビューでは、指標がペイウォールに関連付けられたプレースメント別にグループ化されます。これにより、プレースメントごとに指標を分析できます。
オーディエンスベースのビューでは、指標がペイウォールのターゲットオーディエンス別にグループ化されます。異なるオーディエンスセグメントごとの指標を評価できます。ペイウォール詳細ページ上部のドロップダウンから表示方法を選択できます。
#### 期間の選択 \{#time-ranges\}
日、週、月、カスタム期間など、さまざまな時間範囲を選択して指標データを分析できます。
#### 利用可能なフィルターとグループ化 \{#available-filters-and-grouping\}
:::link
関連記事: [アナリティクスコントロール](controls-filters-grouping-compare-proceeds)
:::
Adapty はニーズに合わせた指標分析のフィルタリングとカスタマイズのための強力なツールを提供しています。Adapty の指標ページでは、さまざまな期間、グループ化オプション、フィルタリング機能を利用できます。
- フィルター対象: オーディエンス、国、ペイウォール、ペイウォールの状態、ペイウォールグループ、プレースメント、国、ストア、プロダクト、プロダクトストア
- グループ化: プロダクトとストア
#### 単一指標チャート \{#single-metrics-chart\}
ペイウォール指標ページの主要なコンポーネントの一つがチャートセクションで、選択した指標を視覚的に表示して分析を容易にします。
ペイウォール指標ページのチャートセクションには横棒グラフが含まれており、選択した指標の値を視覚的に表示します。チャートの各バーは指標の値に対応しており、サイズが比例しているため、一目でデータを把握できます。横の線は分析している期間を示し、縦の列は指標の数値を表示します。すべての指標値の合計はチャートの横に表示されます。
また、チャートセクション右上の矢印アイコンをクリックするとビューが展開され、選択した指標がチャートの全幅で表示されます。
#### 指標合計サマリー \{#total-metrics-summary\}
単一指標チャートの横には指標合計サマリーセクションが表示されます。特定の時点における選択した指標の累積値が表示され、ドロップダウンメニューから表示する指標を切り替えられます。
### 指標の定義 \{#metrics-definitions\}
:::note
Adapty は [currencylayer.com](https://currencylayer.com/) の為替レート(8時間ごとに更新)を使用して他の通貨を USD に変換します。レートは**取引時点で固定**されるため、その後の変動は変換結果に影響しません。
:::
#### 収益 \{#revenue\}
この指標は、購入および更新によって USD で生成された総収入を表します。収益の計算には App Store / Google Play のコミッションは含まれておらず、各種手数料を差し引く前の金額で計算されることにご注意ください。
#### 受取額 \{#proceeds\}
この指標は、App Store / Google Play の適用コミッションを差し引いた後に、アプリオーナーが購入および更新から USD で実際に受け取る金額を表します。
:::important
アプリが手数料減額プログラムに登録している場合は、Adaptyにお知らせください。正確な計算のために、[アプリ設定](general)で[Small Business Program](app-store-small-business-program)および[Reduced Service Fee program](google-reduced-service-fee)の状態を指定してください。
:::
この指標はアプリの収益に直接貢献するネット収益を反映します。Proceedsの計算方法については、Adaptyの[ドキュメント](analytics-cohorts#revenue-vs-proceeds)を参照してください。
#### ARPPU \{#arppu\}
ARPPUは課金ユーザー1人あたりの平均収益です。総収益を課金ユーザー数で割って計算します。例: $15,000の収益 ÷ 1,000人の課金ユーザー = $15のARPPU。
#### ARPAS \{#arpas\}
ARPASはアクティブサブスクライバー1人あたりの平均収益で、トライアルまたはサブスクリプションを開始したサブスクライバー数で総収益を割って計算します。例えば、総収益が$5,000でサブスクライバーが1,000人の場合、ARPASは$5になります。この指標はサブスクライバー1人あたりの平均収益化ポテンシャルを評価するのに役立ちます。
#### 購入へのユニークコンバージョン率(CR) \{#unique-conversion-rate-cr-to-purchases\}
購入へのユニークコンバージョン率は、購入数をユニークビュー数で割って計算します。例えば、購入が10件でユニークビューが100件の場合、購入へのユニークコンバージョン率は10%になります。この指標はユニーク訪問者を有料顧客に転換する効果を把握するための比率です。
#### 購入へのCR \{#cr-to-purchases\}
購入へのコンバージョン率は、購入数を総ビュー数で割って計算します。例えば、購入が10件でビューが100件の場合、購入へのコンバージョン率は10%になります。この指標はビューが購入に結びつく割合を示し、ペイウォールのユーザー転換効果を把握するのに役立ちます。
#### トライアルへのユニークCR \{#unique-cr-to-trials\}
トライアルへのユニークコンバージョン率は、開始されたトライアル数をユニークビュー数で割って計算します。例えば、トライアルが30件開始されてユニークビューが100件の場合、トライアルへのユニークコンバージョン率は30%になります。この指標はユニーク訪問者をトライアルユーザーに転換するペイウォールの効果を測定します。
#### 購入数(Purchases) \{#purchases\}
購入数はペイウォールで行われたさまざまなトランザクションの累計合計です。この指標には以下のトランザクションが含まれます(更新は含まれません):
- ペイウォールで直接行われた新規購入
- ペイウォールで最初に開始されたトライアルのトライアル転換
- ペイウォールで行われたサブスクリプションのダウングレード、アップグレード、クロスグレード
- ペイウォールでのサブスクリプション復元(自動更新なしで有効期限切れ後に再開された場合など)
これらのさまざまなトランザクションを考慮することで、購入数指標はペイウォール全体の獲得・収益化アクティビティを包括的に把握できます。
#### トライアル数(Trials) \{#trials\}
トライアル数は開始されたトライアルの総数を表します。ペイウォールを通じてトライアル期間を開始したユーザー数を反映します。この指標はトライアル提供の効果を追跡し、ユーザーエンゲージメントや有料サブスクリプションへの転換に関する洞察を提供します。
#### キャンセルされたトライアル数(Trials canceled) \{#trials-canceled\}
キャンセルされたトライアル数は、自動更新機能がオフにされたトライアルの数を表します。これはユーザーが手動でトライアルを解約した場合に発生し、トライアル期間終了後にサブスクリプションを継続しないという意思決定を示します。キャンセルされたトライアルを追跡することで、ユーザー行動に関する貴重な情報が得られ、トライアルからの離脱率を把握できます。
#### 返金数(Refunds) \{#refunds\}
返金数は返金された購入およびサブスクリプションの件数を表します。これには、顧客からのリクエスト、支払いの問題、その他の返金ポリシーに基づいて取り消しまたは返金されたトランザクションが含まれます。
#### 返金率(Refund rate) \{#refund-rate\}
返金率は、返金数を初回購入数(更新は含まれません)で割って計算します。例えば、返金が5件で初回購入が1,000件の場合、返金率は0.5%になります。
#### ビュー数(Views) \{#views\}
ビュー数はユーザーがペイウォールを閲覧した総回数を表します。ユーザーがペイウォールを訪れるたびに1ビューとしてカウントされます。例えば、ユーザーがペイウォールを2回訪れた場合、2ビューとして記録されます。ビュー数を追跡することで、ペイウォールへのエンゲージメントとユーザーインタラクションのレベルを把握し、ユーザー行動やペイウォールの配置・デザインの効果についての洞察が得られます。
#### ユニークビュー数(Unique views) \{#unique-views\}
ユニークビュー数は、ユーザーがペイウォールを閲覧したユニークな回数を表します。総ビュー数が各訪問を別々にカウントするのとは異なり、ユニークビュー数は各ユーザーのペイウォールへのアクセス回数に関わらず1回としてカウントします。例えば、ユーザーがペイウォールを2回訪れた場合、1ユニークビューとして記録されます。ユニークビュー数を追跡することで、訪問総数ではなく個々のユーザーに着目したユーザーエンゲージメントとペイウォールのリーチのより正確な計測が可能になります。
:::warning
`.logShowFlow()` (iOS SDK v4+) / `.logShowPaywall()` メソッドを使用して、ペイウォールのビューをAdaptyに必ず送信してください。送信しない場合、ペイウォールのビューが指標に反映されず、コンバージョン率が正確に計算されません。
:::
---
# File: migrate-paywalls
---
---
title: "アプリ間でペイウォールを移行する"
description: "AdaptyでペイウォールをAdapter他のアプリから移行する方法を学びます。"
---
Adaptyを使えば、アプリごとにペイウォールを一から作り直す必要はありません。複数のアプリを管理している場合、ペイウォールビルダーで作成したペイウォールのビルダー設定を、別のアプリにそのまま移行できます。
移行でコピーされる視覚的な設定は次のとおりです:
- ペイウォールおよびすべてのペイウォール要素のレイアウト設定
- メディア
- ローカライズ
移行はビルダー設定のみが対象で、プロダクトやリモートコンフィグはコピーされません。
:::note
カスタムフォントを使用したペイウォールビルダー設定を移行する場合は、表示が崩れる可能性があるため、実機でテストしてください。
:::
## ペイウォールの移行 \{#migrate-paywall\}
:::important
移行できるのは、**新しい** Adapty ペイウォールビルダーで作成されたペイウォールのみです。**レガシー**ペイウォールビルダーのペイウォールを移行するには、先に新しいペイウォールビルダーへ移行する必要があります。
:::
ペイウォールビルダーの設定を移行するには:
1. **新しいペイウォールの場合**:[ペイウォールの作成](create-paywall)を開始し、プロダクトを追加します。次に、**Build no-code paywall** をクリックしてテンプレートライブラリを開きます。
**既存のペイウォールの場合**:**Builder & Generator** タブの **Layout settings** セクションに移動し、**Change template** をクリックします。
2. ペイウォールテンプレートを編集中に、**Copy a design from your apps** ボックス内の **Choose paywall** をクリックします。
3. 設定のコピー元となるアプリとペイウォールを選択します。
4. **Copy Selected Paywall** をクリックします。
移行後は必要に応じて編集でき、元のペイウォールには影響しません。
---
# File: duplicate-paywalls
---
---
title: "ペイウォールを複製する"
description: "Adaptyでのペイウォールの複製と管理方法について学びましょう。"
---
既存のペイウォールに少し変更を加えたい場合、特にすでにモバイルアプリで使用中でアナリティクスへの影響を避けたい場合は、単純に複製するだけで大丈夫です。作成した複製は、必要に応じて一部またはすべてのプレースメントで元のペイウォールと置き換えて使用できます。
複製を作成すると、ペイウォールの名前・プロダクト・プロモーションなど、すべての設定がコピーされます。新しいペイウォールには元の名前に「Copy」が付加されるため、元のペイウォールと区別しやすくなります。
Adapty ダッシュボードでペイウォールを複製する手順は次のとおりです。
1. Adaptyのメインメニューから [**Paywalls**](https://app.adapty.io/paywalls) セクションを開きます。Adapty ダッシュボードのペイウォール一覧ページには、アカウント内のすべてのペイウォールが表示されます。
2. 複製したいペイウォールの隣にある **3-dot** ボタンをクリックし、**Duplicate** を選択します。
3. 新しいペイウォールを編集し、**Save** ボタンをクリックします。
4. 元のペイウォールがいずれかのプレースメントで使用中の場合、Adaptyは元のペイウォールを複製に置き換えるかどうかを確認するプロンプトを表示します。**Create and replace original** を選択すると、新しいペイウォールはすぐに **Live** 状態になります。または、**Draft** 状態の新しいペイウォールとして作成し、後でプレースメントに追加することもできます。
---
# File: archive-paywalls
---
---
title: "ペイウォールのアーカイブ"
description: "データを失わずにAdaptyで古いペイウォールをアーカイブする方法を説明します。"
---
Adaptyを使い込んでペイウォールの設定を細かく調整していくうちに、現在の戦略やキャンペーンに合わなくなったペイウォールが増えていくことがあります。こうした未使用のペイウォールが `Inactive` のまま残っていると、ワークスペースが散らかり、必要なものを見つけにくくなります。この問題を解決するために、Adaptyでは不要なペイウォールをアーカイブする機能を提供しています。
アーカイブすることで、ペイウォールを完全に削除せず安全に保存でき、必要になったときにいつでも参照できます。また、アーカイブしたペイウォールはデフォルトの表示から除外できるため、ワークスペースがすっきりし、インターフェースも見やすくなります。このガイドでは、Adaptyでペイウォールを効率的にアーカイブする方法を説明し、ペイウォール管理をより細かくコントロールできるようにします。
ご注意:少なくとも1つのプレースメントで現在アクティブなライブのペイウォールはアーカイブできません。そのようなペイウォールをアーカイブしたい場合は、事前にすべてのプレースメントから削除してください。
:::note
非アーカイブのA/B テストで使用中のペイウォールはアーカイブできません。これにより、完了したA/B テストの詳細な指標を確認でき、紐付けられたペイウォールもそのデータの一部として保持されます。
:::
**ペイウォールをアーカイブするには:**
1. Adaptyのメインメニューで [**Paywalls**](https://app.adapty.io/paywalls) セクションを開きます。
2. アーカイブしたいペイウォールの横にある **3-dot** ボタンをクリックし、**Archive** オプションを選択します。
3. **Archive paywall** ウィンドウが表示されたら、アーカイブしたいペイウォールの名前を入力し、**Archive** ボタンをクリックします。
---
# File: restore-paywall
---
---
title: "ペイウォールをアーカイブから戻す"
description: "Adapty でペイウォールを復元して、ユーザーへのサブスクリプションサービスを途切れなく提供しましょう。"
---
ペイウォールをアーカイブできる機能は、ペイウォール管理プロセスを効率化するうえで非常に役立ちます。不要になったペイウォールを非表示にしてワークスペースをすっきりさせたり、必要になった際にアーカイブ済みのペイウォールを復元して再活用したりと、柔軟な運用が可能です。
アーカイブ済みのペイウォールはデフォルトビューではフィルタリングされて表示されない場合があります。表示するには、**State** フィルターで **Archived** を選択してください。
**ペイウォールをアーカイブから元に戻すには**
1. Adapty メインメニューの [**Paywalls**](https://app.adapty.io/paywalls) セクションを開きます。
2. アーカイブ済みのペイウォールがリストに表示されていることを確認します。表示されていない場合は、右側のフィルターを更新してください。
3. アーカイブ済みペイウォールの横にある **3点ドット** ボタンをクリックし、**Back to active** を選択します。
---
# File: profiles-crm
---
---
title: "プロファイル/CRM"
description: "Adaptyでユーザープロファイルとデータを管理し、オーディエンスのセグメンテーションを強化します。"
---
プロファイルはユーザー向けのCRMです。プロファイルを使うと、次のことができます:
1. プロファイル ID、カスタマーユーザー ID、メールアドレス、またはトランザクション ID で特定のユーザーを検索する。
2. 請求の問題、グレース期間、その他の[イベント](events)を含む、ユーザーのイベントタイムラインを確認する。
3. サブスクリプションの状態、総収益・手取り額など、ユーザーのプロパティを分析する。
4. ユーザーにサブスクリプションを付与する。
:::note
イベントフィードのイベントはダッシュボードに届くまでに遅延が発生します。新しいプロファイルや属性の変更はすぐに反映されない場合があります。
:::
:::link
Adapty がどのようにユーザープロファイルを作成・紐付けするかについては、[プロファイルの仕組み](how-profiles-work)をご覧ください。
:::
## ユーザーの検索 \{#finding-users\}
プロファイル一覧では、次の方法で特定のユーザーを検索できます。
- **Profile ID**: Adapty がユーザーに付与する内部識別子(Adapty ID とも呼ばれます)。
- **Customer user ID**: アプリ側で設定したユーザーの識別子(設定している場合)。
- **Email**: カスタム属性として送信したユーザーのメールアドレス(送信している場合)。
- **Transaction ID**: 購入時のストアトランザクション ID。
任意の行をクリックすると、そのユーザーの詳細プロファイルが開きます。
## サブスクリプション状態 \{#subscription-state\}
プロファイル一覧では、サブスクリプション状態でユーザーをフィルタリングおよび並べ替えることができます。状態の値は以下のとおりです:
| ユーザーの**状態** | 説明 |
| :--------------------- | :----------------------------------------------------------- |
| Subscribed | ユーザーは自動更新が有効なアクティブなサブスクリプションを持っています。 |
| Auto-renew off | ユーザーは自動更新をオフにしましたが、サブスクリプション期間の終了までプレミアム機能にアクセスできます。 |
| Subscription cancelled | ユーザーはサブスクリプションをキャンセルし、完全に終了しました。 |
| Billing issue | サブスクリプションまたはトライアル終了後に請求の問題が発生し、ユーザーに課金できませんでした。 |
| Grace period | サブスクリプションまたはトライアル終了後の課金試行時に請求の問題が発生したため、ユーザーは現在グレース期間中です。 |
| Active trial | ユーザーはトライアル期間中のアクティブなサブスクリプションを持っています。 |
| Trial cancelled | ユーザーはトライアルをキャンセルし、アクティブなサブスクリプションはありません。 |
| Never subscribed | ユーザーはサブスクリプションを開始したことがなく、トライアルも利用したことがない無料ユーザーです。 |
## ユーザー属性 \{#user-attributes\}
SDKを使って、追加のユーザープロパティをAdaptyに送信できます。
デフォルトでは、Adaptyが設定する項目:
| プロパティ | 説明 |
| ---------------- | ------------------------------------------------------------ |
| Customer user ID | あなたのシステム上のエンドユーザーの識別子。 |
| Adapty ID | エンドユーザーの Adapty 内部識別子。プロファイル ID とも呼ばれます。 |
| IDFA | Apple がユーザーのデバイスに割り当てる広告識別子。iOS 14 以降では App Tracking Transparency (ATT) の許可が必要です。Android では利用できません。 |
| Country | エンドユーザーの国。 |
| OS | エンドユーザーが使用しているオペレーティングシステム。 |
| Device | エンドユーザーに表示されるデバイスのモデル名。 |
| Install date | ユーザーが Adapty に初めて記録された日付:
## サブスクリプションの付与 \{#granting-a-subscription\}
プロファイルでは、実際に購入しなくても、有効なサブスクリプションを延長したり、アクセスレベルへの永続アクセスをユーザーに付与したりすることができます。
主な用途は以下のとおりです:
- 請求やサポートに関する問題が発生したユーザーへの補償。
- 手動プロモーションやベータプログラムの実施。
- 実際に購入せずにサブスクリプションのフローをテストする。
アクセスを付与するには、ユーザーのプロファイルを開き、**Access levels** セクションに移動して **Edit** をクリックします。有効期限を設定して保存してください。有効期限は未来の日時である必要があり、一度設定したら短縮することはできません。有効なサブスクリプションに対して調整しても、継続中の支払いには影響しません。
:::note
アクセスの付与は、App Store や Google Play の購入イベントを作成しません。ユーザーのイベントフィードやアナリティクスは、実際の購入フローとは異なります。
:::
プログラムからアクセスを付与する場合は、[Grant access level](api-adapty/operations/grantAccessLevel) API メソッドを使用してください。
## ユーザーアカウント間での有料アクセスの共有 \{#sharing-paid-access-between-user-accounts\}
:::link
メイン記事: [ユーザーアカウント間での有料アクセスの共有](sharing-paid-access-between-user-accounts)
:::
### アクセス共有の履歴 \{#access-sharing-history\}
アクセスレベルが共有または転送されると、ユーザーのプロファイルに接続されたプロファイルへのリンクが表示されます。このリンクは、アクセスを共有したプロファイル、またはアクセスを受け取ったプロファイルを示しています。接続されたプロファイルを表示するには、ユーザーの **Profile** でアクセスレベルの横にあるリンクをクリックしてください。
:::note
バーチャル通貨の残高は、アクセスレベルのようにプロファイル間で共有・転送されません。各残高は単一のプロファイルに紐づきます — 詳細は[残高、プロファイル、デバイス](virtual-currency-balance#balances-profiles-and-devices)をご覧ください。
:::
## 次のステップ \{#next-steps\}
- Adapty がプロファイルを作成・リンクする仕組みについては、[プロファイルの仕組み](how-profiles-work)を参照してください。
- アクセス共有ポリシーの設定については、[ユーザーアカウント間での有料アクセスの共有](sharing-paid-access-between-user-accounts)を参照してください。
- プログラムからアクセスを付与するには、[アクセスレベルの付与](api-adapty/operations/grantAccessLevel) API メソッドを参照してください。
---
# File: how-profiles-work
---
---
title: "プロファイルの仕組み"
description: "Adaptyがユーザープロファイルをどのように作成・追跡・紐付けするかを理解しましょう — 匿名プロファイル、識別済みユーザー、親/継承プロファイルの関係を含みます。"
---
アプリのすべてのユーザーには、購入履歴・イベント・サブスクリプションの状態を追跡するAdaptyプロファイルが割り当てられます。プロファイルがどのように作成・紐付けされるかを理解することで、インテグレーションのバグを防ぎ、データの断片化を避け、[プロファイル](profiles-crm)セクションのデータを正しく解釈できます。
## プロファイルの作成 \{#profile-creation\}
Adaptyはユーザーがアプリを初めて起動したタイミングで、自動的にプロファイルを作成します。
**Customer User IDがない場合**、プロファイルは匿名になります。以下のタイミングで毎回新しい匿名プロファイルが作成されます:
- ユーザーがアプリを再インストールしたとき
- ユーザーがアプリからログアウトしたとき(アプリが`Adapty.logout()`を呼び出したとき)
購入はアプリのインストールに紐付けられ、永続的なユーザー識別情報には紐付けられません。
**Customer User IDがある場合**、プロファイルは再インストールやデバイスをまたいで維持されます。Customer User IDを使うことで、次のことが可能になります:
1. 再インストールや複数デバイスにまたがってユーザーを追跡できます。
2. [**Profiles**](profiles-crm)セクションでCustomer User IDからユーザーを検索できます。
3. [サーバーサイドAPI](getting-started-with-server-side-api)でCustomer User IDを使用できます。
4. AdaptyはCustomer User IDをすべてのインテグレーションに送信します。
Customer User IDを使用する場合のプロファイルの動作は、いつ設定するかによって異なります:
- **SDKの初期化時**:そのCustomer User IDを持つ既存のプロファイルを使用します(再訪ユーザーの場合)、または新しいプロファイルを作成します(初回ユーザーの場合)。
- **SDK初期化後**:初期化時に匿名プロファイルが作成されます。その後ユーザーを識別すると、AdaptyはCustomer User IDを匿名プロファイルに紐付けます(初回ユーザーの場合)、または既存のプロファイルに切り替えます(再訪ユーザーの場合)。
**どちらのアプローチを使うか:**
- **アプリ起動時にCustomer User IDが利用可能な場合**(例:前回のセッションから保存されている)— SDKの初期化時に`activate()`へ渡します。
- **ユーザーがアプリ起動後にサインインする場合**— 認証後に`identify()`を呼び出します。AdaptyはそのIDを現在のプロファイルに紐付けます(IDが新規の場合)、または既存のプロファイルに切り替えます(IDが既に存在する場合)。
- **ログイン前に購入できる場合**— ログイン後に`identify()`を呼び出します。Customer User IDがAdaptyに既に存在する場合は、その後プロファイルを取得して現在のアクセスレベルを同期してください。
実装の詳細については、[ユーザーの識別](identifying-users)SDKガイドを参照してください。
:::note
以前にCustomer User IDなしでアプリを使用したことがある再訪ユーザーの場合、SDK初期化時に識別を開始しても、それらの匿名プロファイルは自動的にマージされません。そのようなユーザーの完全な履歴を維持するには、ログイン後に`identify()`を使用してください。
:::
## 親プロファイルと継承プロファイル \{#parent-and-inheritor-profiles\}
同じストア側のサブスクリプションが複数のAdaptyプロファイルに関連付けられている場合、Adaptyはそれらのプロファイルをチェーンとして扱います:1つの**親**プロファイルと、同じ購入からアクセスを共有する1つ以上の**継承**プロファイルです。
これは以下の場合に発生します:
- [ユーザーアカウント間での有料アクセスの共有](sharing-paid-access-between-user-accounts)が有効で、別のプロファイルが購入したデバイスにユーザーがサインインしたとき。
- ユーザーが`customer_user_id`なしでアプリを再インストールし、新しいプロファイルが前のインストールの購入を引き継いだとき。
- 異なる識別済みユーザーが同じデバイスで購入を復元したとき。
- アプリがApple Team IDを変更し、新しいアプリが旧Team IDで行われた購入を引き継いだとき。
**親の決定方法。**
親は**最初に購入を記録したプロファイル**です — プロファイルの作成順ではなく、Adaptyでの購入レシートの順序によって決定されます。例:アプリをインストールして購入せず、再インストールしてサブスクリプションを購入した場合、2番目のプロファイルが親になります(購入を行ったため)。最初のプロファイルは継承プロファイルとなり、共有によってアクセスを得ます。
**イベントの分配方法:**
- **トランザクションイベント**(購入、更新、キャンセル、請求の問題、グレース期間、返金):購入を行った**親プロファイル**にのみ表示されます。サブスクリプションの更新・変更はすべてこのプロファイルに表示され続けます。
- **`access_level_updated`イベント**:アクセスレベルの状態が変化するたびに、**親プロファイルと継承プロファイルの両方**に表示されます。これにより、紐付けられたすべてのプロファイルが現在のアクセス状態を把握できます。
親プロファイルには完全なトランザクション履歴が表示されます。継承プロファイルには、アクセスレベルの更新のみが表示され、**Access level**セクションに親プロファイルへのリンクが表示されます。
**複数のプロファイルにまたがる同一サブスクリプションの追跡。**
各継承プロファイルは独自の`profile_id`を持つため、`profile_id`はチェーン全体で一定ではありません。複数のプロファイルにまたがって同じサブスクリプションを特定するには(例:Webhookイベントの照合や、ダッシュボードのプロファイルと1人のユーザーの対応付け)、ストア側の識別子を使用してください。
| フィールド | 用途 |
| --- | --- |
| `store_original_transaction_id` | プロファイルをまたいだサブスクリプションチェーンの識別。Appleのサブスクリプションごとに一意。 |
| `profiles_sharing_access_level`(Webhookフィールド) | 共有が有効な場合に、そのサブスクリプションによって権限を付与されているすべてのプロファイル。 |
| `profile_id` | クロスプロファイル追跡には**不適切** — 各継承プロファイルが独自のIDを持つため。 |
## プロファイルなしのトランザクション \{#transactions-without-profiles\}
Adaptyの一部のトランザクションはプロファイルに紐付けられていません — アナリティクスとエクスポートには表示されますが、プロファイルリストには表示されません。これは、Adapty SDKを通じてアプリに接続したことがないユーザーへの**サーバー間(S2S)ストア通知**が届いた場合に発生します。既知の発生源は以下の通りです:
- App Store S2S通知(返金イベントを含む)
- Google Play S2S通知
- StripeおよびPaddleのWebhookイベント
これらのトランザクションは:
- **アナリティクスチャートに表示されます**(全体の指標にカウントされます)
- **エクスポートに表示されます**(S3、GCS、BigQuery)— `profile_id`は`null`に設定されます
- **プロファイルリストには表示されません** — 紐付けるプロファイルが存在しないため
アナリティクスやエクスポートで、プロファイルUIで見つけられるより多くのイベントが表示される場合、その差はおそらくこれらのプロファイルなしトランザクションによるものです。エクスポートで見つけるには、`profile_id IS NULL`の行でフィルタリングしてください。
## ユーザーアカウント間での有料アクセスの共有 \{#sharing-paid-access-between-user-accounts\}
:::link
メイン記事: [ユーザーアカウント間での有料アクセスの共有](sharing-paid-access-between-user-accounts)
:::
アクセスレベルの共有ポリシーを設定するには、[**General**](general)設定ページで共有オプションを選択します。[サンドボックス環境](test-purchases-in-sandbox)に対して別のポリシーを設定することもできます。
**有効(デフォルト)**
識別済みユーザー([Customer User ID](identifying-users#set-customer-user-id-on-configuration)が設定されているユーザー)は、同じApple/Google IDでサインインしているデバイスであれば、Adaptyが提供する同じ[アクセスレベル](access-level)を共有できます。これは、ユーザーがアプリを再インストールして別のメールアドレスでログインした場合でも、以前の購入へのアクセスを維持できるため便利です。このオプションでは、複数の識別済みユーザーが同じアクセスレベルを共有できます。
アクセスレベルは共有されますが、過去および将来のすべてのトランザクションは、一貫したアナリティクスを維持し完全なトランザクション履歴(トライアル期間、サブスクリプション購入、更新など)を同じプロファイルに紐付けるため、元のCustomer User IDのイベントとして記録されます。
**新しいユーザーへアクセスを移譲**
識別済みユーザーは、デバイスが同じApple/Google IDでサインインしている限り、別の[Customer User ID](identifying-users#set-customer-user-id-on-configuration)でログインしたりアプリを再インストールしたりしても、Adaptyが提供する[アクセスレベル](access-level)を引き続き利用できます。
前のオプションとは異なり、Adaptyは識別済みユーザー間で購入を移譲します。これにより購入済みコンテンツへのアクセスが保証されますが、一度にアクセスできるのは1人のユーザーのみです。たとえば、UserAがサブスクリプションを購入し、同じデバイスでUserBがログインしてトランザクションをリストアした場合、UserBがサブスクリプションへのアクセスを取得し、UserAからはアクセスが取り消されます。
いずれかのユーザー(新しいユーザーまたは古いユーザー)が識別されていない場合でも、Adapty内でそれらのプロファイル間でアクセスレベルは共有されます。
アクセスレベルは移譲されますが、過去および将来のすべてのトランザクションは、一貫したアナリティクスを維持し完全なトランザクション履歴(トライアル期間、サブスクリプション購入、更新など)を同じプロファイルに紐付けるため、元のCustomer User IDのイベントとして記録されます。
**新しいユーザーへアクセスを移譲**に切り替えた後、アクセスレベルはすぐにはプロファイル間で移譲されません。特定のアクセスレベルの移譲プロセスは、サブスクリプションの更新、リストア、またはトランザクションの検証など、ストアからのイベントをAdaptyが受信したときにのみトリガーされます。
**無効**
最初にアクセスレベルを取得した識別済みユーザープロファイルが、それを永続的に保持します。これは、ビジネスロジック上、購入を単一のCustomer User IDに紐付ける必要がある場合に最適なオプションです。
なお、匿名ユーザー間ではアクセスレベルは引き続き共有されます。
[オーナーのユーザープロファイルを削除する](https://adapty.io/docs/ja/api-adapty/operations/deleteProfile)ことで、購入の紐付けを解除できます。削除後、アクセスレベルは最初にそれを要求したユーザープロファイル(匿名または識別済みを問わず)に付与されます。
共有の無効化は新しいユーザーにのみ影響します。すでにユーザー間で共有されているサブスクリプションは、このオプションを無効にした後も共有され続けます。
:::warning
AppleとGoogleは、購入をApple/Google IDに紐付けているため、ユーザー間でアプリ内課金を共有または移譲することを求めています。共有がなければ、その後の再インストール時に購入のリストアが機能しない可能性があります。
共有を無効にすると、ログイン後にユーザーがアクセスを取り戻せなくなる場合があります。
共有の無効化は、ユーザーが購入前に**ログインを必須とする**場合にのみ推奨します。そうでない場合、識別済みユーザーがサブスクリプションを購入した後に別のアカウントにログインすると、アクセスを永続的に失う可能性があります。
:::
### どの設定を選べばよいですか? \{#which-setting-should-i-choose\}
| アプリの条件 | 選択するオプション |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| ログインシステムがなく、AdaptyのみMatch anonymous profile IDを使用している。 | デフォルトオプションを使用してください。3つのオプションすべてで、匿名プロファイルID間ではアクセスレベルが常に共有されます。 |
| オプションのログインシステムがあり、アカウント作成前に購入できる。 | **新しいユーザーへアクセスを移譲**を選択してください。アカウントなしで購入したユーザーが後でトランザクションをリストアできるようになります。 |
| 購入前にアカウント作成を必須とするが、購入を複数のCustomer User IDに紐付けることを許可している。 | **新しいユーザーへアクセスを移譲**を選択してください。一度にアクセスできるCustomer User IDは1つに限られますが、別のCustomer User IDでログインしても有料アクセスを失わずに済みます。 |
| 購入前にアカウント作成を必須とし、購入を単一のCustomer User IDに厳密に紐付けるルールがある。 | **無効**を選択してください。アカウント間でトランザクションが移譲されないことが保証されます。 |
## 未来の日付のイベントタイムスタンプ(Apple/iOS) \{#event-timestamps-with-future-dates-appleios\}
この動作はApple App Storeに特有のものです。Google Playの通知システムはイベントを事前に送信しません。
プロファイルやインテグレーションのイベントタイムスタンプが未来の日付を示すことがあります。これはAppleが更新イベントを事前に送信するためです。
- **発生理由**:Appleはサブスクリプションが期限切れになる前に自動更新されるようにしており、ユーザーのサービス中断を防ぐためです。詳細はAppleのデベロッパーフォーラムをご覧ください:[Server Notifications for Subscriptions](https://developer.apple.com/forums/tags/app-store-server-notifications)。
- **影響するイベントの種類**:通常、サブスクリプションの更新とトライアルから有料への転換に適用されます。これらのイベントはAppleが事前に通知するため、未来のタイムスタンプを持つ場合があります。
- **その他のイベントの種類**:追加のアプリ内課金とサブスクリプションプランの変更は、事前に予測できないため、実際のタイムスタンプで記録されます。
- **アナリティクスとイベントフィードへの影響**:これらのイベントは、タイムスタンプが過ぎた後にのみ**Analytics**と**Event Feed**に表示されます。未来のタイムスタンプを持つイベントはどちらのセクションにも表示されません。
- **インテグレーションへの影響**:Adaptyはイベントを受信したらすぐにインテグレーションへ送信します。イベントが未来のタイムスタンプを持つ場合、Adaptyはその未来のタイムスタンプをそのままインテグレーションに送信します。
## 次のステップ \{#next-steps\}
- プロファイルダッシュボードを使用してユーザーを検索・管理するには、[プロファイル](profiles-crm)を参照してください。
- アプリでのユーザー識別を設定するには、[ユーザーの識別](identifying-users)SDKガイドを参照してください。
- アクセス共有ポリシーを設定するには、[ユーザーアカウント間での有料アクセスの共有](sharing-paid-access-between-user-accounts)を参照してください。
---
# File: sharing-paid-access-between-user-accounts
---
---
title: "ユーザーアカウント間での有料アクセスの共有"
description: "複数のデバイスや複数のアプリプロファイルを持つユーザーに対応するため、異なるユーザーアカウント間で有料アクセスを共有する方法"
---
ユーザーが購入を行うと、Adapty はアクティブな[プロファイル](identifying-users)に新しい[アクセスレベル](access-level)を割り当てます。このアクセスレベルにより、購入者は有料コンテンツにアクセスできるようになります。
購入者のプロファイルは、アプリの再インストールや新しいアプリ内アカウントへのログインによって意図せず変わることがあります。アクセスが途切れないよう、Adapty は元のプロファイルとその後のプロファイルの間でユーザーのアクセスレベルを自動的に共有します。
このアプローチはほとんどのアプリケーションに最適です。ただし、ビジネスロジックの要件によっては、より制限的な有料アクセス共有ポリシーを選択することもできます。
[General Settings](https://app.adapty.io/settings/general) ページを開いて、アクセスレベルの共有ポリシーを設定してください。テストを容易にするため、[サンドボックス環境のみ](#sharing-paid-access-on-sandbox)でこの設定を変更することもできます。
## Enabled(デフォルト) \{#enabled-default\}
この設定は、**組み込み認証を持たない**アプリケーションに最適です。購入後、同じストアアカウントに関連付けられたすべてのプロファイルがアクセスレベルを自動的に*継承*します。
* ユーザーが新しい認証情報でアプリにログインしても、有料コンテンツへのアクセスは維持されます。
* ユーザーが工場出荷時リセット後にアプリを再インストールしても、有料コンテンツへのアクセスは維持されます。
* ユーザーが同じストアアカウントで他のデバイスにアプリをインストールしても、購入はすべてのデバイスで利用可能になります。アプリの各インスタンスが独自のカスタマープロファイルを持っている場合でも同様です。
## Transfer access to new user \{#transfer-access-to-new-user\}
この設定は、**認証の有無にかかわらず購入を許可する**アプリケーション、または**1 デバイスにつき 1 ユーザー**のポリシーを適用したいアプリケーションに最適です。
Adapty は購入へのアクセスを一度に 1 つの Customer ID に制限します。デバイス所有者はアプリを再インストールしたり、ログインとログアウトを繰り返すことができますが、複数の Customer ID から同時に同じプロダクトにアクセスすることはできません。
この設定を有効にすると、匿名プロファイル(たとえばユーザーがログアウトした後にアクティブになるプロファイル)は常に最後にアクティブだった Customer ID のアクセスレベルを継承します。これは後でアクセスを失わないようにするために必要です。
:::warning
デフォルト設定を無効にして **Transfer access to new user** を有効にしても、Adapty は既存のカスタマープロファイルのアクセスレベルをすぐには更新しません。
切り替えは、ユーザーが新しいストアイベント(サブスクリプションの更新や購入の復元など)をトリガーしたときに行われます。
:::
:::important
Adapty が古いプロファイルを失効させるのは、SDK がトランザクションを伝播する時点で新しいプロファイルに [Customer User ID](identifying-users#set-customer-user-id-on-configuration) が設定されている場合のみです。`restorePurchases` が匿名プロファイルで実行された場合、古い Customer User ID と新しい匿名プロファイルの両方がアクセスレベルを持つことになります。古いプロファイルは、匿名プロファイルを識別した後に失効します。
これを避けるには、SDK メソッドをこの順番で呼び出してください:`activate` → `identify` → `restorePurchases`。
:::
## 有料アクセス共有の無効化 \{#disable-paid-access-sharing\}
この設定は、**必須認証**を持つアプリケーション、または独自のアクセス管理を実装しているアプリケーションに**のみ適切**です。それ以外の場合、ユーザーが購入にアクセスできなくなり、アプリが**必須のストアレビューに失敗するリスク**があります。
有料アクセス共有を無効にすると、Adapty は購入時にアクティブな [Customer ID](identifying-users#set-customer-user-id-on-configuration) にプロダクトを紐付け、他のカスタマープロファイルとアクセスレベルを共有しません。このポリシーにより、厳格な 1 対 1 のプロダクト配布が可能になります。
:::warning
有料アクセス共有を無効にすると、Customer ID が有料アクセスを継承できなくなります。過去に有料アクセスを継承した Customer ID がある場合、自動的に取り消すことはできません。
:::
:::important
緊急時には、次に利用可能なプロファイル(識別済みまたは匿名)がアクセスレベルを引き継げるよう、[ユーザープロファイルを削除する](api-adapty/operations/deleteProfile)必要がある場合があります。
:::
## 実践的なリファレンス \{#practical-reference\}
モードを選択したら、以下の一覧で期待される動作を確認してください:どのプロファイルがアクセスを受け取るか、古いプロファイルがいつアクセスを失うか、どのウェブフックイベントが発火するか。
| モード | 複数のプロファイルが 1 つの購入を共有するか | 転送時に古いプロファイルが失効するか | 古いプロファイルが失効するタイミング | 2 番目のプロファイルがサブスクリプションを引き継ぐ際のウェブフックイベント |
| --- | --- | --- | --- | --- |
| **Enabled (default)** | はい — 復元またはサインインしたすべてのプロファイルがアクセスを継承 | しない | N/A | 継承する各新規プロファイルに `access_level_updated`(`is_active=true`) |
| **Transfer access to new user** | いいえ — 排他的だが、プロファイル間で移動可能 | はい | 新しい識別済みデバイスがトランザクションを伝播したとき(`restorePurchases`、identify、または次のストア側イベント)に即時 | 新しいプロファイル:`access_level_updated`(`is_active=true`)。古いプロファイル:`access_level_updated`(`is_active=false`) |
| **Disabled** | いいえ — 購入ごとに 1 つの Customer User ID、永続的 | N/A — アクセスは転送されない | N/A | 2 番目のプロファイルには何もなし。SDK はそのプロファイルのアクセスを表示しない |
## サンドボックスでの有料アクセス共有 \{#sharing-paid-access-on-sandbox\}
サンドボックス環境専用の有料アクセス共有ポリシーを設定できます。サンドボックス環境で購入をテストする際は、以下の動作が予想されます:
* Apple はアカウントの購入履歴に過去の購入情報を保存します。Adapty SDK もこれにアクセスできます。
* アプリを再インストールした際、Adapty がプロダクトがすでに購入済みであることを検出した場合、アクティブなプロファイルがアクセスレベルを継承します。
* Apple がプロダクトの既存の購入を検出した場合、アクティブなプロファイルに必要なアクセスレベルがなくても、同じ購入を 2 回行うことはできません。
この動作は**有料アクセス共有の設定に関係なく**発生します。アプリにペイウォールが表示されず、プロダクトを購入できません。唯一の解決策は、**アカウントの購入履歴をクリアすること**です。詳細な手順は[サンドボックステストガイド](test-purchases-in-sandbox)を参照してください。
:::warning
Apple のサンドボックスサブスクリプションは数分ごとに自動更新されます。この急速な更新により、Adapty が[親プロファイル](how-profiles-work#parent-and-inheritor-profiles)として扱うプロファイルが入れ替わることがあります。これは本番環境ではほとんど再現されないパターンです。本番環境で使用するモードをテストし、サンドボックスでの結論を出す前に実際の Apple ID で動作を確認してください。
:::
## アナリティクスにおける有料アクセス共有 \{#paid-access-sharing-in-analytics\}
* Adapty はトランザクションが発生した時点でそれを記録します。1 つのトランザクションが複数のプロファイルに関連付けられることがありますが、複数回カウントされることはありません。
* 2 つ以上のプロファイルが同じアクセスレベルを共有している場合、購入は[親プロファイル](how-profiles-work#parent-and-inheritor-profiles)に帰属されます。
* アクセスレベルの継承はインストール統計には影響しません。Adapty がインストールをカウントする方法を決定するには、設定ページで利用可能な 2 つの[インストール定義](installs#counting-modes)のいずれかを選択できます。
---
# File: segments
---
---
title: "セグメント"
description: "Adapty でユーザーセグメントを作成・管理して、より精度の高いターゲティングを実現しましょう。"
---
**セグメント**は、共通の属性を持つユーザーをグループ化するフィルターの集合です。セグメントを使うと、ペイウォールや A/B テストのターゲティングをより効果的に行えます。
:::note
イベントフィードのイベントはダッシュボードに届くまでに遅延が発生します。新しいプロファイルや属性の変更はすぐに反映されない場合があります。
:::
セグメントを作成したら、[プレースメントや A/B テストで**オーディエンス**として使用](audience)し、ユーザーに表示するペイウォール(単数または複数)を制御できます。使用例:
- 非サブスクリプションユーザーには標準のペイウォールを表示し、以前サブスクリプションやトライアルをキャンセルしたユーザーには割引を提示する。
- 国ごとに異なるペイウォールを表示する。
- Apple Search Ads のアトリビューションデータに基づいてユーザーをターゲティングする。
- 古いバージョンのアプリを使用しているユーザーには既存のペイウォールを表示し続け、新しいバージョンのユーザーには更新されたペイウォールを表示する。
- [アナリティクス](controls-filters-grouping-compare-proceeds#filter-and-group-data)では、セグメントでフィルタリングして特定のユーザーグループのパフォーマンスを確認する。セグメントでグループ化すると、**全ユーザー**内でのパフォーマンスや貢献度を比較できる。
## 作成 \{#creation\}
セグメントを作成するには、名前を入力し、フィルターを定義する属性を選択します。複数の属性を選択した場合、ユーザーはすべての条件を満たす必要があります。Adapty は属性間に AND 論理を適用します。
## 利用可能な属性 \{#available-attributes\}
:::note
**Country**(国)や **Calculated total revenue USD**(計算済み合計収益 USD)など多くのユーザー属性は自動的に設定されますが、**Age**(年齢)、**App user ID**(アプリユーザー ID)、**Attribution**(アトリビューション)データ、**Gender**(性別)、**Custom attributes**(カスタム属性)は自動的には設定されません。セグメント化に利用する場合は、[ユーザー属性を設定](setting-user-attributes)するか、[アトリビューションデータを渡す](attribution-integration)必要があります。
:::
:::tip
日付ベースの属性には、以下の方法でフィルタリングできます:
- **固定日付**: カレンダーから特定の日付を選択(例:ブラックフライデーからサイバーマンデーの間にインストールしたユーザーに特別オファーを表示)
- **相対範囲**: 「過去 7 日間」や「過去 3 ヶ月」などの動的な期間を設定(例:30 日以上前に最後に見られたユーザーを再エンゲージしたり、最近のインストールをターゲティングしたりする)
相対範囲は自動的に更新されるため、継続的なキャンペーンに最適です。固定日付は期間限定のプロモーションに最も適しています。
:::
| 属性 | フィルター対象 |
|---------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Age** | ユーザーの年齢。年齢は Adapty が最初に受け取った時点で計算され、その後は更新されません。 |
| **App User ID** | アプリ内のユーザー識別子([customer_user_id](profiles-crm#user-attributes))。存在するかどうかでフィルタリングできます。例えば、ログインしていないユーザーにのみペイウォールを表示する場合などに使います。 |
| **App version (current)** | Adapty が最後にイベントデータを受け取ったユーザーデバイスにインストールされているアプリの現在のバージョン。ユーザーがアップグレードすると**更新され**、常に現在実行中のバージョンを反映します。特定のバージョンを実行しているすべてのユーザー(以前のバージョンからアップグレードしたユーザーを含む)にロールアウトする場合に使用します。セグメント作成時に、**App version** の横にある鉛筆アイコンを選択して新しいバージョンを追加すると、すぐに使用できます。
| フィールド | 説明 |
| ------ |--------------------------------------------------------------------------------------------------------------------------------------|
| **Name** | カスタム属性のラベル。Adapty ダッシュボード内でのみ使用されます。 |
| **Key** | 属性の一意の識別子。SDK で使用されるキーと一致している必要があります。 |
| **Type** | 以下から選択します:
## セグメントの複製 \{#duplicate-segments\}
既存のセグメントに似たものが必要な場合は、最初から作り直す代わりに複製しましょう。ユーザーグループが重複する複数のキャンペーンや A/B テストを運用しているチームの作業時間を節約できます。
セグメントを複製すると、すべてのフィルターと説明を含むコピーが作成されます。新しいセグメントの名前には「(copy)」が追加されるので、元のものと区別できます。新しいセグメントは元のセグメントから独立しており、一方への変更は他方に影響しません。
Adapty ダッシュボードでセグメントを複製するには:
1. Adapty メインメニューの **Profiles & Segments** セクションを開き、[**Segments**](https://app.adapty.io/segments) タブに切り替えます。
2. セグメントの横にある **3-dot** ボタンをクリックし、**Duplicate** を選択します。
3. 新しいセグメントを開き、必要に応じてフィルターを調整します。
## セグメントの削除 \{#delete-segments\}
セグメントが不要になったら、完全に削除できます。
以下のいずれかでセグメントが現在オーディエンスとして使用されている場合、Adapty は削除をブロックします:
- **プレースメント**:削除されていないプレースメントの少なくとも 1 つがそのセグメントをオーディエンスとして使用している。
- **A/B テスト(ライブまたは完了済み)**:削除されていない A/B テストの少なくとも 1 つがそのセグメントをオーディエンスとして使用している。
セグメントの削除において、Adapty は**ライブ**と**完了済み**の A/B テストをどちらもアクティブとして扱います。完了済みのテストは、テスト後のペイウォールまたはオンボーディングを一致するユーザーに表示するために引き続きオーディエンスを使用しており、テストの過去の指標はそのセグメントにスコープされています。セグメントは A/B テスト自体が削除されて初めて解放されます。
:::warning
セグメントの削除は永続的です。削除されたセグメントは復元できません。
:::
Adapty ダッシュボードでセグメントを削除するには:
1. Adapty メインメニューの **Profiles & Segments** に移動し、[**Segments**](https://app.adapty.io/segments) タブに切り替えます。
2. セグメントの横にある **3-dot** ボタンをクリックし、**Delete** を選択します。
3. 確認フィールドにセグメント名を入力し、**Delete forever** をクリックします。
:::info
セグメントが使用中の場合、ダイアログにはそれを参照しているプレースメントと A/B テストの一覧が表示されます。
削除のブロックを解除するには、リストの各プレースメントまたは A/B テストを開き、オーディエンスからセグメントを削除するか、プレースメントまたは A/B テスト自体を削除してください。何もセグメントを参照していない状態になれば、削除できます。
:::
---
# File: event-feed
---
---
title: "イベントフィード"
description: "Adaptyのイベントフィードでユーザーアクティビティを監視・分析します。"
---
イベントフィードを使うと、Adaptyが生成した[イベント](events)を視覚的に追跡し、Webhookを含むサードパーティ連携へのエクスポート状況を確認できます。
:::warning
イベントフィードには以下は表示されません:
- **サーバーサイドAPI v1のトランザクション**:[サーバーサイドAPI(バージョン1)](server-side-api-specs-legacy#requests)を使って作成されたもの。表示させるには[サーバーサイドAPI(バージョン2)](api-adapty/operations/setTransaction)を使用してください。
- **プロファイルのないイベント**:SDKがユーザーを識別する前に届いたトランザクション(例:ストアのサーバー通知)。これらをエクスポートに含めるには、[S3](s3-exports)または[Google Cloud Storage](google-cloud-storage)連携で **Include events without profile** を有効にしてください。
:::
:::note AppsFlyer、Facebook Ads、Branchの送信ステータスは、エラーが発生しても常に返されるとは限らないため、正確でない場合があります。 ::: トランザクションを開始したユーザーのプロファイルを確認するには、イベント詳細の **View Profile** ボタンをクリックしてください。 --- # File: ab-tests --- --- title: "A/B テスト" description: "Adapty の A/B テストでサブスクリプション価格を最適化し、コンバージョン率を向上させましょう。" --- :::tip リサーチなしでも実践的な A/B テスト計画を立てられます。[AI Growth Advisor](autopilot) がペイウォールを分析し、競合他社のベンチマークを行い、Adapty が追跡する 20,000 以上のサブスクリプションアプリの匿名データからご提案を生成します。 ::: Adapty で A/B テストを実行して、アプリの収益を向上させましょう。コードを変更することなく、さまざまなフロー、ペイウォール、オンボーディングを比較して、最もコンバージョン率の高いものを見つけられます。たとえば、以下のようなテストが可能です。 - サブスクリプション価格 - ペイウォールのデザイン、コピー、レイアウト - トライアル期間とサブスクリプション期間 - オンボーディングのデザイン ## 前提条件 \{#prerequisites\} A/B テストを設定する前に、以下が必要です: - **プレースメント**: フロー、ペイウォール、またはオンボーディングが表示される1つ以上の[プレースメント](placements)。 - **フローの場合**: 少なくとも2つの[フロー](adapty-flow-builder)。 - **ペイウォールの場合**: 少なくとも2つの[ペイウォール](paywalls)。 - **オンボーディングの場合**: 少なくとも2つの[オンボーディング](onboardings)。 :::warning [Adapty フロービルダー](adapty-flow-builder)または[Adapty ペイウォールビルダー](adapty-paywall-builder)を使用していない場合は、`.logShowFlow()`(iOS SDK v4+)/ `.logShowPaywall()` を使って[ペイウォールビューを Adapty に送信](present-remote-config-paywalls#track-paywall-view-events)してください。このメソッドを使用しないと、Adapty はテスト内のペイウォールビュー数を計算できず、コンバージョン統計が不正確になります。 ::: ## A/B テストの種類 \{#ab-test-types\} Adapty は 2 つの主要な A/B テストタイプをサポートしています: - **通常**:単一のフロー/ペイウォール/オンボーディングのプレースメントで実行されます。 - **クロスプレースメント**:複数のペイウォールプレースメントにまたがって実行され、同じバリアントをユーザーに一貫して表示します。現在はペイウォールのみで利用可能です。 タイプの詳細な比較、ユースケース、優先順位のルールについては、[A/B テストの種類](ab-test-types)を参照してください。 ## 次のステップ \{#next-steps\} - [Growth Autopilot](autopilot) — ペイウォールを分析し、市場インサイトを取得して、A/B テスト計画を生成する - [A/B テストの種類](ab-test-types) — テストの種類とそれぞれの使いどころを学ぶ - [A/B テストの作成・実行・停止](run_stop_ab_tests) — はじめてのテストをセットアップして実行する - [A/B テストの結果と指標](results-and-metrics) — A/B テストのデータを理解して勝者を選ぶ --- # File: ab-test-types --- --- title: "A/B テストタイプ" description: "Adapty の A/B テストタイプについて説明します。" --- Adapty では、テストシナリオに応じた 2 種類の A/B テストタイプを用意しています。 - **通常の A/B テスト:** 単一の[フロー](adapty-flow-builder)/[ペイウォール](paywalls)/[オンボーディング](onboardings)プレースメントに対して作成する A/B テストです。 - **クロスプレースメント A/B テスト:** アプリ内の複数のペイウォールプレースメントに対して作成する A/B テストです。A/B テストが
## 主な違い \{#key-differences\}
| 機能 | 通常の A/B テスト | クロスプレースメント A/B テスト |
| ------------------------------- |--------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------|
| **テスト対象** | 1 つのフロー/ペイウォール/オンボーディング | 1 つのバリアントに属するペイウォールのセット |
| **バリアントの一貫性** | バリアントはプレースメントごとに個別に決定される | すべてのペイウォールプレースメントで同じバリアントが使用される |
| **オーディエンスのターゲティング** | フロー/ペイウォール/オンボーディングのプレースメントごとに定義される | すべてのペイウォールプレースメントで共有される |
| **アナリティクス** | 1 つのフロー/ペイウォール/オンボーディングのプレースメントを分析する | テストの一部であるプレースメントに対してアプリ全体を分析する |
| **バリアントのウェイト分布** | フロー/ペイウォール/オンボーディングごと | ペイウォールのセットごと |
| **ユーザー** | すべてのユーザー | 新規ユーザーのみ(Adapty ペイウォールを見たことがないユーザー) |
| **Adapty SDK バージョン** | フローの場合: v4.0.0 以降。ペイウォールの場合: 任意。オンボーディングの場合: v3.8.0 以降(iOS、Android、React Native、Flutter)、v3.14.0 以降(Unity)、v3.15.0 以降(KMP、Capacitor) | 3.5.0 以降 |
| **最適な用途** | アプリ全体の経済効果を考慮せずに、単一のフロー/ペイウォール/オンボーディングプレースメントの独立した変更をテストする場合 | アプリ全体のマネタイズ戦略を評価する場合 |
## A/B テストの選択ロジック \{#ab-test-selection-logic\}
**クロスプレースメント A/B テストは通常の A/B テストよりも優先されます。** ただし、クロスプレースメントテストは**新規ユーザー**(まだ Adapty のペイウォールを一度も見ていないユーザー、つまり `getPaywall` SDK メソッドが一度も呼び出されていないユーザー)にのみ表示されます。これにより、プレースメント間での結果の一貫性が確保されます。
以下のダイアグラムは、Adapty がプレースメントに対して A/B テストを選択するためのロジックを示しています。
**A/B Tests** ページでは、ペイウォール、オンボーディング、フロー、クロスプレースメントのテストが別々のタブに表示されます。
## クロスプレースメント A/B テストの制限事項 \{#crossplacement-ab-test-limitations\}
:::warning
クロスプレースメント A/B テストには、フローまたはオンボーディングのプレースメントを含めることができません。
:::
クロスプレースメント A/B テストは、テスト内のすべてのプレースメントで各ユーザーが同じバリアントを見ることを保証します。これにより、以下の制限が生じます。
* 参加できるのは新規ユーザーのみです。新規ユーザーとは、Adapty のペイウォールを見たことがなく、アプリが `getPaywall` を一度も呼び出していないユーザーです。それ以外のユーザーに対して一貫したペイウォールのチェーンを保証することはできません。
* ユーザーが最初に訪れたプレースメントで、Adapty が表示するペイウォールが決まります。ユーザーの割り当てを変更したり、同じユーザーを複数のクロスプレースメント A/B テストに登録したりすることはできません。
:::warning
ユーザーがクロスプレースメントのペイウォールを受け取ると、テストを停止した後も 90 日間はそれが表示され続けます。この期間を変更するには、**General** 設定の **[Cross-placement variation stickiness](general#9-cross-placement-variation-stickiness)** を調整してください。
:::
## クロスプレースメント A/B テストの優先順位 \{#crossplacement-ab-test-priority\}
* クロスプレースメント A/B テストは、常に通常の A/B テストおよびオンボーディング A/B テストよりも優先されます。新規ユーザーが同じプレースメントでクロスプレースメントテストと通常のテストの両方の対象となる場合は、クロスプレースメントテストが表示されます。
* 同じオーディエンスを持つ複数のクロスプレースメント A/B テストが同じプレースメントを共有している場合、Adapty は追加された順序に基づいてテストの優先順位を自動的に割り当てます。最初のテストが最高優先度を持ちます。手動で変更することはできません。
* オーディエンスの小さいセグメントをターゲットとするテストは、「すべてのユーザー」セグメントをターゲットとするテストよりも自動的に優先されます。
:::note
アナリティクスでは、クロスプレースメント A/B テストはプレースメントごとに 1 つずつ、複数の子テストとして表示されます。子テストの命名パターンは `
2. 右上の **Create A/B test** をクリックします。
3. **Create the A/B test** ウィンドウで **Test name** を入力します。これは必須項目です。結果を確認する際に識別しやすいよう、テストの内容を明確に表す名前を選んでください。
4. **Test goal** に達成したい目標(例:サブスクリプションの増加やチャーンの削減)を記入します。
5. **Select placement** をクリックして、フロー・ペイウォール・オンボーディングのプレースメントを選択します。
6. **Variants** テーブルでテストの内容を設定します。各行がバリアント、各列がプレースメントになります。各交点にペイウォールを追加します。
デフォルトでは、テーブルに 2 つのバリアントと 1 つのプレースメントがあります。バリアントは最大 20 個まで追加できます。2 つ目のプレースメントを追加すると、テストはクロスプレースメント A/B テストになります。なお、クロスプレースメント A/B テストはペイウォールのみ対応しています。
7. テストを保存します。2 つの選択肢があります:
1. **Save as draft**:テストはすぐに公開されません。後でプレースメントまたは A/B テストリストから起動できます。公開前に設定を確認したい場合に使用してください。
2. **Run A/B test**:テストをすぐに起動します。このボタンをクリックした瞬間にテストが公開されます。
下書きとして保存した後は、[A/B テストを実行する](#run-an-ab-test)に進んでください。
## A/B テストを編集する \{#edit-an-ab-test\}
A/B テストは下書きとして保存されている場合にのみ編集できます。テストが公開された後は変更できません。公開中のテストを更新するには、**Modify** オプションを使用します。これにより同じ名前の複製が作成され、そこで変更を加えることができます。Adapty は元のテストを停止し、元のバージョンと修正バージョンがどちらも分析画面に別々に表示されます。
## A/B テストを実行する \{#run-an-ab-test\}
Adapty で A/B テストを実行するとは、プレースメントに割り当ててユーザーへのペイウォールやオンボーディングの表示を開始することを意味します。
1. Adapty のメインメニューから [**A/B tests**](ab-tests) セクションに移動します。
2. 正しいリストを表示していることを確認してください。**Paywall**・**Flow**・**Onboardings**・**Crossplacement** の A/B テストは、切り替え可能な別々のタブに表示されます。
3. **Drafts** タブに切り替えます。起動できるのは下書きのテストのみです。
4. 起動したいテストの横にある **Run A/B test** をクリックします。
5. **Edit A/B test** ウィンドウが開きます。設定を確認し、必要な最終変更を行います。プレースメントやオーディエンスが未設定の場合は、ここで追加してください。
6. 設定を確認したら、**Run A/B test** をクリックして開始します。
テストを起動した後は、[A/B テストの結果と指標](results-and-metrics)ページで進捗を追跡し、パフォーマンスデータを確認できます。
## A/B テストを停止する \{#stop-an-ab-test\}
A/B テストを停止すると、テストが終了し結果を確認できます。また、テスト終了後に対象プレースメントでユーザーに何を表示するかを決定します。
1. [**A/B tests**](https://app.adapty.io/ab-tests) セクションを開き、**Live** タブに移動します。
2. 停止したいテストの横にある 3 点メニューをクリックし、**Stop A/B test** を選択します。
3. **Stop the A/B test** ウィンドウで、テスト終了後の動作を決定します。3 つの選択肢があります:
| オプション | 説明 |
|----------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| テスト済みのペイウォール/オンボーディングのいずれかを表示する | 収益・最良確率(**P2BB**)・1,000 ユーザーあたりの収益などのテスト結果をもとに、勝者のペイウォールまたはオンボーディングを選択します。選択したプレースメントとオーディエンスに対して、そのペイウォールまたはオンボーディングが表示されます。 |
| A/B テストに参加していないペイウォール/オンボーディングを選択する | 現在の A/B テストに含まれていないペイウォールまたはオンボーディングを選択します。テストしたバリアントがどれも目標を達成しなかった場合に使用します。 |
| 特定のペイウォール/オンボーディングを表示しない | 選択したプレースメントとオーディエンスに対して、A/B テスト終了後に特定のペイウォールまたはオンボーディングは選択されません。代わりに、オーディエンスの優先度に基づいて次に利用可能なペイウォールまたはオンボーディングが表示されます。手動で選択せずに既存の設定でペイウォールまたはオンボーディングを決定したい場合に適しています。 |
:::note
A/B テストの停止は取り消しできません。テストを再起動することはできないため、停止を決定する前に十分なデータが集まっていることを確認してください。
:::
4. **Stop and complete this A/B test** ボタンをクリックします。
A/B テストが終了すると、テストはアクティブでなくなり、テスト内のペイウォールまたはオンボーディングは新しいユーザーに表示されなくなります。
テスト実行中に参加したユーザーのパフォーマンスを確認するために、[A/B テストの指標ページ](results-and-metrics#metrics-controls)で引き続き A/B テストの結果と指標にアクセスできます。それらのユーザーに新たな購入や収益イベントが紐付けられると、指標は引き続き更新される場合があります。
---
# File: ab-test-no-paywall-variants
---
---
title: "フローまたはペイウォールなしでA/Bテストのバリアントを追加する"
description: "リモートコンフィグのフラグを使って表示を制御し、フローまたはペイウォールをスキップするバリアントでA/Bテストを実行する方法。"
---
フローまたはペイウォールの効果を、空のバリアントとのA/Bテストで測定できます。一方のバリアントはフロー/ペイウォールを表示し、もう一方は何も表示しません。アプリはリモートコンフィグのフラグを読み取って、レンダリングするかどうかを判断します。
## 仕組み \{#how-it-works\}
同じプレースメントに2つのフロー/ペイウォールを設定します。
- **フロー/ペイウォール A**: テストしたいフローまたはペイウォール。リモートコンフィグで `show_paywall` を `true` に設定します。
- **フロー/ペイウォール B**: 空のフローまたはペイウォール。リモートコンフィグで `show_paywall` を `false` に設定します。
SDKがフローまたはペイウォールを返すと、アプリは `show_paywall` フラグを読み取ります。フラグが `true` の場合はレンダリングし、`false` の場合はレンダリングをスキップして、ユーザーは何も見ずに続行します。
## 1. リモートコンフィグにshow_paywallフラグを追加する \{#1-add-the-show_paywall-flag-in-remote-config\}
同じプレースメントに2つのフローまたはペイウォールが必要です。フロー/ペイウォール A(テストしたいもの)とフロー/ペイウォール B(空のもの)です。両方のバリアントで同じキーを使って分岐できるよう、それぞれに `show_paywall` フィールドを追加します。
フロー/ペイウォール A にフラグを追加するには:
1. Adapty のメインメニューで [**Flows**](https://app.adapty.io/flows)/[**Paywalls**](https://app.adapty.io/paywalls) セクションを開き、フロー/ペイウォール A を選択します。
2. **Remote config** セクションを開きます。
3. 名前 `show_paywall`、値 `true` のフィールドを作成します。**JSON** ビューでは次のようになります:
```json showLineNumbers
{
"show_paywall": true
}
```
4. 変更を保存します。
フロー/ペイウォール B にも同じ手順を繰り返しますが、`show_paywall` を `false` に設定します。
リモートコンフィグの詳細については、[リモートコンフィグでフローをカスタマイズする](customize-flow-with-remote-config)または[リモートコンフィグでペイウォールをデザインする](customize-paywall-with-remote-config)を参照してください。
:::tip
両方のバリアントに `show_paywall` を設定することで、両グループのコードパスが同一になり、後からバリアントを追加するときも簡単に拡張できます。
:::
## 2. A/Bテストを設定する \{#2-set-up-the-ab-test\}
1. プレースメントに[A/Bテストを作成](run_stop_ab_tests)し、両方のフロー/ペイウォールをバリアントとして追加します。
2. バリアントのウェイトを設定して、フロー/ペイウォールを見るユーザーと見ないユーザーにトラフィックを分配します。
## 3. アプリでフラグを確認する \{#3-check-the-flag-in-your-app\}
SDKから返されるリモートコンフィグの `show_paywall` を読み取ります。フラグが `false` の場合、レンダリングをスキップしてユーザーを続行させます。
:::note
Adapty は [currencylayer.com](https://currencylayer.com/) の為替レート(8時間ごとに更新)を使用して他の通貨を USD に変換します。レートは**取引時点で固定**されるため、その後の変動は変換結果に影響しません。
:::
**Revenue(収益)**: この指標は、購入とリニューアルから発生した USD 総収益から、ユーザーへの返金を差し引いた金額を示します。初回購入だけでなく、その後のサブスクリプション更新も含まれます。収益を見ることで、各 A/B テストバリアントの財務パフォーマンスを把握し、どのバリアントが最も多くの収益をもたらしているかを判断できます。
[ペイウォール](paywall-metrics)の指標についてはこちらをご覧ください。
**Probability to be best(最良の確率)**: Adapty は強固な数学的分析フレームワークを用いて A/B テストの結果を分析し、「最良の確率(Probability to be best)」という指標を提供します。この指標は、特定のバリアントがテストされたすべてのバリアントの中で最も優れたパフォーマンス(長期的な収益の観点から)である可能性を評価します。1% ~ 100% のパーセンテージで表されます。Adapty がこの指標を計算する方法については、[ドキュメント](maths-behind-it)をご参照ください。1K ユーザーあたりの収益で最も優れたオプションは緑色でハイライトされ、デフォルトとして自動的に選択されます。
**Revenue per 1K users(1K ユーザーあたりの収益)**: この指標は、各 A/B テストバリアントにおける 1,000 ユーザーあたりの平均収益を計算します。ユーザー総数に関わらず、バリアントの収益効率を把握するのに役立ちます。標準化されたスケールで異なるバリアントのパフォーマンスを比較し、収益創出効率に基づいて情報に基づいた意思決定を行えます。
**Prediction intervals for revenue 1K users(1K ユーザー収益の予測区間)**: 1K ユーザーあたりの収益指標には予測区間も含まれています。この予測区間は、利用可能なデータと統計分析に基づいて、特定のバリアントの 1,000 ユーザーあたりの真の収益が収まると予測される範囲を表します。
A/B テストにおいて、異なるバリアントが生み出す収益を分析する際、各バリアントの 1,000 ユーザーあたりの平均収益を計算します。収益はユーザーごとに異なるため、予測区間は予測プロセスに伴う変動性と不確実性を考慮しつつ、1,000 ユーザーあたりの収益の妥当な値の範囲を明確に示します。
1K ユーザーあたりの収益指標に予測区間を組み込むことで、Adapty は A/B テストバリアントの収益効率を評価しながら、潜在的な収益結果の幅も考慮できるようにしています。この情報は、予測プロセスの不確実性と 1,000 ユーザーあたりの収益の妥当な値を踏まえた、データに基づく意思決定とサブスクリプション戦略の最適化に役立ちます。
これらの指標を分析することで、A/B テストバリアントの財務パフォーマンス・統計的有意性・収益効率についてのインサイトを得られ、データに基づいた意思決定とサブスクリプション戦略の効果的な最適化が可能になります。
## A/B テストの指標 \{#ab-test-metrics\}
Adapty は、ペイウォールやオンボーディングのバリエーションに対して実施された A/B テストのパフォーマンスを効果的に測定するための包括的な指標セットを提供します。これらの指標はリアルタイムで継続的に更新されますが、ビュー数は定期的に更新されます。これらの指標を理解することで、さまざまなバリエーションの効果を評価し、ペイウォールやオンボーディング戦略を最適化するためのデータドリブンな意思決定が可能になります。
A/B テストの指標は A/B テストリストで確認でき、すべての A/B テストのパフォーマンス概要を把握できます。この包括的なビューでは各テストバリエーションの集計指標が表示され、パフォーマンスの比較や有意な差異の特定が可能です。各 A/B テストのより詳細な分析には、A/B テスト詳細指標にアクセスできます。このセクションでは選択した A/B テストに固有の詳細な指標が提供され、個々のバリエーションのパフォーマンスを深く掘り下げることができます。
ビュー数を除くすべての指標は、ペイウォールやオンボーディング内のプロダクトに紐付けられます。
## インストール日で指標をフィルタリング \{#filter-metrics-by-install-date\}
ペイウォール、トライアル、購入の指標は、2つの異なる日付でグループ化できます:
- **イベント日** — ペイウォールが表示された日、トライアルが開始された日、または購入が行われた日。
- **インストール日** — ユーザーが初めてアプリを開いた日。
同じ日付範囲でも、この2つのビューは大きく異なる数値を示すことがあります。**Filter metrics by install date** チェックボックスで、ダッシュボードがどちらを使用するかを制御します:
- **チェックなし(デフォルト)**:指標はイベント日でグループ化されます。
- **チェックあり**:指標はインストール日でグループ化されます。
**例。** 日付範囲を4月1日〜30日に設定し、トライアルを確認します。
- **チェックなし**:それらのユーザーがいつインストールしたかに関わらず、4月に*開始*されたトライアルを表示します。
- **チェックあり**:トライアルがいつ開始されたかに関わらず、4月に*インストール*したユーザーのトライアルを表示します。
特定のコホートのユーザー獲得パフォーマンスを測定するにはインストール日ビューを使用し、特定の期間のペイウォールやオンボーディングのアクティビティを測定するにはイベント日ビューを使用してください。
## 指標のコントロール \{#metrics-controls\}
システムは選択した期間に基づいて指標を表示し、3 段階のインデントを持つ左側カラムのパラメータに従って整理します。
### 期間の選択 \{#time-ranges\}
分析する期間を日・週・月やカスタム日付範囲など、さまざまな時間軸から選択できます。
### 利用可能なフィルターとグループ化 \{#available-filters-and-grouping\}
:::link
メイン記事:[アナリティクスのコントロール](controls-filters-grouping-compare-proceeds)
:::
Adapty は、ニーズに合わせた指標分析のフィルタリングとカスタマイズのための強力なツールを提供しています。Adapty の指標ページでは、さまざまな期間・グループ化オプション・フィルタリング機能を利用できます。
- ✅ フィルター対象:オーディエンス、アトリビューション、国、ペイウォール、ペイウォールの状態、ペイウォールグループ、オンボーディング、プレースメント、国、ストア、プロダクト、プロダクトストア
- ✅ グループ化対象:プロダクトおよびストア
:::note
A/B テストでフィルタリングすると、クロスプレースメント A/B テストはプレースメントごとに個別の子テスト(例:`My test child-0`、`My test child-1`)として表示されます。詳細は [クロスプレースメント A/B テストの制限事項](ab-test-types#crossplacement-ab-test-limitations)をご覧ください。
:::
## 単一指標チャート \{#single-metrics-chart\}
ペイウォールやオンボーディングの指標ページの主要コンポーネントの一つが、選択した指標を視覚的に表示して分析を容易にするチャートセクションです。
A/B テスト指標ページのチャートセクションには、選択した指標の値を視覚的に表す横棒グラフが含まれています。グラフの各バーは指標値に対応し、サイズが比例しているためデータをひと目で把握できます。横軸は分析対象の期間を示し、縦軸には指標の数値が表示されます。すべての指標値の合計はグラフの横に表示されます。
また、チャートセクション右上の矢印アイコンをクリックすると、ビューが拡大され、選択した指標がチャートの全体ラインに表示されます。
## A/B テストのサマリー \{#ab-test-summary\}
単一指標チャートの隣には A/B テスト詳細サマリーセクションが表示されており、A/B テストの状態・期間・プレースメント・その他の関連詳細情報が含まれています。
## 指標の定義 \{#metrics-definitions\}
A/B テストで利用可能な主要指標は以下のとおりです。
### Revenue(収益) \{#revenue\}
Revenue は、A/B テストによる購入とリニューアルから発生した USD 総収益を表します。初回購入とその後のサブスクリプション更新が含まれます。収益指標は App Store または Play Store の手数料を差し引く前の金額で計算されます。
[ペイウォール](paywall-metrics#revenue)の収益指標についてはこちらをご覧ください。
### CR to purchases(購入へのコンバージョン率) \{#cr-to-purchases\}
購入へのコンバージョン率は、A/B テストがビューを実際の購入に転換する効果を測定します。購入数をビュー数で割ることで計算されます。例えば、購入数が 10、ビュー数が 100 の場合、購入へのコンバージョン率は 10% になります。
### CR trials(トライアルへのコンバージョン率) \{#cr-trials\}
トライアルへのコンバージョン率(CR)は、A/B テストから開始されたトライアル数をビュー数で割った値です。A/B テストがビューをトライアル有効化に転換する効果を測定します。開始されたトライアル数をビュー数で割ることで計算されます。
### Purchases(購入数) \{#purchases\}
購入数指標は、A/B テストによってペイウォールやオンボーディング内で行われたトランザクションの総数を表します。以下の種類の購入が含まれます。
- 新規購入
- 有効化されたトライアルのトライアル転換
- サブスクリプションのダウングレード、アップグレード、クロスグレード
- サブスクリプションの復元(自動更新なしで期限切れになったサブスクリプションが後に復元された場合など)
なお、更新(リニューアル)は購入数指標には含まれません。
### Trials(トライアル数) \{#trials\}
トライアル数指標は、A/B テストによって有効化されたトライアルの総数を示します。
### Trials cancelled(キャンセルされたトライアル) \{#trials-cancelled\}
キャンセルされたトライアル指標は、自動更新がオフになったトライアルの数を表します。これはユーザーがトライアルを手動で解除した場合に発生します。
### Refunds(返金) \{#refunds\}
A/B テストの返金は、テストされたバリエーションに関連する返金された購入とサブスクリプションの件数を表します。
### Views(ビュー数) \{#views\}
ビュー数は、A/B テストを構成するペイウォールやオンボーディングが閲覧された回数です。同じユーザーが 2 回訪問した場合、2 回としてカウントされます。
### Unique views(ユニークビュー数) \{#unique-views\}
ユニークビュー数は、ペイウォールやオンボーディングのユニーク閲覧数です。同じユーザーが 2 回訪問した場合、1 回としてカウントされます。
### Probability to be the best(最良の確率) \{#probability-to-be-the-best\}
「最良の確率」指標は、A/B テスト内の特定のバリアントが、テストされたすべてのペイウォールやオンボーディングの中で最もパフォーマンスの高いオプションである可能性を数値化したものです。各ペイウォールやオンボーディングの相対的なパフォーマンスを示す数値確率を提供します。1% ~ 100% のパーセンテージで表されます。
### ARPU(ユーザーあたりの平均収益) \{#arpu-average-revenue-per-user\}
オンボーディング A/B テストのみ対象。特定期間における各ユーザーから生み出された平均収益を測定します。総収益をユニークユーザー数で割ることで計算されます。
### ARPPU(有料ユーザーあたりの平均収益) \{#arppu-average-revenue-per-paying-user\}
ARPPU は A/B テストによる有料ユーザーあたりの平均収益(Average Revenue Per Paying User)です。総収益をユニーク有料ユーザー数で割ることで計算されます。例えば、1,000 人の有料ユーザーから $15,000 の収益が発生した場合、ARPPU は $15 となります。
### ARPAS(アクティブサブスクライバーあたりの平均収益) \{#arpas-average-revenue-per-active-subscriber\}
ARPAS は、A/B テストの実施によるアクティブサブスクライバーあたりの平均収益を測定する指標です。総収益をトライアルまたはサブスクリプションを有効化したサブスクライバー数で割ることで計算されます。例えば、総収益が $5,000 でサブスクライバーが 1,000 人の場合、ARPAS は $5 となります。この指標はサブスクライバーあたりの平均収益化ポテンシャルを評価するのに役立ちます。
### Proceeds(手取り収益) \{#proceeds\}
A/B テストの手取り収益指標は、App Store / Play Store の手数料を差し引いた後にアプリオーナーが受け取る実際の USD 金額を、購入とリニューアルから表したものです。A/B テストでテストされたバリエーションに関連する純収益を反映し、アプリの収益に直接貢献します。手取り収益の計算方法については、Adapty の[ドキュメント](analytics-cohorts#revenue-vs-proceeds)をご参照ください。
### Unique subscribers(ユニークサブスクライバー数) \{#unique-subscribers\}
ユニークサブスクライバー数指標は、A/B テストのバリエーションを通じてサブスクリプションを登録またはトライアルを有効化した個別ユーザーの数を表します。サブスクリプションやトライアルの開始回数に関わらず、各サブスクライバーを 1 回のみカウントします。
### Unique paid subscribers(ユニーク有料サブスクライバー数) \{#unique-paid-subscribers\}
ユニーク有料サブスクライバー数指標は、A/B テストのバリエーションを通じて購入を完了し、有料サブスクライバーになったユニークユーザーの数を表します。
### Refund rate(返金率) \{#refund-rate\}
A/B テストの返金率は、テストのバリエーションに関連する返金数を初回購入数(更新は除く)で割ることで計算されます。例えば、返金が 5 件、初回購入が 1,000 件の場合、返金率は 0.5% となります。
### Unique CR purchases(ユニーク購入コンバージョン率) \{#unique-cr-purchases\}
A/B テストのユニーク購入コンバージョン率は、テストのバリエーションに関連する購入数をユニークビュー数で割ることで計算されます。例えば、購入数が 10、ユニークビュー数が 100 の場合、ユニーク購入コンバージョン率は 10% となります。
### Unique CR trials(ユニークトライアルコンバージョン率) \{#unique-cr-trials\}
A/B テストのユニークトライアルコンバージョン率は、テストのバリエーションに関連する開始されたトライアル数をユニークビュー数で割ることで計算されます。例えば、開始されたトライアルが 30、ユニークビュー数が 100 の場合、ユニークトライアルコンバージョン率は 30% となります。
### Completions & unique completions(完了数とユニーク完了数) \{#completions--unique-completions\}
オンボーディング A/B テストのみ対象。完了数は、A/B テストのバリエーションを通じてユーザーがオンボーディングを完了した(最初から最後のスクリーンまで進んだ)回数をカウントします。2 回完了した場合は、**completions(完了数)** が 2 カウントされますが、**unique completion(ユニーク完了数)** は 1 になります。
### Unique completions rate(ユニーク完了率) \{#unique-completions-rate\}
オンボーディング A/B テストのみ対象。ユニーク完了数をユニークビュー数で割った値です。この指標は、A/B テストのバリエーションを通じてユーザーがオンボーディングにどう関わっているかを把握し、無視されていると気づいた場合に改善を行うのに役立ちます。
---
# File: maths-behind-it
---
---
title: "A/B テストの背後にある数学"
description: "サブスクリプション分析の背後にある数学を理解して、収益インサイトを向上させましょう。"
---
A/B テストは、フロー、ペイウォール、またはオンボーディングの2つの異なるバージョンのパフォーマンスを比較するための強力な手法です。最終的な目標は、12か月間のユーザーあたりの平均収益に基づいて、どちらのバージョンがより効果的かを判断することです。しかし、データを収集して意思決定を行うために丸1年待つのは現実的ではありません。そのため、目標指標の代替として2週間のユーザーあたりの収益が使用されており、これは過去のデータ分析に基づいて選択されています。正確で信頼性の高い結果を得るためには、多様なデータタイプを扱える堅牢な統計手法を使用することが重要です。現代のデータ分析で人気のアプローチであるベイズ統計は、A/B テストに柔軟で直感的なフレームワークを提供します。事前知識を取り込み、新しいデータで更新することで、ベイズ手法は不確実性の下でより良い意思決定を可能にします。このドキュメントでは、A/B テスト結果の評価とデータ駆動型の意思決定に向けた貴重なインサイトの提供において、Adapty が採用している数学的分析の包括的なガイドを提供します。
## 統計分析に対する Adapty のアプローチ \{#adaptys-approach-to-statistical-analysis\}
Adapty は、A/B テストのパフォーマンスを評価し、正確で信頼性の高いインサイトを提供するために、包括的な統計分析アプローチを採用しています。私たちの方法論は以下の主要なステップで構成されています:
1. **指標の定義:** A/B テストを成功させるには、分析の具体的な目標や目的に合致する主要指標を特定・定義する必要があります。Adapty は大量のサブスクリプションアプリの過去データを活用し、1年後の平均収益という長期目標に対するプロキシ指標として最適なものを特定しました。それは14日後の ARPU です。
2. **仮説の設定:** A/B テストのために2つの仮説を作成します。帰無仮説(H0)は、コントロールグループ(A)とテストグループ(B)の間に有意な差がないと仮定します。対立仮説(H1)は、2つ以上のグループの間に有意な差があることを示唆します。
3. **分布の選択:** データの特性と観察している指標に基づいて、最適な分布ファミリーを選択します。ここで最も頻繁に選択されるのは対数正規分布(ゼロ値を考慮したもの)です。
4. **ベストである確率の計算:** A/B テストへのベイズアプローチを活用して、テストに参加しているすべてのペイウォールまたはオンボーディングのバリアントに対して、ベストである確率を計算します。この値は以前使用していた p 値と確かに関連していますが、本質的には異なるアプローチであり、より堅牢で理解しやすいものです。
5. **結果の解釈:** 「ベストである確率」は文字通りその意味です。確率が高いほど、特定のオプションがタスクに対して最良の選択である可能性が高くなります。意思決定のしきい値は自分自身で決定する必要があり、具体的な状況の多くの要因に依存すべきですが、一般的な確率の基準は 95% です。
6. **予測区間:** Adapty は各グループのパフォーマンス指標に対する予測区間を計算し、真の母集団パラメータが収まる可能性のある値の範囲を提供します。これにより、推定されたパフォーマンス指標に関連する不確実性を定量化できます。
## サンプルサイズの決定 \{#sample-size-determination\}
適切なサンプルサイズを決定することは、信頼性が高く決定的な A/B テスト結果を得るために重要です。Adapty は、現在採用しているベイズアプローチにおいても依然として重要となる統計的検出力や期待効果量などの要因を考慮し、適切なサンプルサイズを確保します。現在採用しているベイズアプローチに特有の、必要なサンプルサイズを推定するための手法が、分析の信頼性を担保します。
A/B テストの機能について詳しくは、[A/B テストの作成](ab-tests)と[A/B テストの実行](run_stop_ab_tests)に関するドキュメント、および[A/B テストの指標と結果](results-and-metrics)の理解をご参照ください。
Adapty の A/B テスト向け分析フレームワークはベイズアプローチを採用するようになりましたが、指標の定義、仮説の設定、分布の選択に焦点を当てるという点は変わりません。ただし、p 値を決定する代わりに、事後分布を計算し、各バリアントがベストである確率を算出するようになりました。また、予測区間も算出しています。この改訂されたアプローチは、依然として包括的でさらに堅牢でありながら、より直感的で解釈しやすいインサイトを提供するように設計されています。目標は、A/B テストの堅牢な統計分析に基づいて、企業が戦略を最適化し、パフォーマンスを向上させ、成長を促進できるよう支援することです。
---
# File: autopilot-how-it-works
---
---
title: "AI Growth Advisor: 仕組み"
description: "AI Growth Advisorの仕組みを理解し、収益アップをお任せください。"
---
[AI Growth Advisor](autopilot)は、実際のパフォーマンスデータと同じ市場における類似アプリの動向をもとに、どのような実験を実施すべきかを提案します。何が効果的かを推測するのではなく、結果を改善できる可能性の高いテストについて、具体的な提案を受け取ることができます。
この記事では、AI Growth Advisorの思考プロセスを透明性をもって解説します。どのようなデータを使用しているか、どのように機会を評価しているか、そしてなぜ特定の提案が表示されるのか、といった点について説明します。成長のワークフローにAI Growth Advisorを取り入れて自信を持って活用していただくことが、この記事の目的です。
## AI Growth Advisorが実際に行うこと \{#what-ai-growth-advisor-actually-does\}
AI Growth Advisorは、アプリとペイウォールの指標を分析し、収益向上につながる可能性が最も高い実験を見つけます。具体的には以下を確認します:
- **現在の設定**: 価格、トライアル、プロダクト、コンバージョン率
- **市場のパターン**: 類似アプリのオファー構成と価格帯
- **テスト履歴**: すでに実施した実験とその結果
- **成長ポテンシャル**: 最も効果が見込める変更内容
Growth Advisor はAIを使ってこれらの要因を総合的に評価し、すぐに開始できるA/B テストに変換します。競合他社を調査したり、次に何をテストすべきか悩んだりする必要はなく、すぐに使える計画が手に入ります。
## AI Growth Advisorを支えるデータ \{#the-data-behind-ai-growth-advisor\}
各レコメンデーションは、連携する3つの主要なデータソースをもとに構築されています。
#### アプリ自身のデータ \{#your-apps-own-data\}
AI Growth Advisorは、あなたのアプリの現在のパフォーマンスを分析します:
- ペイウォール全体のコンバージョン指標
- 価格設定とプロダクト構成
これにより、AI Growth Advisorは変更を提案する前に、ベースラインを把握します。
:::note
あなたのアプリのパフォーマンスデータを、他のアプリへのレコメンデーション学習に使用することはありません。データはプライベートに保たれます。
:::
#### ペイウォール分析 \{#paywall-analysis\}
AI Growth Advisorは、ペイウォールのスクリーンショットを分析し、そのデザインをあなたのカテゴリーのトップアプリが採用している実績あるパターンと比較します。レイアウトの選択、コピー、サブスクリプションの内訳、節約バッジやレビューセクションなどのコンバージョン重視の要素を評価します。
この分析により、2種類の推奨事項が生成されます。
- **ベンチマークに基づく推奨事項**:トップパフォーマンスのアプリが何を違いとして実践しているかをもとにした推奨事項で、それぞれ具体的な統計データに裏付けられています(例:「教育カテゴリのトップアプリの72%が使用」)。
- **ビジュアル分析の推奨事項**:スクリーンショットをAIが分析して生成する推奨事項で、コピーの改善、レイアウトの変更、その他のデザイン調整を含みます。
これらの推奨事項は、[グロースプラン](autopilot-growth-plan#view-the-growth-plan)に仮説として直接フィードされ、[A/B テストとして実行](autopilot-execute-plan)することができます。
#### 競合データ \{#competitor-data\}
AI Growth Advisorは、価格設定やサブスクリプション構造、カテゴリ内の一般的なパターンなど、公開情報を使って同じ市場の類似アプリとあなたのセットアップを比較します。競合他社の価格設定や構造は市場によって異なるため、この比較は国ごとに行われます。競合他社の価格情報は、App Storeなどのサードパーティおよび公開ソースから取得されており、指標分析で使用される匿名化されたAdatyネットワークデータとは別のものです。
このようにして、ランダムなアイデアではなく、あなたのアプリと似たアプリで実績のある戦略をテストできます。分析結果を見れば、自分のベンチマークと競合他社の価格を並べて比較できます。同じようなアプリが異なる価格設定や構造でより良い成果を上げているなら、同じアプローチが自分にも有効だというサインです。
:::tip
AI Growth Advisorは、実際に競合できるアプリを基準に、関連する競合他社を自動的に選択します。一般的には、差が大きすぎるアプリを追加するよりも、この提案に従うことをおすすめします。アプリが複数のカテゴリにまたがる場合は、最も関連性の高い市場セグメントに絞り込むようリストを調整するとよいでしょう。
:::
#### 業界ベンチマーク \{#industry-benchmarks\}
AI Growth Advisorは、Adaptyが追跡する20,000件のサブスクリプションアプリから収集した匿名化データを活用し、特定の国におけるカテゴリ平均との比較を提供します。データはネットワーク全体で集計されており、特定のアプリに紐づくことはありません。
たとえば、コンバージョンファネルやインストールあたりの収益を、同じカテゴリ・国のアプリの平均値と比較できます。これにより、自分のアプリが平均を下回っているのか、平均並みなのか、あるいはすでに上回っているのかを把握できます。
#### 地域市場データ \{#geographic-market-data\}
AI Growth Advisorは、Adaptyネットワーク全体の20,000以上のアプリから得られたパターンをもとに、個別の地域市場を分析し、地域別の価格調整によって収益を伸ばせる可能性のある市場を特定します。各国について、以下の項目を評価します:
- **コンバージョン率**:インストールから有料への転換率がグローバル平均と比べてどうか。高い場合は値上げの余地があることを示し、低い場合は価格への感度が高いことを示す可能性があります。
- **価格指数**:[Adapty Pricing Index](https://uploads.adapty.io/adapty_pricing_index.pdf) における各国の位置づけ。その国の住民の購買力を示します。
[ジオプライシングの提案](autopilot-growth-plan#geo-pricing-hypotheses)から A/B テストを作成することで、これらの推奨事項に基づいて行動できます。
## AI Growth Advisorが推奨事項を決定する仕組み \{#how-ai-growth-advisor-decides-what-to-recommend\}
AI Growth Advisorはペイウォールのコンバージョンを改善するための提案を生成します。これらの提案は、各変更の効果を確実に測定できるよう、1つずつ順番にテストできるよう設計されています。
AI Growth Advisorが提案を生成する仕組みは次のとおりです。
1. **最も大きな改善機会を見つける**
AI Growth Advisorは、あなたの価格設定・プロダクト・ファネルのパフォーマンスを分析し、業界のパターンや類似アプリと比較します。分析はメイン市場の通貨で行われるため(USDのみではなく)、価格の提案がサブスクライバーの実際の支払い通貨に合ったものになります。改善の余地が最も大きい部分——価格の調整、トライアルの追加、オファー構成の変更など——を特定します。
2. **次の実験を選択する**
各仮説は、既存のテスト履歴をもとに生成されます。AI Growth Advisorは、すでに実施した実験、勝者となった実験、まだ探索する価値がある方向性を把握しています。次の提案は、固定されたシーケンスに従うのではなく、前回の実験で明らかになった内容をもとに構築されます。
3. **勝者 vs. チャレンジャーのテストを実施する**
各実験の後、勝者が新しいベースラインになります。その結果が成長プランの次の推奨事項を形成します。AI Growth Advisorは効果のあったものを維持し、効果のなかったものを除外して、そこから次のテストを選択します。
4. **実用的に活用する**
AI Growth Advisorは、既存のプロダクトや設定、または新しいプロダクトの作成や価格調整といった小さな変更で実施できるテストのみを提案します。テストを素早く、管理しやすい状態に保つことが目的です。
5. **根拠を示す**
AI Growth Advisorは各レコメンデーションに対して、なぜそのテストを実施する価値があるのかを明確に説明する仮説を提示します。現在の指標が競合他社や業界平均と比較してどうか、どんな機会があるか、どの主要指標の改善が見込まれるかを確認できます。
これにより、実験が繰り返し可能なプロセスになり、各テストから得た知見をもとに、より効果的なペイウォールへと着実に近づいていけます。
## 各実験の後に起こること \{#what-happens-after-each-experiment\}
おすすめの実験が尽きることはありません。完了した各テストは、次の実験の土台となります。テストを続ける限り、AI Growth Advisor は次に試すべき施策を提案し続けます。
基礎となる市場データを更新するには、同じプレースメントで分析を再実行してください。再実行のたびに、競合他社の最新の価格情報、コンバージョンのベンチマーク、カテゴリのトレンドが取り込まれ、新たに特定された仮説がグロースプランに追加されます(既存のデータには影響しません)。既存のAI生成の仮説、カスタム仮説、進行中のA/B テストは、再実行後も保持されます。
ベースラインを最適化したら、さらに高度な競合との戦いに挑むこともできます。このような反復的なアプローチにより、アプリの成長や市場の変化に合わせて収益を最大化し続けることができます。
:::tip
試してみませんか?[AI Growth Advisor](autopilot-analysis) を使ってペイウォールを分析し、A/B テストを含む成長計画を作成しましょう。[内蔵ウィザード](autopilot-execute-plan) を使えば、複雑なテストをスムーズに開始できます。プロダクトの作成、ペイウォールの複製、セグメントの設定まで、ステップごとにガイドしてくれます。
:::
---
# File: autopilot-analysis
---
---
title: "ペイウォール・市場分析"
description: "アプリに合わせたデータドリブンな成長プランを生成します。"
---
この記事の手順に従って、AI グロースアドバイザーの分析を実行し、成長プランを生成してください。
対象のプレースメントに対してすでに成長プランを生成済みの場合、この分析では新しい仮説が生成され、そこから選択できます。
:::tip
分析を開始する前に、[分析の要件](autopilot#prerequisites)を満たしていることを確認してください。
:::
## ペイウォール分析 \{#paywall-analysis\}
### 分析するペイウォールを選択する \{#select-a-paywall-for-analysis\}
1. **AI Growth Advisor** ページを開き、[Get Growth plan](https://app.adapty.io/ab-tests/analysis/start) ボタンをクリックします。
2. **Paywall Diagnostic** ページで、ドロップダウンから **Placement** と **Paywall** を選択します。Adapty は収益の高いプレースメントとそのトップペイウォールをあらかじめ選択しています。別のペイウォールを分析する場合は、先にプレースメントを変更してください。
3. スクリーンショットをアップロードします。AI Growth Advisor がペイウォールのデザインとコンテンツを分析するために、スクリーンショットが必要です。
4. ペイウォールのアクティブなプロダクトを確認します。右側のプロダクトカードには、各プロダクトのサブスクリプション期間、価格、トライアル期間が表示されます。
5. **Confirm & Analyze** をクリックして進みます。Adapty がペイウォールを分析し、診断レポートを表示します。
### ペイウォール分析レポート \{#paywall-analysis-report\}
ペイウォールを選択してスクリーンショットをアップロードすると、Adapty はペイウォールの確立されたデザインパターンを分析し、優れた点と改善の余地がある点を明示します。
#### うまくいっている点 \{#whats-working-well\}
このセクションでは、コンバージョンを最大化する確立されたパターンのうち、あなたのペイウォールで活用できているものをハイライトします。例:目立つ割引バッジ、目を引くユーザーレビューセクション、わかりやすいサブスクリプションの内訳など。
#### ペイウォールの改善点 \{#what-to-fix-on-your-paywall\}
Adapty は推奨事項を次の 2 つのカテゴリに分類します。
- **ベンチマークに基づく推奨事項**: あなたのカテゴリでトップパフォーマンスを誇るアプリのデータに基づく提案です。各推奨事項にはベンチマーク統計(例:「上位の教育アプリの72%で使用されている」)と、変更内容の説明が含まれます。
- **ビジュアル分析の推奨事項**: ペイウォールのスクリーンショットをもとにAIが生成する提案です。コピーの改善、レイアウトの変更などが含まれます。
:::tip
[成長プラン](autopilot-growth-plan#view-the-growth-plan)には、ベンチマークの推奨事項に基づいた仮説が含まれます。視覚的な分析の提案は、手動でプランに追加できます。
:::
**Get Market Insights** をクリックして次に進みます。
## マーケットと競合分析 \{#market-and-competitor-analysis\}
:::note
マーケットと競合分析を行うには、先に[ペイウォール分析](#paywall-analysis)を完了する必要があります。
:::
Market Insights 分析では、アプリの価格設定とコンバージョン指標を競合他社や業界平均と比較します。比較は国ごとに行われます。ベンチマークとして、Adapty は同サブカテゴリー・同国の App Store アプリのデータを集計・分析します。このデータは他では公開されていません。
### 競合他社を選択する \{#select-competitors\}
比較対象として最大 5 社の競合他社を選択します。
Adapty が自動的に 5 社を選び、さらに 5 社を提案します。App Store のリンクを使って手動でアプリを追加することもできます。より精度の高い結果を得るには、自社より MRR が高いアプリを選択してください。
**Generate report** をクリックしてリストを確定し、分析が完了するまで待ちます。
### 国を選択する \{#select-a-country\}
Country ドロップダウンを使って、詳細分析の対象となるトップ国を 1 つ選択します。
### 収益の地域分布 \{#revenue-distribution\}
この収益分布チャートは、パーセンテージの内訳とともに、収益がどの国から得られているかを示します。上位 5 か国がハイライトされ、以降の分析はそれらを中心に行われます。
### 競合他社の価格設定 \{#competitor-pricing\}
競合他社の価格比較テーブルでは、[選択した国](#select-a-country)における競合他社のサブスクリプション価格とペイウォールの価格を比較します。サブスクリプション期間ごとに列が分かれています。
### コンバージョンファネル \{#conversion-funnel\}
このチャートは、Views-to-Trial、Trial-to-Paid、Views-to-Paid のコンバージョン率を、類似アプリの平均値と並べて表示します。
### 期間別収益分布 \{#revenue-distribution-by-duration\}
このチャートは、業界平均と比較して、どのサブスクリプション期間が収益に最も貢献しているかを示します。特定の期間に収益が偏っている場合、価格戦略の最適化の機会がある可能性があります。
### アクティベーション ARPU \{#activation-arpu\}
**Activation ARPU: your app vs. category** チャートは、新規インストールあたりの平均収益をカテゴリ平均と比較します。
[コンバージョンファネル](#conversion-funnel)と組み合わせて活用してください。
- コンバージョンは、課金ユーザーの割合を示します。
- アクティベーション ARPU は、ユーザーあたりの平均収益を示します。
コンバージョン率が高いのにアクティベーション ARPU が低い場合は、価格設定が低すぎる可能性があります。
この指標は**コホートベース**です。Adapty は過去 90 日間にインストールしたユーザーを対象に、そのユーザーが生んだ収益をユーザー数で割って算出します。
#### 他の指標との比較 \{#comparison-to-other-metrics\}
Activation ARPU は、ダッシュボードの他の箇所に表示される ARPU 値とは一致しません。各指標が測定する内容が異なるためです。
- **[ARPU アナリティクスチャート](arpu)**:古いコホートからの更新も含まれるため、Activation ARPU より数倍高い値になります。
- **[収益チャート](revenue)(Period フィルターを「Activation」に設定)**:各ユーザーの初回支払いのみをカウントします。90 日間のウィンドウ内でコホートが行った更新はカウントされません。
- **[コホート収益](analytics-cohorts)(90 日間)**:最も近い比較対象です。この指標を参考値として使用してください。
## 次のステップ \{#next-steps\}
[成長プランの実行](autopilot-execute-plan)を読んで、分析結果に基づいた A/B テストの実施方法を確認してください。
分析レポートはいつでも成長プランから確認できます。**Analysis Results** タブに切り替えてください。
---
# File: autopilot-growth-plan
---
---
title: "成長計画の管理"
description: "カスタム仮説の追加、アーカイブ、成長計画の更新を行います。"
---
[分析](autopilot-analysis)が完了すると、Adapty は成長計画(**実行可能な改善仮説**のリスト)を提示します。各項目には、新しい価格設定やデザイン改善の提案が含まれています。
仮説を[A/B テストで試してみる](autopilot-execute-plan)ために開きましょう。
各プレースメントにはそれぞれの成長計画があります。市場環境が変化したときは、分析を再実行して提案を更新できます。過去の実行結果はバージョン履歴に保存されます。
## 仮説 \{#hypotheses\}
成長プランの上部にあるタブを切り替えると、仮説をタイプ別にフィルタリングできます:
- **最優先** には、最も重要な仮説が含まれており、優先的に確認することをお勧めします。該当する仮説がない場合、このタブは非表示になります。
- **すべて** では、アクティブなプランのすべての仮説を表示します。
- **価格設定** 仮説では、新しい価格帯やトライアル設定を検討します。それぞれはペイウォール診断または市場インサイトレポートからの特定の推奨に基づいています。
- **ビジュアル** 仮説は、デザイン改善の提案です。コピー、レイアウト、その他のビジュアル要素の変更が含まれる場合があります。
- [**地域別価格設定**](#geo-pricing-hypotheses) 仮説では、国ごとの価格調整をテストします。
- [**アーカイブ済み**](#archive-a-hypothesis) 仮説は、アクティブなプランから削除した提案です。いつでも復元できます。
独自の仮説を[追加](#add-your-own-hypothesis)したり、テストしたくない仮説を[アーカイブ](#archive-a-hypothesis)したりすることができます。
これらの仮説は、任意の順序で1つずつテストしてください。地域別価格設定のテストは例外です。オーディエンスが重複しないため、並行して実行できます。
### 地域別価格設定の仮説 \{#geo-pricing-hypotheses\}
:::important
買い切り購入は地域別価格最適化の対象外です。
:::
**Geo-pricing** タブを開くと、地域別価格設定のレコメンデーション一覧が表示されます。各レコメンデーションは1つの国を対象とし、1つの価格変更として個別の A/B テストで実行されます。
Adapty は価格調整が必要な国を検出し、[Adapty Pricing Index](https://uploads.adapty.io/adapty_pricing_index.pdf) によって検証されたデータドリブンなレコメンデーションを提供します。
## ファネルチャートをステップごとに解説 \{#funnel-chart-step-by-step\}
チャート上でユーザーの行動を正しく読み取るために、ファネルの各要素を順番に確認していきましょう。
### インストール \{#installs\}
1列目(1)はインストール数を表します。インストールの総数(ユニークユーザーではなく)が絶対値(2)として表示され、以降のコンバージョン計算の基準となる100%として扱われます。ユーザーがアプリを削除して再インストールした場合は、2件のインストールとしてカウントされます。
隣のグレーのエリアはステップ間の遷移パラメーターを示します。次のステップ(ペイウォール表示)へのコンバージョン率がフラグ(3)に表示され、離脱率と絶対値のチャーン数がその下(4)に表示されます。
### ペイウォール表示 \{#paywall-displayed\}
2列目(5)は、選択した期間内に少なくとも1回ペイウォールを閲覧したアプリユーザー数(6)を表します。この期間内にインストールしたユーザーのみが対象です。ペイウォールの閲覧が選択期間内であっても、インストール日が範囲外の場合はカウントされません。
また、1ステップ目からの割合(7)も表示されます。この割合は1ステップ目のグレーのフラグ(3)と同じ値になりますが、これは最初の2ステップ間だけに成立する関係です。
このステップのデータは、`logShowFlow()`(iOS SDK v4+)/ `logShowPaywall()` メソッドを使用しているすべてのペイウォールから収集されます。そのため、[ドキュメント](present-remote-config-paywalls#track-paywall-view-events)に記載されているように、このメソッドを使ってすべてのペイウォール表示をAdaptyに送信してください。
2列目の隣にあるグレーのエリアは遷移を表します。次のステップ(トライアル)へのコンバージョン率がフラグ(8)に表示され、ペイウォール後の離脱率と絶対値のチャーン数がその下(9)に表示されます。
### トライアル \{#trials\}
3列目(10)は、選択した期間内にインストールしたユーザーがペイウォールで有効化したトライアル数(11)を表します。フィルターがトライアルなしのプロダクトに設定されている場合、この値はゼロになり、列は空になります。
1ステップ目からのトライアル割合も表示され、インストールからトライアルへのコンバージョン率(12)を確認できます。
この割合は前のステップのグレーのフラグ(8)と一致しないことに気づくでしょう。これは、チャート上部では現在の値を1ステップ目と比較し、グレーのフラグでは直前のステップと比較しているためです。
3列目の隣のグレーエリアは、次のステップ(有料)へのコンバージョン率をフラグ(13)で表示します。トライアル期間中の離脱率と絶対値のチャーン数がその下(14)に表示されます。
### サブスクリプションと更新 \{#subscriptions-and-renewals\}
4列目はアクティベートされたサブスクリプション数(15)を示します。トライアルなしのプロダクトはペイウォールからの直接サブスクリプションが含まれ、トライアルありのプロダクトはトライアルから有料サブスクリプションに転換した数が含まれます。両方のタイプがある場合は合算されます。
上部の割合はインストールからのコンバージョン(16)を示します。
グレーのフラグの割合は次のステップ(2期目への更新)へのコンバージョン(17)を示します。
2期目への更新前の離脱率と絶対値はコンバージョンの下(18)に表示されます。
このステップ以降は、同じ構造のステップが続きます。2回目の更新、3回目、4回目と続き、アプリの履歴データが十分あれば、水平スクロールで数十期分を確認できます。各ステップの見方は共通です。
- 上部にインストールからの割合、
- 下部に直前のステップからの割合、
- 上部に更新数の絶対値、
- 下部にチャーン数の絶対値、
- チャーン理由のポップアップ表示(ホバー時)。
### チャーンの理由 \{#churn-reasons\}
Adaptyはトライアルステージ以降の*チャーン*統計を詳細に表示します。あるステージに入ったが次のステージに進まなかったユーザーは、すべてチャーンとしてカウントされます。
* 特定のイベント(例:トライアルの期限切れや支払い問題)がコンバージョンの失敗を引き起こした場合、Adaptyはその理由を表示します。
* **unknown**ステータスは一時的な状態です。ユーザーが次のステージに進むために必要なイベントにまだ遭遇していないことを示します。
トライアルステージでは、通常はトライアルがまだ終了していないことを意味します。トライアルの解決には時間がかかるため、短い日付範囲や単日でファネルを確認する場合によく見られます。
ユーザーがコンバージョンするかトライアルをキャンセルした時点で、Adaptyが情報を更新します。
### テーブルビュー、フィルター、CSVエクスポート \{#table-view-filters-and-csv-export\}
ファネルチャートには数値データを扱いやすいテーブルが付属しています。
このテーブルはファネルと同じアプローチを踏まえつつ、一部変更が加えられています。
1回目の有料サブスクリプションのステップを除くすべてのステップのデータが列として表示されます。
その代わりに、「インストール → 有料」と「トライアル → 有料」の2つの列が用意されており、無料ユーザーが有料ユーザーになる核心的なコンバージョンポイントを示しています。
「インストール → 有料」列はトライアルなしのプロダクトのみ、「トライアル → 有料」列はトライアルありのプロダクトのみを示しているように見えるかもしれませんが、正確にはそうではありません。トライアルが期限切れになり、ユーザーがトライアルなしのように扱ってトライアルありのプロダクトを購入した場合も考慮されるためです。
数値をさらに深掘りしていくと、新たな仮説のための強力なフィルタリングツールが見つかります。
さまざまなディメンションで条件を自由に設定し、データに基づいた真のインサイトを得ましょう。
以下を組み合わせてみてください。
1. プロダクトタイプ(価格帯、期間など)
2. 期間。
3. 国別セグメンテーション。
4. トラフィックのアトリビューション。
5. ストア。
必要なデータだけを表示するために、絶対値 #、相対値 %、またはその両方を選択できます。
コントロールパネルの右側には、ファネルデータをCSVでエクスポートするボタンがあります。エクスポートしたファイルはExcelやGoogle スプレッドシートで開いたり、独自の分析システムにインポートしたりできます。
:::important
アプリが手数料減額プログラムに登録されている場合は、Adaptyにお知らせください。正確な計算のために、[アプリ設定](general)で[Small Business Program](app-store-small-business-program)および[Reduced Service Fee program](google-reduced-service-fee)のステータスを設定してください。
:::
---
# File: analytics-retention
---
---
title: "リテンション分析"
description: "ユーザーリテンション分析を理解し、サブスクリプション戦略を最適化する方法を説明します。"
---
リテンションチャートは、次のような疑問に答えるのに役立ちます。
1. アプリはユーザーを期間ごとにどのように維持しているか?
2. どのプロダクトがより魅力的で、継続率が高いか?
3. どのユーザーグループがより忠実か?
4. 成長のベンチマークとして使えるリテンションレベルはどのくらいか?
5. そして当然ながら、新規ユーザーの獲得ではなく、既存オーディエンスへの投資でコストを節約するにはどうすればよいか?
フィルターやグループを設定することで、ユーザー行動に関する貴重なインサイトが得られます。
リテンションは、SDK とストア通知から収集したデータをもとに算出されるため、追加の設定は不要です。
### リテンションの計算方法 \{#how-do-we-calculate-retention\}
リテンションチャートでは、ユーザー数がステップ(トライアル(「トライアルを表示」チェックボックスが有効な場合)、1回目の支払い、2回目の支払いなど)に応じてどう変化するかを確認できます。日付範囲を選択した際にカウントされるユーザーについて説明します。
例えば、カレンダーで過去3か月を選択し、「トライアルを表示」チェックボックスがオフの場合、過去3か月以内に初回サブスクリプションを開始したユーザーのみがカウントされます。「トライアルを表示」がオンで過去3か月を選択した場合は、その期間中にトライアルを開始したすべてのユーザーがカウントされます。これらのサブスクライバーについて、N番目のステップの絶対リテンションはN回目の支払いをしたユーザー数として表示され、N番目のステップの相対リテンションは、選択した期間内のサブスクリプション(またはトライアル)総数に対するN回目の支払い件数の割合として算出されます。
:::info
リテンションは遡って変化します
チャートを確認するタイミングに関わらず、選択した期間のベースライン(100%)は変わりません。一方、次の期間へのリテンションは時間とともに増加することがあります。
例えば、月次サブスクリプションの場合、12月1日〜31日に20件の初回購入があったとすると、ユーザーが通常通り、あるいは何らかの理由(グレース期間など)でやや遅れて次のサブスクリプション期間に移行するにつれ、2回目の期間へのリテンションは1月を通じて(場合によってはそれ以降も)増加していくことが想定されます。
:::
### 返金の取り扱い \{#refund-handling\}
返金はリテンションから**除外されません**。返金されたユーザーはリテンションカーブに残るため、同じコホートにおいて[アクティブサブスクリプション](active-subscriptions)や[収益](revenue)よりもリテンションが高く見える場合があります。
各指標での返金の扱いについては、[指標が返金イベントをどのように処理するか](refund-events#how-metrics-handle-refunds)を参照してください。
### リテンション活用のヒント \{#retention-opportunities\}
Adaptyのリテンション機能をより活用する方法を見ていきましょう。
数字への純粋な関心だけでなく、分析結果を実装したあとのビジネス価値を重視するなら、まず目的を明確にすることが大切です。チャート機能を深く理解することで、このデータが持つインパクトも見えてきます。
では、「なぜ」と「どのように」を一緒に整理していきましょう。
1 - オーディエンスへのアプローチ。
まず、リテンションはターゲットオーディエンス、その好み、そしてプロダクトが利用期間中に期待に応えているかどうかに関するものです。収益を生み出すビジネスの核心的な関係性を測る方法をお探しなら、リテンションがその答えです。
このような測定が有効なのは、一般的に既存顧客への販売は新規顧客への販売よりもコストが低いためです。その理由は2つあります。販売にかかる手間が少なく、平均単価が高いのです。そのため、リテンションが低下したときはサブスクライバーのロイヤルティに投資することが賢明な選択かもしれません。
2 - プロダクトへのアプローチ。
2つ目の理由として、リテンションチャートはプロダクトの実際の利用期間を示し、長期的な予測を可能にします。改善したい場合は、プロダクトを提供する施策を修正してその期間を延ばし、再度予測してビジネス目標に近づけましょう。こうした取り組みは、予測ルーティンと組み合わせた戦略的ビジョンの一部になり得ます。そして、絶えず変化する環境で同じ場所にとどまるために皆が全力で走り続けているように、このプロセスに終わりはありません。
3 - 市場へのアプローチ。
主要な競合他社より速く動くことは重要ですが、時には通常の競争から抜け出すことでより大きな成果が得られることもあります。異なる国やストアのユーザー行動を分析すると、地域特有の特性から優れたインサイトやビジネスの新たな機会が見えてくることがあります。文化的・市場的背景をリテンションの観点から分析し、セグメンテーションや今後の開発に活かすことができます。例えば、特定の地域でブルーオーシャンを見つけ、そこで急速に成長できるかもしれません。
リテンションデータの活用はもちろんこの基本的な解釈に限りませんが、素早く実際の価値を得たい場合の良いスタートになるでしょう。
### カーブ、テーブルビュー、フィルター、CSVエクスポート \{#curves-table-view-filters-and-csv-export\}
リテンションの目的と基本的な解釈について共通認識が持てたところで、これらを便利に使うためのツールを見ていきましょう。
Adaptyのリテンション機能の核となるのはチャートです。リテンションレベルが顧客のライフタイムのステップにどう依存するかを示します。
ステップは横軸に表示されます:トライアル、有料(1回目のサブスクリプション)、P2(2回目のサブスクリプション)、P3、P4など。
「トライアルを表示」チェックボックスが選択されている場合のみ、軸はトライアルステップから始まります。
データの計算において、このチェックボックスは次のように機能します。「トライアルを表示」が選択されていて軸がトライアルステップから始まる場合、トライアルを含むシナリオのみが表示され、インストールから直接行われたトランザクションは表示されません。また、「有料」ステップにはトライアルから移行したトランザクションのみが含まれます。「トライアルを表示」が選択されておらず軸が有料ステップから始まる場合、この最初のステップにはトライアルからのものとインストールから直接のものの両方を含む、すべての初回トランザクションが含まれます。
チャート上にマウスを乗せると、データのサマリーポップアップが表示されます。また、下のテーブルの列にマウスを乗せると、チャート上に関連データのサマリーポップアップが表示されます。
テーブルには、チャートで選択したグループとフィルターが同様に反映されます。
フィルターとグループを自由に組み合わせて高度な分析を行いましょう。データに基づいた真のインサイトを収集できます。
以下を組み合わせて活用してください:
1. プロダクトタイプ
2. 期間
3. 時間範囲
4. 国
5. トラフィックアトリビューション
6. ストア
「#絶対値」と「%相対値」コントロールを使って必要なデータを表示してください。
最後に、コントロールパネルの右側にはファネルデータをCSVにエクスポートするボタンがあります。ExcelやGoogleスプレッドシートで開いたり、独自の分析システムにインポートして、使いやすい環境で分析や予測を続けることができます。
:::warning
[Adapty General Settings](https://app.adapty.io/settings/general) で、アプリがSmall Business Programに含まれていることを必ず設定してください。
:::
---
# File: analytics-conversion
---
---
title: "コンバージョン分析"
description: "Adaptyのアナリティクスツールを使ってサブスクリプションのコンバージョン率を測定しましょう。"
---
ファネルが全体像を把握するためのもので、リテンションがユーザーロイヤルティに焦点を当てるものだとすれば、コンバージョン分析はユーザージャーニーの各重要ステップにおける効果を時系列で評価するためのものです。
コンバージョンは次のような疑問に答えます:
1. アプリのコンバージョンは時間とともにどのように変化しているか?季節的なトレンドはあるか?
2. マーケティング活動や新たな状況が発生した時点でコンバージョンはどう変化したか?
3. 異なる地域のユーザーはアプリのアップデートにどう反応しているか?
4. どのプロダクトタイプが時間とともによりコンバージョンしやすいか?
コンバージョンはAdapty SDKとストア通知から収集したデータをもとに行われるため、追加の設定は必要ありません。
## メインコントロールとチャート \{#main-controls-and-charts\}
収益は成功を測る定番の指標ですが、それは全体像の一部に過ぎません。異なるユーザー行動やライフサイクルステージ全体にわたって、ビジネスが時間とともにどのように推移しているかを把握することも同様に重要です。そこで役立つのがコンバージョン分析です。
フィルターやグループを設定することで、ユーザー行動についてより深いインサイトを得られます。トレンドを特定して分析するために、コンバージョンが日次・月次・年次でどのように推移しているかをモニタリングしましょう。
チャートの左側にはコンバージョンステップのコントロールがあります。ここで追跡したいコンバージョン(例:インストール → トライアル、トライアル → 有料、有料 → 更新)を選択できます。
各コンバージョン指標は次のロジックに従います:
- **X** を選択した日に開始ステートに入ったユーザー数(例:インストール数)とします。
- **Y** をそのユーザーのうち最終的にターゲットステートに到達したユーザー数(例:トライアル開始数)とします。
- コンバージョン率の計算式:**コンバージョン = (Y / X) × 100%**
:::note
チャートに表示される日付は、ユーザーが初期ステート(X)に入った時点、つまりコンバージョン対象となった瞬間に対応しています。
:::
各コンバージョンの説明と参考例を以下に示します。
### インストール → 有料 \{#install---paid\}
この指標は、特定の日にアプリをインストールしたユーザーのうち、最終的に初回サブスクリプションを購入した割合を示します。
**Predicted revenue** 列は、コホート作成後の選択した期間内に、サブスクライバーのコホートが生み出すと予測される総収益を示します。この値は、アプリの過去のコホートリテンションパターンをもとに、Adapty の予測モデルを使って算出されます。
**Predicted LTV** 列は、選択したコホートの各ユーザーの推定生涯価値を示します。この値は、予測収益をコホート内の予測課金ユーザー数で割ることで算出されます。
### 予測期間の選択 \{#select-the-horizon\}
予測期間を変更するには、**Predictions** ドロップダウンから値を選択してください。選択できるオプションは、コホート作成から 3・6・9・12・18・24 ヵ月後です。
### プロダクトでフィルタリング \{#filter-by-product\}
予測収益と LTV をプロダクト別にフィルタリングできます。デフォルトではすべての購入データをもとに予測が構築されます。プロダクトでフィルタリングすると、各プロダクトの貢献度を確認できます。
## 予測が利用できない場合 \{#when-predictions-are-unavailable\}
コホートの予測を生成できない場合、「Predicted Revenue(予測収益)」列と「Predicted LTV(予測LTV)」列には値の代わりにダッシュ(—)が表示されます。これはいくつかの理由で発生する可能性があります:
- **コホート作成からの時間が不足している**: 予測は、コホートが最初の更新期間を完了した後にのみ利用可能になります。週次サブスクリプションの場合は約1週間、月次サブスクリプションの場合は約4週間です。
- **コホートサイズが小さい**: 有料サブスクライバーの数が少なすぎるため、信頼性の高い予測を生成できません。
- **コホートの挙動が異常**: コホートがモデルの想定するパターンから大きく外れています。データが蓄積されるにつれて数週間後に解決する場合があります。
- **ホライズンを超過**: コホートが選択した予測ホライズンより古い。たとえば、3か月予測はコホートが3か月を経過すると非表示になり、12か月予測は12か月後に非表示になります。また、24か月を超えたコホートには予測が表示されません。
:::warning
予測を有効にする際は、収益とLTVの予測データがAdaptyダッシュボードに反映されるまで、最大24時間の遅延が発生する場合があることにご注意ください。
:::
---
# File: predictions-in-ab-tests
---
---
title: "A/B テストの予測"
description: "A/B テストの予測がサブスクリプション価格戦略の改善にどう役立つかを学びましょう。"
---
Adapty の A/B テスト機能における予測分析のドキュメントへようこそ。このツールは、実行中の A/B テストの将来の結果に関するインサイトを提供し、Adapty の ML ベースの予測でデータに基づいた意思決定を素早く行えるよう支援します 🚀
### A/B テストの予測とは? \{#what-are-ab-test-predictions\}
Adapty の A/B テスト予測は、高度な機械学習技術(勾配ブースティングモデル)を活用して、A/B テストで比較されるペイウォールの長期的な収益ポテンシャルを予測します。
この予測モデルにより、テスト実行中に観察できる指標だけに頼るのではなく、1 年後の予測収益に基づいて最も効果的なペイウォールを選択できます。これにより、データが蓄積されるのを何週間も待つことなく、より確実かつ迅速に勝者を決定できます。
### モデルはどのように機能するのか? \{#how-does-the-model-work\}
このモデルは、さまざまなカテゴリのアプリから収集した大量の A/B テスト履歴データで学習されています。実験開始から 1 年後にペイウォールが生み出す収益を予測するために、幅広い特徴量を組み込んでいます。これらの特徴量には以下が含まれます。
- 異なる期間にわたるユーザーのトランザクションとコンバージョン率
- ユーザーの地理的分布
- プラットフォームの利用状況(iOS または Android)
- オプトアウト率と返金率
- サブスクリプションプロダクトとその期間(日次・月次・年次など)
- その他のトランザクション関連データ
このモデルはペイウォールのトライアル期間も考慮しており、ユーザーがすでにコンバージョンしたかのように収益を予測するために、履歴のコンバージョン率を使用しています。アクティブなトライアルが将来的に収益をもたらす可能性についても考慮するため、トライアルオファーのあるペイウォールとないペイウォールを公平に比較できます。
### 予測 P2BB と通常の P2BB の違いは? \{#how-is-predicted-p2bb-different-from-just-the-p2bb\}
Adapty の A/B テストはベイズアプローチを採用しています。具体的には、ユーザーあたりの収益(「1,000 ユーザーあたりの収益」)の分布をモデル化し、一方の分布がもう一方よりも偶然ではなく「真に」優れている確率を計算します。これが「ベスト確率(P2BB)」と呼ばれるものです(詳細なアプローチについては[こちら](maths-behind-it)をご覧ください)。
重要な点として、この計算はテストが実行された期間中に蓄積された収益のみに基づいています。たとえば、年次サブスクリプションと週次サブスクリプションを比較するテストを実行する場合、どちらが優れているかを真に理解するまでに非常に長い時間がかかります。同様に、A/B テストでトライアルサブスクリプションと非トライアルサブスクリプションを比較する場合も同じ問題が起きます。勝者の動向を左右する可能性があるアクティブなトライアルが、収益の計算において常に考慮されないためです。
ここで予測モデルが活躍します。A/B テストの現在の収益分布を持ち、大規模なデータセットで学習されているこのモデルは、将来の収益分布(具体的には 1 年後)を予測できます。そして、その結果として「予測 P2BB」を算出します。これは、テストを 1 年間丸ごと実行した場合に得られるであろう P2BB です。
予測 P2BB が現在の P2BB と矛盾することがある点に注意してください。そのような場合、以下のようにバリアントの行が黄色でハイライト表示されます。
これは、勝者を確認するためにさらにデータを蓄積するか、A/B テストを深く掘り下げてその原因を調査すべきシグナルと考えています。一般的に、予測 P2BB はより多くのデータを考慮しているため、現在の P2BB よりも予測 P2BB を信頼することを推奨しますが、最終的な判断はもちろんユーザー自身に委ねられています。
### モデルの精度と確実性 \{#model-accuracy-and-certainty\}
このモデルは高い精度を実現しており、平均絶対誤差率(MAPE)は 10% をわずかに下回ります。この精度により、データに基づいた意思決定においてモデルの予測を自信を持って活用できます。
安定性をさらに確保するために、モデルは 3 つの要素に基づく「確実性」基準を採用しています。
- 予測区間が狭い — モデルが結果に高い確信を持っている
- テスト内のサブスクリプション数と収益が十分である
- テスト開始から少なくとも 2 週間が経過している
これら 3 つの基準のうち少なくとも 2 つが満たされた場合に、予測が信頼できるとみなされます。
新しい A/B テストが開始されると、モデルは各ペイウォールについて 1 年先の 1,000 ユーザーあたりの収益(A/B テストのメイン指標)の予測を提供します。予測は確実性基準を満たした場合のみ表示されます。データが不十分な場合、モデルは「予測に必要なデータが不足しています」と表示します。
### 制限事項と注意点 \{#limitations-and-considerations\}
予測モデルは強力なツールですが、その制限事項を理解しておくことが重要です。
モデルのパフォーマンスは、利用可能なデータの質と代表性に依存します。通常とは異なるコホートの挙動や、学習セットに含まれていない新しいアプリは、予測精度に影響を与える可能性があります。
それでも、予測は最新のデータとユーザー行動を反映するために毎日更新されます。これにより、受け取るインサイトが常に最新の情報に基づいていることが保証されます。
🚧 注意:このツールは、あなたの専門的な判断やアプリ独自のダイナミクスへの理解を補完するものであり、代替するものではありません。これらの予測は、他の指標や市場知識と組み合わせて活用し、情報に基づいた意思決定のためのガイドとしてご利用ください。
---
# File: adapty-ads-manager
---
---
title: "Adapty Ads Manager"
description: "Apple Adsのリアルタイム分析を取得し、キャンペーンを管理・最適化する"
---
**Adapty Ads Manager**は、Apple Ads キャンペーンをより効率的に管理・最適化・スケールするために設計されたオールインワンプラットフォームです。MMPなしで、インストール数、トライアル、サブスクリプション、ライフタイムバリューなどの主要な収益指標とApple Search Adsのパフォーマンスを連携させます。
リアルタイム分析、AIによる予測、スマートな自動化機能により、煩雑な手動での入札調整やスプレッドシート管理、手探りの試行錯誤を排除し、明確なインサイトと迅速なアクションを可能にするツールへと置き換えます。
Adapty Ads Manager で得られるもの:
- **[概要](ads-manager-overview)**: すべての主要指標を一目で確認 — 広告費、収益、ROAS、CPA など、それぞれの日次トレンドチャートとともに表示
- **[AI エージェント](ads-manager-ai-agent)**: 自然な言語で質問するだけで、ファネル全体の分析結果とレコメンデーションを取得
- **リアルタイムパフォーマンスデータ**: キャンペーン、広告グループ、キーワードを横断して確認
- **エンドツーエンドの収益トラッキング**: 検索 → インストール → トライアル → サブスクリプション → LTV まで一貫して追跡
- **AI 予測 & レコメンデーション**: 収益性の高いスケーリングを支援
- **一括管理**: 入札、予算、ステータス、構成を一括で操作
- **[ルールベースの自動化](ads-manager-automations)**: キーワードのライフサイクル全体を管理
- **[マーケットインテリジェンス](ads-manager-market-intelligence)**: 50 か国以上にわたる競合他社のキーワード戦略を分析
- **[CPP A/B テスト](ads-manager-cpp-ab-tests)**: カスタムプロダクトページを直接比較し、最良のパフォーマンスを発揮するページを特定
## ステップ 2. 広告プラットフォームを連携してトラッキングリンクを追加する \{#step-2-connect-your-ad-platform-and-add-tracking-links\}
Adapty はトラッキングリンクを使って、アプリのインストールとキャンペーンデータを紐付けます。
Adapty Attribution で計測したい広告キャンペーンには、必ずトラッキングリンクをリンク先 URL として設定してください。
複数の広告プラットフォームで広告を配信している場合は、プラットフォームごとに個別にトラッキングリンクを設定してください。
Adapty が広告プラットフォームと連携する方法は 2 つあります。
- **ネイティブ連携(Meta Ads、TikTok Ads)。** Adapty が広告プラットフォームに直接接続します。トラッキングリンクは自動的に生成され、キャンペーンパラメータはリンクの使用箇所に応じて動的に入力されます。異なるキャンペーン、広告セット、クリエイティブに同じリンクを使い回しても、Adapty が正しいキャンペーンデータと広告費を自動的に受け取ります。
- **トラッキングリンクのみ(その他すべての広告プラットフォーム)。** Adapty は広告プラットフォームに接続しません。トラッキングリンクは手動で作成し、リンク作成時にすべてのキャンペーンパラメーターを明示的に定義する必要があります。これらのプラットフォームでは広告費用データは利用できません。
3. ポリシーエディターに以下の JSON を貼り付け、`adapty-s3-integration-test` をご自身のバケット名に変更してください:
```json showLineNumbers title="Json"
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListObjectsInBucket",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
},
{
"Sid": "AllowAllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": [
"arn:aws:s3:::adapty-s3-integration-test/*",
"arn:aws:s3:::adapty-s3-integration-test"
]
},
{
"Sid": "AllowBucketLocation",
"Effect": "Allow",
"Action": "s3:GetBucketLocation",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
}
]
}
```
4. ポリシーの設定が完了したら、タグを追加することもできます(任意)。その後、**Next** をクリックして最終ステップに進みます。
5. このステップでは、ポリシーに名前を付けて、**Create policy** ボタンをクリックするだけで作成が完了します。
#### 1.2. IAM ユーザーを作成する \{#12-create-iam-user\}
Adapty アトリビューションがバケットへ生データレポートをアップロードできるようにするには、対象バケットへの書き込み権限を持つユーザーのアクセスキー ID とシークレットアクセスキーを提供する必要があります。
1. IAM コンソールに移動し、[Users セクション](https://console.aws.amazon.com/iamv2/home#/users)を選択します
2. **Add users** ボタンをクリックします
3. ユーザー名を入力し、**Access key – Programmatic access** を選択して、権限の設定に進みます
4. 次のステップでは、**Add user to group** オプションを選択し、**Create group** ボタンをクリックしてください。
5. 次に、User Groupに名前を付け、先ほど作成したポリシーを選択します
6. ポリシーを選択したら、**Create group** ボタンをクリックしてプロセスを完了します
7. グループの作成が完了したら、**それを選択**して次のステップに進んでください
8. このセクションの最後のステップですので、**Create User** ボタンをクリックして次に進んでください。
9. 最後に、認証情報を **.csv 形式でダウンロード**するか、ダッシュボードから直接コピー&ペーストすることができます。
### ステップ 2. Adapty Attribution でインテグレーションを設定する \{#step-2-configure-integration-in-adapty-attribution\}
1. [**Integrations** -> **Amazon S3**](https://app.adapty.io/ua/integrations/s3) に移動します。
2. **Export install events to Amazon S3** トグルをオンにします。
3. Amazon S3 と Adapty Attribution プロファイルの接続を構築するために、以下のフィールドを入力します。
| フィールド | 説明 |
|:-----------------------------| :----------------------------------------------------------- |
| **Access Key ID** | AWS サービスへのアクセスを認証するために使用される一意の識別子です。このIDはダウンロードした [csv ファイル](ua-amazon-s3#step-1-create-amazon-s3-credentials) に記載されています。 |
| **Secret Access Key** | Access Key ID と組み合わせて、AWS サービスへのアクセスを認証するために使用されるプライベートキーです。このキーはダウンロードした [csv ファイル](ua-amazon-s3#step-1-create-amazon-s3-credentials) に記載されています。 |
| **S3 Bucket Name** | AWS クラウド内の特定の S3 バケットを識別するグローバルに一意の名前です。S3 バケットはシンプルなストレージサービスで、ファイルや画像などのデータオブジェクトをクラウドに保存・取得できます。 |
| **Folder Inside the Bucker** | 選択した S3 バケット内に作成するフォルダーの名前です。S3 ではオブジェクトキープレフィックス(実質的にはフォルダー名)を使ってフォルダーを擬似的に表現していることにご注意ください。 |
| **Region**(オプション) | AWS マネジメントコンソールの IAM ユーザーアカウントからリージョンを確認してください。 |
## 手動データエクスポート \{#manual-data-export\}
Amazon S3 への自動イベントデータエクスポートに加えて、Adapty UA では手動ファイルエクスポート機能も提供しています。この機能を使用すると、ユーザー獲得データの特定の日付を選択して、S3 バケットに手動でエクスポートできます。これにより、エクスポートするデータとそのタイミングをより細かく制御できます。
## テーブル構造 \{#table-structure\}
AWS S3 インテグレーションでは、Adapty アトリビューションはインストールイベントの履歴データを保存するテーブルを提供します。このテーブルには、ユーザープロファイル、収益と手取り額、オリジンストアなど、さまざまなデータポイントの情報が含まれています。
:::warning
この構造は、Adapty または連携しているサードパーティによって新しいデータが追加されると、今後変更される可能性があります。処理するコードは、構造全体に依存せず、特定のフィールドに基づいて動作するよう堅牢に設計してください。
:::
イベントのテーブル構造は以下のとおりです:
| カラム | 説明 |
|--------------------------|-------------------------------------------|
| `adapty_profile_id` | Adaptyプロファイルの一意な識別子 |
| `install_id` | インストールの一意な識別子 |
| `created_at` | レコード作成タイムスタンプ(ISO 8601) |
| `installed_at` | アプリインストールタイムスタンプ(ISO 8601)|
| `store` | アプリストア(`ios`、`android`) |
| `country` | ユーザーの国コード(ISO 3166-1 alpha-2) |
| `ip_address` | クライアントIPアドレス |
| `idfa` | iOS広告識別子(IDFA) |
| `idfv` | iOSベンダー識別子(IDFV) |
| `gaid` | Google広告ID(Android) |
| `android_id` | AndroidデバイスID |
| `app_set_id` | Android App Set ID |
| `channel` | アトリビューションチャネル |
| `campaign_id` | キャンペーン識別子 |
| `campaign_name` | キャンペーン名 |
| `adset_id` | 広告セット識別子 |
| `adset_name` | 広告セット名 |
| `ad_id` | 広告識別子 |
| `ad_name` | 広告名 |
| `keyword_id` | キーワード識別子 |
| `keyword_name` | キーワード名 |
| `asa_org_id` | Apple Search Ads組織ID |
| `asa_keyword_match_type` | ASAキーワードマッチタイプ(`Exact`、`Broad`)|
| `asa_attribution` | ASAアトリビューションデータ(JSON文字列) |
| `asa_conversion_type` | ASAコンバージョンタイプ |
| `asa_country_or_region` | ASAの国またはリージョン |
| `asa_creative_set_name` | ASAクリエイティブセット名 |
| `fbclid` | FacebookクリックID |
| `ttclid` | TikTokクリックID |
| `utm_source` | UTMソースパラメータ |
| `utm_medium` | UTMメディアパラメータ |
| `utm_campaign` | UTMキャンペーンパラメータ |
| `utm_term` | UTMタームパラメータ |
| `utm_content` | UTMコンテンツパラメータ |
---
# File: ua-google-cloud-storage
---
---
title: "Adapty アトリビューションにおける Google Cloud Storage"
description: "Google Cloud Storage を Adapty アトリビューションと統合して、ユーザー獲得データを安全に保存しましょう。"
---
Adapty AttributionとGoogle Cloud Storageの連携により、ユーザー獲得キャンペーンデータを一か所に安全に保存できます。キャンペーンパフォーマンスデータ、アトリビューションデータ、ユーザー獲得イベントを.csvファイルとしてGoogle Cloud Storageバケットに保存できます。
この連携を設定するには、Google Cloud ConsoleとAdapty Attribution ダッシュボードでいくつかの簡単な手順を実行する必要があります。
:::note
スケジュール
Adapty Attributionは毎日UTC 4:00にGoogle Cloud Storageへデータを送信します。
各ファイルには、UTC基準で前日の1日分(カレンダーデー)に作成されたイベントのデータが含まれます。たとえば、3月8日 4:00 UTC に自動エクスポートされるデータには、3月7日の 00:00:00〜23:59:59 UTC に作成されたすべてのイベントが含まれます。
:::
## Google Cloud Storage 連携の設定方法 \{#how-to-set-up-google-cloud-storage-integration\}
### ステップ 1. Google Cloud Storage の認証情報を作成する \{#step-1-create-google-cloud-storage-credentials\}
このガイドでは、Google Cloud Platform コンソールで必要な認証情報を作成する手順を説明します。
Adapty Attribution が指定したバケットにローデータレポートをアップロードするには、サービスアカウントのキーと、対応するバケットへの書き込みアクセス権が必要です。サービスアカウントのキーを提供し、バケットへの書き込みアクセスを許可することで、Adapty Attribution がプラットフォームからストレージ環境へローデータレポートを安全かつ効率的に転送できるようになります。
:::warning
サービスアカウントのHMACキー認証のみをサポートしています。Google Cloud Storageへの適切なアクセスを有効にするため、サービスアカウントのHMACキーに「Storage Object Viewer」、「Storage Legacy Bucket Writer」、「Storage Object Creator」のロールが追加されていることを確認してください。
:::
#### 2.1. サービスアカウントの作成 \{#21-create-service-account\}
1. Google Cloudアカウントの[IAM](https://console.cloud.google.com/projectselector2/iam-admin/serviceaccounts)セクションに移動し、対象のプロジェクトを選択するか、新しいプロジェクトを作成します。
2. 次に、「+ CREATE SERVICE ACCOUNT」ボタンをクリックして、Adapty アトリビューション用の新しいサービスアカウントを作成します。
3. アクセス権限は後の手順で付与するため、最初のステップではフィールドに必要事項を入力してください。このページの詳細については、[こちら](https://docs.cloud.google.com/iam/docs/service-accounts-create)のドキュメントをご参照ください。
4. [プライベートJSONキー](https://docs.cloud.google.com/iam/docs/keys-create-delete)を作成してダウンロードするには、KEYSセクションに移動し、「ADD KEY」ボタンをクリックします
5. DETAILS セクションで、先ほど作成したサービスアカウントに紐づいている Email の値を見つけ、コピーしてください。この情報は、後続の手順でアカウントを認証し、バケットへの書き込みを許可するために必要になります。
#### 2.2. バケットの権限を設定する \{#22-configure-bucket-permissions\}
6. Google Cloud Storageの[Buckets](https://console.cloud.google.com/storage/browser)ページに移動し、既存のバケットを選択するか、Adapty アトリビューションのユーザー獲得データレポートを保存するための新しいバケットを作成します。
7. **PERMISSIONS**セクションに移動し、[アクセスを付与する](https://docs.cloud.google.com/identity/docs/how-to?hl=en)オプションを選択します。
8. PERMISSIONS セクションで、先ほど第5ステップで取得したサービスアカウントのメールアドレスを入力し、Storage Object Creator ロールを選択します
9. 最後に SAVE をクリックして変更を適用します
10. バケット名は後で使用するため、必ず控えておいてください。
11. これらの手順が完了すると、Google Cloud Console での必要なセットアップが完了です!最後のステップとして、バケット名を入力し、Adapty アトリビューションで使用するための JSON ファイルをダウンロードします。
### ステップ 2. Adapty Attribution でインテグレーションを設定する \{#step-2-configure-integration-in-adapty-attribution\}
1. [**Integrations** -> **Google Cloud Storage**](https://app.adapty.io/ua/integrations/google-cloud-storage) に移動します
2. **Export install events to Google Cloud Storage** トグルをオンにします
3. Google Cloud Storage と Adapty Attribution 間の接続を構築するために、必要なフィールドを入力します:
| フィールド | 説明 |
|:------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Google Cloud service account key file** | ダウンロードしたプライベート [JSON キーファイル](ua-google-cloud-storage#step-1-create-google-cloud-storage-credentials)。 |
| **Google Cloud bucket name** | データを保存する Google Cloud Storage 上のバケット名。Google Cloud Storage 環境内で一意である必要があり、スペースを含めることはできません。 |
| **Folder inside the bucket** | バケット内でデータを保存するフォルダ名。バケット内で一意である必要があり、データの整理に利用できます。このフィールドへの入力は任意です。 |
## 手動データエクスポート \{#manual-data-export\}
Google Cloud Storage への自動イベントデータエクスポートに加えて、Adapty UA は手動ファイルエクスポート機能も提供しています。この機能を使用すると、ユーザー獲得データの特定の日付を選択し、GCS バケットへ手動でエクスポートできます。エクスポートするデータとタイミングをより細かく制御できます。
## テーブル構造 \{#table-structure\}
Google Cloud Storage 連携では、Adapty アトリビューションがインストールイベントの履歴データを保存するテーブルを提供します。テーブルには、ユーザープロファイル、収益と手取り額、配信元ストアなどのデータが含まれます。
:::warning
この構造は、Adapty または連携している第三者サービスによる新しいデータの追加により、今後変更される可能性があります。この構造に依存するコードを作成する際は、特定のフィールドのみを参照するよう、堅牢な実装を心がけてください。
:::
イベントのテーブル構造は以下のとおりです。
| カラム | 説明 |
|--------------------------|-------------------------------------------|
| `adapty_profile_id` | Adapty プロファイルの一意識別子 |
| `install_id` | インストールの一意識別子 |
| `created_at` | レコード作成タイムスタンプ(ISO 8601) |
| `installed_at` | アプリインストールタイムスタンプ(ISO 8601) |
| `store` | アプリストア(`ios`、`android`) |
| `country` | ユーザーの国コード(ISO 3166-1 alpha-2) |
| `ip_address` | クライアント IP アドレス |
| `idfa` | iOS 広告識別子(IDFA) |
| `idfv` | iOS ベンダー識別子(IDFV) |
| `gaid` | Google 広告 ID(Android) |
| `android_id` | Android デバイス ID |
| `app_set_id` | Android App Set ID |
| `channel` | アトリビューションチャネル |
| `campaign_id` | キャンペーン識別子 |
| `campaign_name` | キャンペーン名 |
| `adset_id` | 広告セット識別子 |
| `adset_name` | 広告セット名 |
| `ad_id` | 広告識別子 |
| `ad_name` | 広告名 |
| `keyword_id` | キーワード識別子 |
| `keyword_name` | キーワード名 |
| `asa_org_id` | Apple Search Ads 組織 ID |
| `asa_keyword_match_type` | ASA キーワードマッチタイプ(`Exact`、`Broad`) |
| `asa_attribution` | ASA アトリビューションデータ(JSON 文字列) |
| `asa_conversion_type` | ASA コンバージョンタイプ |
| `asa_country_or_region` | ASA の国またはリージョン |
| `asa_creative_set_name` | ASA クリエイティブセット名 |
| `fbclid` | Facebook クリック ID |
| `ttclid` | TikTok クリック ID |
| `utm_source` | UTM source パラメータ |
| `utm_medium` | UTM medium パラメータ |
| `utm_campaign` | UTM campaign パラメータ |
| `utm_term` | UTM term パラメータ |
| `utm_content` | UTM content パラメータ |
---
# File: adapty-mail
---
---
title: "Adapty Mail"
description: "AI生成のメールキャンペーンで、トライアルユーザーを有料サブスクライバーに転換します。"
---
連携には、この連携を通じて送信されるすべてのイベントに影響する以下の設定オプションがあります:
| 設定 | 説明 |
|:--------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Reporting Proceeds** | 収益値の表示方法を選択します。App StoreおよびPlay Storeの手数料を差し引いた後の金額、または差し引く前の金額(グロス)を選択できます。「Send sales as proceeds」チェックボックスをオンにすると、App Store / Play Storeの手数料を差し引いた後のプロシーズとして売上が表示されます。 |
| **Send Trial Price** | チェックすると、Trial Startedイベントのサブスクリプション価格をAdaptyが送信します。 |
| **Exclude Historical Events** | ユーザーがAdapty SDKを含むアプリをインストールする前に発生したイベントを除外するオプションです。イベントの重複を防ぎ、正確なレポートを確保します。たとえば、ユーザーが1月10日に月額サブスクリプションを開始し、3月6日にAdapty SDKを含むアプリに更新した場合、Adaptyは3月6日より前のイベントを省略し、それ以降のイベントのみを保持します。 |
| **Report User's Currency** | 売上をユーザーの通貨で報告するか、米ドルで報告するかを選択します。 |
| **Send User Attributes** | 言語設定などのユーザー固有の属性を送信したい場合で、かつOneSignalプランが10タグ以上をサポートしている場合に選択します。このオプションを有効にすると、デフォルトの10タグを超える追加情報を含めることができます。タグの上限を超えるとエラーが発生する場合があります。 |
| **Send Attributions** | アトリビューション情報(例:AppsFlyerのアトリビューション)を送信して関連する詳細を受け取るには、このオプションを有効にします。 |
| **Send Play Store purchase token** | 必要に応じて購入を再検証するためのPlay Storeトークンを受け取るには、このオプションを有効にします。イベントに`play_store_purchase_token`パラメータが追加されます。 |
| **Delay events with future datetime** | **AppsFlyerおよびカスタムWebhookのみ**: 有効にすると、更新イベントとトライアルコンバージョンイベントが実際に発生した日付に送信されます。無効(デフォルト)の場合、これらのイベントは検出された時点で即座に送信されます(日付が未来であっても同様です)。 |
| **Data residency** | **MixpanelおよびAmplitudeのみ**: イベントが処理・保存される場所を決定するデータレジデンシーを選択します。 |
## イベントの設定 \{#configure-the-events\}
認証情報の下に、Adaptyから選択した連携プラットフォームに送信できる3つのグループのイベントがあります。必要なものをオンにしてください。
イベント名のカスタマイズは一部の連携で利用可能ですが、他の連携ではイベント名が固定されており変更できません。また、[Airbridge](airbridge#configure-events-and-tags)などの一部の連携では、1つのAdaptyイベントに複数のイベント名を関連付けることもできます。Adaptyが提供するイベントの全リストは[こちら](events)でご確認いただけます。
Adaptyのデフォルトのイベント名を使用することをお勧めしますが、特定の要件に合わせてイベント名を自由にカスタマイズすることも可能です。
---
# File: events
---
---
title: "サードパーティ連携に送信するイベント"
description: "Adaptyのアナリティクスツールを使って、主要なサブスクリプションイベントを追跡しましょう。"
---
Apple と Google は、[App Store Server Notifications](enable-app-store-server-notifications) と [Real-time Developer Notifications (RTDN)](enable-real-time-developer-notifications-rtdn) を通じてサブスクリプションイベントをサーバーに直接送信します。そのため、モバイルアプリがリアルタイムにアナリティクスシステムへイベントを送信することは難しい場合があります。たとえば、ユーザーがサブスクリプションを開始してもアプリを再度開かなかった場合、サーバーがなければ開発者はサブスクリプションのステータス更新を受け取れません。
Adapty はこのギャップを埋めるため、サブスクリプションデータを収集して人間が読みやすいイベントに変換します。これらの連携イベントは JSON 形式で送信されます。すべてのイベントは同じ構造を持ちますが、イベントの種類・ストア・設定内容によってフィールドが異なります。各イベントに含まれる正確なフィールドは、それぞれの連携ページで確認できます。
イベントが正常に処理されたかどうか、あるいは問題が発生したかどうかを判断する方法については、[イベントステータス](event-statuses)ページをご覧ください。
## イベントの種類 \{#event-types\}
ほとんどのイベントは、有効化されているすべての連携に作成・送信されます。ただし、**Access level updated** イベントは、[webhook 連携](webhook)が設定されていてこのイベントが有効になっている場合にのみ発火します。このイベントは [Event Feed](https://app.adapty.io/event-feed) に表示され、webhook にも送信されますが、他の連携には共有されません。
webhook 連携が設定されていない場合、またはこのイベントタイプが有効になっていない場合、**Access level updated** イベントは作成されず、[Event Feed](https://app.adapty.io/event-feed) にも表示されません。
| イベント名 | 説明 |
|:-----------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| subscription_started | トライアル期間なしで有料サブスクリプションを開始したとき(つまり即座に課金されたとき)にトリガーされます。 |
| subscription_renewed | サブスクリプションが更新され、ユーザーに課金されたときに発生します。このイベントはトライアルあり・なしを問わず、2回目以降の請求から記録されます。 |
| subscription_renewal_cancelled | ユーザーがサブスクリプションの自動更新をオフにしました。有料サブスクリプション期間が終了するまでプレミアム機能へのアクセスは継続されます。 |
| subscription_renewal_reactivated | ユーザーがサブスクリプションの自動更新を再度有効にしたときにトリガーされます。 |
| subscription_expired | キャンセルされたサブスクリプションが完全に終了したときにトリガーされます。たとえば、12月12日にサブスクリプションをキャンセルしても12月31日まで有効な場合、イベントは12月31日に記録されます。 |
| subscription_paused | ユーザーが[サブスクリプションの一時停止](https://developer.android.com/google/play/billing/lifecycle/subscriptions#pause)を有効にしたときに発生します(Android のみ)。 |
| subscription_deferred | サブスクリプションの購入が[延期](https://adapty.io/glossary/subscription-purchase-deferral/)され、ユーザーが支払いを先送りしながらプレミアム機能へのアクセスを維持できる場合にトリガーされます。この機能は Google Play Developer API を通じて利用可能で、無料トライアルや支払いが困難なユーザーへの対応に活用できます。 |
| non_subscription_purchase | 永続アクセスやゲーム内コインなどの消耗型アイテムといった、サブスクリプション以外のすべての購入。 |
| trial_started | ユーザーがトライアルサブスクリプションを開始したときにトリガーされます。 |
| trial_converted | トライアルが終了してユーザーに課金されたとき(初回購入)に発生します。たとえば、1月14日までトライアル期間があるにもかかわらず1月7日に課金された場合、イベントは1月7日に記録されます。 |
| trial_renewal_cancelled | トライアル期間中にユーザーがサブスクリプションの自動更新をオフにしました。トライアルが終了するまでプレミアム機能へのアクセスは継続されますが、課金やサブスクリプションの開始は行われません。 |
| trial_renewal_reactivated | トライアル期間中にユーザーがサブスクリプションの自動更新を再度有効にしたときに発生します。 |
| trial_expired | サブスクリプションに転換されずにトライアルが終了したときにトリガーされます。 |
| entered_grace_period | 支払い試行が失敗し、ユーザーがグレース期間(有効な場合)に入ったときに発生します。この期間中もユーザーはプレミアム機能にアクセスできます。 |
| billing_issue_detected | 課金試行中に請求エラーが発生したとき(例:カード残高不足)にトリガーされます。 |
| subscription_refunded | サブスクリプションが返金されたとき(例:Apple サポートによる返金)にトリガーされます。 |
| non_subscription_purchase_refunded | サブスクリプション以外の購入が返金されたときにトリガーされます。 |
| access_level_updated | ユーザーのアクセスレベルが更新されたときに発生します。 |
上記のイベントは、購入に関するユーザーの状態を完全にカバーしています。いくつかの例を見てみましょう。
### 例 1 \{#example-1\}
_ユーザーが4月1日に7日間のトライアル付き月次サブスクリプションを開始し、4日目に解約した。_
この場合、以下のイベントが送信されます:
1. `trial_started`:4月1日
2. `trial_renewal_cancelled`:4月4日
3. `trial_expired`:4月7日
### 例 2 \{#example-2\}
_ユーザーが4月1日に7日間のトライアル付き月次サブスクリプションを開始し、10日目に解約した。_
この場合、以下のイベントが送信されます:
1. `trial_started`:4月1日
2. `trial_converted`:4月7日
3. `subscription_renewal_cancelled`:4月10日
4. `subscription_expired`:5月1日
各シナリオでどのイベントが発火するかの詳細については、[イベントフロー](event-flows)をご確認ください。
---
# File: event-flows
---
---
title: "イベントフロー"
description: "Adaptyのサブスクリプションイベントフローの詳細スキームを確認しましょう。サブスクリプションイベントの生成方法やインテグレーションへの送信方法を学び、顧客ジャーニーの重要な瞬間を追跡するのに役立てましょう。"
---
Adaptyでは、アプリ内での顧客のジャーニーを通じてさまざまなサブスクリプションイベントを受け取ります。これらのサブスクリプションフローは、ユーザーがサブスクリプションを開始・キャンセル・再有効化する際にAdaptyが生成するイベントを理解するための一般的なシナリオを示しています。
Appleはサブスクリプションの実際の開始・更新時間より数時間前に支払い処理を行います。以下のフローでは、図をわかりやすくするために、サブスクリプションの開始・更新と課金が同時に発生するように示しています。
また、同じアクションに関連するイベントは同時に発生するため、図に示した順序とは異なる順序で **Event Feed** に表示される場合があります。
## サブスクリプションのライフサイクル \{#subscription-lifecycle\}
### 初回購入フロー \{#initial-purchase-flow\}
このフローは、顧客がトライアルなしで初めてサブスクリプションを購入したときに発生します。この場合、以下のイベントが生成されます:
- **Subscription started**
- **Access level updated**:ユーザーへのアクセス付与
サブスクリプションの更新日が来ると、サブスクリプションが更新されます。この場合、以下のイベントが生成されます:
- **Subscription renewal**:サブスクリプションの新しい期間の開始
- **Access level updated**:サブスクリプションの有効期限を更新し、さらに1期間のアクセスを延長
支払いが成功しない場合やユーザーが更新をキャンセルした場合については、それぞれ [請求問題の結果フロー](event-flows#billing-issue-outcome-flow) と [サブスクリプションキャンセルフロー](event-flows#subscription-cancellation-flow) をご参照ください。
### サブスクリプションキャンセルフロー \{#subscription-cancellation-flow\}
ユーザーがサブスクリプションをキャンセルすると、以下のイベントが生成されます:
- **Subscription renewal canceled**:現在の期間が終了するまでサブスクリプションが有効であり、その後ユーザーはアクセスを失うことを示す
- **Access level updated**:アクセスの自動更新を無効化
サブスクリプションが終了すると、**Subscription expired (churned)** イベントがトリガーされ、サブスクリプションの終了を示します。
返金が承認された場合、**Subscription expired (churned)** の代わりに以下のイベントが生成されます:
- **Subscription refunded**:サブスクリプションを終了し、返金の詳細を提供
Stripeでは、残りの期間をスキップしてサブスクリプションを即時キャンセルすることができます。この場合、すべてのイベントが同時に生成されます:
- **Subscription renewal cancelled**
- **Subscription expired (churned)**
- **Access Level updated**:ユーザーのアクセスを削除
返金が承認された場合、承認時に **Subscription refunded** イベントも発生します。
### サブスクリプション再有効化フロー \{#subscription-reactivation-flow\}
ユーザーがサブスクリプションをキャンセルして期限切れになり、その後同じサブスクリプションを再購入した場合、**Subscription renewed** イベントが生成されます。アクセスが途切れた場合でも、Adaptyは `vendor_original_transaction_id` によってリンクされた単一のトランザクションチェーンとして扱います。そのため、再購入は更新とみなされます。
**Access level updated** イベントは2回生成されます:
- サブスクリプション終了時にユーザーのアクセスを取り消すとき
- サブスクリプション再購入時にアクセスを付与するとき
### サブスクリプション一時停止フロー(Androidのみ) \{#subscription-pause-flow-android-only\}
このフローは、ユーザーがAndroidでサブスクリプションを一時停止し、後で再開する場合に適用されます。
サブスクリプションの一時停止には遅延効果があります。ユーザーが更新前にサブスクリプションを一時停止した場合、サブスクリプションは有効なままで、ユーザーは請求期間の残り期間中、有料アクセスを維持します。
1. ユーザーがサブスクリプションを一時停止すると、**Subscription paused (Android only)** イベントがトリガーされます。
2. サブスクリプション期間終了時に、Adaptyは **Access level updated** イベントをトリガーしてユーザーのアクセスを取り消します。
3. ユーザーがサブスクリプションを再開すると、以下のイベントがトリガーされます:
- **Subscription renewed**
- **Access level updated**:ユーザーのアクセスを復元
これらのサブスクリプションは、同じ **vendor_original_transaction_id** でリンクされた同一のトランザクションチェーンに属します。
## トライアルフロー \{#trial-flows\}
アプリでトライアルを使用している場合、トライアル関連の追加イベントが発生します。
### 変換成功のトライアルフロー \{#trial-with-successful-conversion-flow\}
最も一般的なフローは、ユーザーがトライアルを開始し、クレジットカードを登録して、トライアル期間終了時に通常のサブスクリプションへ正常に変換される場合です。この場合、トライアル開始時に以下のイベントが生成されます:
- **Trial started**:トライアル開始を示す
- **Access level updated**:アクセスを付与
通常のサブスクリプションが開始されると **Trial converted** イベントが生成されます。
### 変換失敗のトライアルフロー \{#trial-without-successful-conversion-flow\}
ユーザーがトライアルをサブスクリプションに変換する前にキャンセルした場合、キャンセル時に以下のイベントが生成されます:
- **Trial renewal cancelled**:トライアルからサブスクリプションへの自動変換を無効化
- **Access level updated**:アクセス更新を無効化
ユーザーはトライアル終了まで引き続きアクセスでき、トライアルの終了を示す **Trial expired** イベントが生成されます。
### 期限切れトライアル後のサブスクリプション再有効化フロー \{#subscription-reactivation-after-expired-trial-flow\}
トライアルが(請求の問題またはキャンセルにより)期限切れになり、ユーザーが後でサブスクリプションを購入した場合、以下のイベントが生成されます:
- **Access level updated**:ユーザーへのアクセス付与
- **Trial converted**
トライアルとサブスクリプションの間に空白期間があっても、Adaptyは `vendor_original_transaction_id` を使って両者をリンクします。この変換は、ゼロ価格のトライアルから始まる継続的なトランザクションチェーンの一部として扱われます。そのため、**Subscription started** ではなく **Trial converted** イベントが生成されます。
## プロダクトの変更 \{#product-changes\}
このセクションでは、アップグレード、ダウングレード、別グループのプロダクトの購入など、アクティブなサブスクリプションに加えられた変更について説明します。
### 即時プロダクト変更フロー \{#immediate-product-change-flow\}
ユーザーがプロダクトを変更した後、サブスクリプション終了前にシステムで即時変更が適用される場合があります(主にアップグレードまたはプロダクトの置き換えの場合)。この場合、プロダクト変更時に以下のイベントが生成されます:
- アクセスレベルが変更され、2つの **Access level updated** イベントが生成されます:
1. 最初のプロダクトへのアクセスを削除
2. 2番目のプロダクトへのアクセスを付与
- 古いサブスクリプションが終了し、返金が行われます(**Subscription refunded** イベントが `cancellation_reason` = `upgraded` で生成されます)。**Subscription expired (churned)** イベントは生成されず、**Subscription refunded** イベントに置き換えられます。
- 新しいサブスクリプションが開始されます(新しいプロダクトの **Subscription started** イベントが生成されます)。
ユーザーがサブスクリプションをダウングレードした場合、最初のサブスクリプションは有料期間の終了まで継続し、終了時に新しい下位プランのサブスクリプションに置き換えられます。この場合、アクセスの自動更新を無効化する **Access level updated** イベントのみが即時に生成されます。その他のイベントはサブスクリプションが実際に置き換えられる時点で生成されます:
- 別の **Access level updated** イベントが生成され、2番目のプロダクトへのアクセスを付与
- **Subscription expired (churned)** イベントが生成され、最初のプロダクトのサブスクリプションを終了
- **Subscription started** イベントが生成され、新しいプロダクトの新しいサブスクリプションを開始
### 遅延プロダクト変更フロー \{#delayed-product-change-flow\}
サブスクリプション更新時にプロダクトを変更するバリアントもあります。このバリアントは前のケースと非常に似ており、古いプロダクトのアクセス自動更新を無効化する **Access level updated** イベントが1つ即時に生成されます。その他のイベントはユーザーがサブスクリプションを変更してシステムで反映される時点で生成されます:
- 別の **Access level updated** イベントが生成され、2番目のプロダクトへのアクセスを付与
- **Subscription expired (churned)** イベントが生成され、最初のプロダクトのサブスクリプションを終了
- **Subscription started** イベントが生成され、新しいプロダクトの新しいサブスクリプションを開始
## 請求問題の結果フロー \{#billing-issue-outcome-flow\}
トライアルの変換またはサブスクリプションの更新が請求問題により失敗した場合、次の動作はグレース期間が有効かどうかによって異なります。
グレース期間が設定されている場合、支払いが成功すればトライアルが変換されるかサブスクリプションが更新されます。失敗した場合、アプリストアはユーザーへの課金を繰り返し試み、それでも失敗するとアプリストアがトライアルまたはサブスクリプションを終了します。
したがって、請求問題が発生した時点でAdaptyに以下のイベントが生成されます:
- **Billing issue detected**
- **Entered grace period**(グレース期間が有効な場合)
- **Access level updated**:グレース期間終了までのアクセスを提供
後で支払いが成功した場合、Adaptyは **Trial converted** または **Subscription renewed** イベントを記録し、ユーザーはアクセスを失いません。
最終的に支払いが失敗してアプリストアがサブスクリプションをキャンセルした場合、Adaptyは以下のイベントを生成します:
- **Trial expired** または **Subscription expired (churned)**(`cancellation_reason: billing_error` 付き)
- **Access level updated**:ユーザーのアクセスを取り消す
グレース期間なしの場合、請求再試行期間(アプリストアがユーザーへの課金を繰り返し試みる期間)が即時に開始されます。
グレース期間終了まで支払いが成功しない場合のフローは同じで、アプリストアがサブスクリプションを自動終了したときに同じイベントが生成されます:
- **Trial expired** または **Subscription expired (churned)**(`cancellation_reason` が `billing_error` のもの)
- **Access level updated**:ユーザーのアクセスを取り消す
## ユーザーアカウント間での購入共有フロー \{#sharing-purchases-across-user-accounts-flows\}
このシナリオで生成されるイベントにおける、アクセスレベルの割り当てと移行に関連するフィールドの内訳は以下の通りです:
- **ユーザーA:Access level updated(ユーザーAがアプリでサブスクリプションを購入したときに送信)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": UserA,
"event_properties": {
"profile_has_access_level": true,
},
"profiles_sharing_access_level": null
}
```
- **ユーザーA:Access level updated(アプリが再インストールされてユーザーBがログインし、ユーザーAのアクセスが取り消されたときに送信)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": UserA,
"event_properties": {
"profile_has_access_level": false,
},
"profiles_sharing_access_level": null
}
```
- **ユーザーB:Access level updated(ユーザーBがログインしてアクセスが付与されたときに送信)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000001",
"customer_user_id": UserB,
"event_properties": {
"profile_has_access_level": true,
},
"profiles_sharing_access_level": null
}
```
### ユーザー間でのアクセス共有フロー \{#shared-access-between-users-flow\}
このオプションでは、デバイスが同じApple/Google IDでサインインしている場合、複数のユーザーが同じアクセスレベルを共有できます。これは、ユーザーがアプリを再インストールして別のメールアドレスでログインした場合でも、以前の購入へのアクセスを維持できるため便利です。このオプションでは、複数の識別済みユーザーが同じアクセスレベルを共有できます。アクセスレベルを共有している間、すべてのトランザクションは完全なトランザクション履歴とアナリティクスを維持するために、元の
このシナリオで生成されるイベントにおける、アクセスレベルの割り当てと共有に関連するフィールドの内訳は以下の通りです:
**ユーザーB:Access level updated(ユーザーBがログインしてアクセスが付与されたときに送信)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": UserA,
"event_properties": {
"profile_has_access_level": true,
},
"profiles_sharing_access_level": [
{
"profile_id": "00000000-0000-0000-0000-000000000001,
"customer_user_id": UserB
}
]
}
```
### ユーザー間でアクセスを共有しないフロー \{#access-not-shared-between-users-flow\}
このオプションでは、最初にアクセスレベルを取得したユーザープロファイルのみが永続的にそれを保持します。購入を単一の
---
# File: event-statuses
---
---
title: "インテグレーションイベントのステータス"
description: ""
---
Adapty は HTTP ステータスコードに基づいて配信可否を判定し、`200-399` の範囲外のレスポンスはすべて失敗として扱います。
インテグレーションイベントのステータスは、Adapty ダッシュボードの **Event List** で確認できます。特定のイベントタイプが特定のインテグレーションで有効になっているかどうかに関わらず、すべての有効なインテグレーションのステータスが表示されます。
- 黒: イベントが正常に送信されました。
- グレー: このインテグレーションではイベントタイプが無効になっています。
- 赤: インテグレーションに対応が必要な問題があります。
失敗したイベントの詳細を確認するには、インテグレーション名にカーソルを合わせると、具体的なエラー情報がツールチップで表示されます。
**Event Feed** は、パフォーマンスを最適化するために過去2週間分のデータを表示します。この制限によりページの読み込み速度が向上し、ユーザーがイベントをスムーズに確認・分析できます。
---
# File: adjust
---
---
title: "Adjust"
description: "Adjustをアダプティに接続して、サブスクリプションのトラッキングと分析を改善します。"
---
[Adjust](https://www.adjust.com/) は、マーケティングキャンペーンのデータを収集・提供する主要なMMP(モバイル計測パートナー)プラットフォームの一つです。企業はこれを活用してキャンペーンのパフォーマンスを把握できます。
Adaptyは、ストアからのサブスクリプションイベントを一か所で追跡できる完全なデータセットを提供します。Adaptyを使えば、ユーザーの行動を把握し、好みを理解した上で、ターゲットを絞った効果的なコミュニケーションが可能になります。このインテグレーションにより、Adjustでサブスクリプションイベントを追跡し、キャンペーンが生み出す収益を正確に分析できます。
AdaptiとAdjustのインテグレーションは、主に2つの方法で機能します。
1. **AdaptiがAdjustからアトリビューションデータを受け取る**
Adjustインテグレーションを設定すると、AdaptiはAdjustからアトリビューションデータを受け取り始めます。このデータはユーザーのプロファイルページで簡単に確認できます。
2. **AdaptiがサブスクリプションイベントをAdjustに送信する**
Adaptyは、インテグレーションで設定したすべてのサブスクリプションイベントをAdjustに送信できます。これにより、Adjustのダッシュボードでこれらのイベントを追跡できます。このインテグレーションは、広告キャンペーンの効果測定に役立ちます。
## インテグレーションの設定 \{#set-up-integration\}
### AdaptiをAdjustに接続する \{#connect-adapty-to-adjust\}
1. Adapty ダッシュボードを開き、[Integrations > Adjust](https://app.adapty.io/integrations/adjust) に移動します。
2. ページ上部のトグルをオンにします。
3. フィールドに入力し、アクセス認証情報を設定します。
3. AdjustプラットフォームでOAuth認証を有効にしている場合は、iOSおよびAndroidアプリのインテグレーション中に**OAuth Token**を提供することが必須です。
4. 次に、iOSおよびAndroidアプリの**app token**を入力します。Adjustのダッシュボードを開くと、登録済みのアプリが表示されます。
:::note
iOSとAndroidで異なるAdjustアプリケーションを使用している場合があるため、Adaptyにはそれぞれ独立したセクションが用意されています。Adjustアプリが1つだけの場合は、同じ情報を両方に入力してください。
:::
5. リストからアプリを選択し、**App Token**をコピーします。トークンをAdaptyダッシュボードの対応するフィールドに貼り付けます。
### イベントとタグの設定 \{#configure-events-and-tags\}
Adjustは他のプラットフォームとは少し異なる仕組みで動作します。Adjustのダッシュボードでイベントを手動で作成し、イベントトークンを取得して、Adaptyの対応するイベントに貼り付ける必要があります。
最初のステップは、Adaptyに送信したいすべてのイベントのイベントトークンを確認することです。手順は以下のとおりです:
1. Adjustのダッシュボードでアプリを開き、**Events**タブに切り替えます。
1. イベントトークンをコピーしてAdaptiに貼り付けます。認証情報の下には、AdaptiからAdjustに送信できるイベントが3つのグループに分かれて表示されます。Adaptyが提供するイベントの全リストは[こちら](events)で確認できます。
Adaptyはサーバー間インテグレーションを使用してサブスクリプションイベントをAdjustに送信するため、Adjustのダッシュボードですべてのサブスクリプションイベントを確認し、それらを広告獲得キャンペーンに関連付けることができます。
:::important
以下の点にご注意ください:
- Adjustは58日以上前のイベントをサポートしていません。58日を超えるイベントはAdaptiからAdjustに送信されますが、イベントの日時は現在のタイムスタンプに置き換えられます。
- AdjustはIPv6をサポートしていません。**App settings**またはSDKのアクティベーション時にSDKでのIP収集を無効にした場合、バックエンドのIPv6のみが送信され、トラッキングが失敗する可能性があります。IPv4が使用されるよう、SDKのIP収集は有効のままにしておいてください。
:::
### アプリをAdjustに接続する \{#connect-your-app-to-adjust\}
上記の手順が完了したら、以下の2つのメソッドをアプリに追加します。これらはアプリとAdjust間の通信を確立します:
1. **サブスクリプションデータをAdjustに送信する**: Adjustのデバイス IDを`setIntegrationIdentifier()` SDKメソッドに渡します。
2. **Adjustからアトリビューションデータを受け取る**: `updateAttribution()` SDKメソッドでアトリビューションデータを更新します。
Adjustバージョン5.0以降では、以下の例を使用してください:
どちらもAirbridgeダッシュボードの [Third-party Integrations > Adapty](https://app.airbridge.io/app/testad/integrations/third-party/adapty) セクションで確認できます。
Adapty APIトークンフィールドはAdaptyバックエンドで事前に生成されています。Adapty APIトークンの値をコピーし、AirbridgeダッシュボードのAdapty Authorization Tokenフィールドに貼り付けてください。
### イベントとタグの設定 \{#configure-events-and-tags\}
認証情報の下には、AdaptyからAirbridgeに送信できる3グループのイベントがあります。
必要なものをオンにするだけです。
### アプリをAirbridgeに接続する \{#connect-your-app-to-airbridge\}
連携のために、以下の例のように `airbridge_device_id` をプロファイルビルダーに渡し、`setIntegrationIdentifier` を呼び出してください。
## 連携の設定 \{#set-up-integration\}
### AdServicesフレームワークをAdaptyに接続する \{#connect-adapty-to-the-adservices-framework\}
[AdServices](https://developer.apple.com/documentation/adservices)を使ったApple Adsは、Adapty ダッシュボードでの設定が必要です。また、アプリ側での有効化も必要です。AdServicesフレームワークを使ってAdapty経由でApple Adsを設定するには、以下の手順に従ってください。
#### ステップ1:公開鍵を取得する \{#step-1-obtain-public-key\}
Adapty ダッシュボードで[Settings -> Apple Ads](https://app.adapty.io/settings/apple-search-ads)に移動します。
あらかじめ生成された公開鍵(Adaptyがキーペアを提供します)を見つけてコピーします。
:::note
Apple Ads のアトリビューションに別のサービスや独自のソリューションを使用している場合は、独自のプライベートキーをアップロードできます。
:::
#### ステップ 2: Apple Ads でユーザー管理を設定する \{#step-2-configure-user-management-on-apple-ads\}
[Apple Ads アカウント](https://ads.apple.com/app-store)で **Settings > User Management** ページに移動します。Adapty がアトリビューションデータを取得するには、別の Apple ID アカウントを招待し、API Account Manager のアクセス権を付与する必要があります。既存のアカウントを使用することも、この目的専用に新しいアカウントを作成することもできます。重要なのは、その Apple ID で Apple Ads にログインできる必要があるという点です。
#### ステップ 3: API 認証情報を生成する \{#step-3-generate-api-credentials\}
次に、Apple Ads に新しく追加したアカウントでログインします。Apple Ads の画面で Settings -> API に移動し、先ほどコピーした公開鍵を所定のフィールドに貼り付けて、新しい API 認証情報を生成してください。
#### ステップ 4: Apple Ads の認証情報を Adapty に設定する \{#step-4-configure-adapty-with-apple-ads-credentials\}
Apple Ads の設定画面から Client ID、Team ID、Key ID の各フィールドをコピーし、Adapty ダッシュボードの対応するフィールドに貼り付けます。
### アプリを AdServices ネットワークに接続する \{#connect-your-app-to-the-adservices-network\}
[AdServices フレームワークの設定](#connect-the-adservices-framework)が完了すると、Adapty は Apple Search Ad のアトリビューションデータの収集を自動的に開始します。SDK コードを追加する必要はありません。
iOS アプリケーションでは、このアトリビューションデータは**常に**他のソースからのデータより優先されます。この動作が不要な場合は、以下の手順で ASA アトリビューションを*無効化*してください。
## インテグレーションを無効にする \{#disable-integration\}
Apple Search Ads のアトリビューションをオフにするには、[**App Settings** -> **Apple Search Ads** タブ](https://app.adapty.io/settings/apple-search-ads)を開き、**Receive Apple Search Ads attribution** スイッチをオフにしてください。
:::warning
この設定を無効にすると、ASA アナリティクスの受信が完全に停止します。その結果、ASA はアナリティクスで使用されなくなり、インテグレーションにも送信されなくなります。また、SplitMetrics Acquire と Asapty は ASA アトリビューションに依存して動作しているため、機能しなくなります。
この変更以前に受信済みのアトリビューションには影響しません。
:::
## 独自のキーをアップロードする \{#uploading-your-own-keys\}
:::note
オプション
これらの手順は Apple Ads アトリビューションには必要ありません。Asapty などの他のサービスや独自ソリューションと連携する場合にのみ必要です。
:::
ASA アトリビューションに他のサービスや独自ソリューションを使用している場合は、独自の公開鍵・秘密鍵ペアを使用できます。
### ステップ 1 \{#step-1\}
ターミナルで秘密鍵を生成する
```text showLineNumbers title="Text"
openssl ecparam -genkey -name prime256v1 -noout -out private-key.pem
```
Adapty の Settings -> Apple Ads でアップロードする(**Upload private key** ボタン)
### ステップ 2 \{#step-2\}
ターミナルで公開鍵を生成する
```text showLineNumbers title="Text"
openssl ec -in private-key.pem -pubout -out public-key.pem
```
この公開鍵は、API Account Manager ロールを持つアカウントの Apple Ads 設定で使用できます。これにより、生成された Client ID、Team ID、Key ID の値を Adapty や他のサービスで利用できます。
---
# File: switch-from-appsflyer-s2s-api-2-to-3
---
---
title: "AppsFlyer S2S API 2 から 3 への切り替え"
description: "Adapty で AppsFlyer S2S API 2 から 3 へアップグレードする方法。"
---
[AppsFlyer の公式 What's New](https://support.appsflyer.com/hc/en-us/articles/20509378973457-Bulletin-Upgrading-the-AppsFlyer-S2S-API) によると、API 利用をより安全にし、不正を減らすために、AppsFlyer はアプリ内イベント向けのサーバー間 (S2S) API をアップグレードしました。既存のエンドポイントは将来的に廃止される予定であるため、切り替えの計画を早めに始めることをおすすめします。
Adapty は AppsFlyer S2S API 3 に対応しており、API 2 からスムーズに切り替えられます。ただし、この切り替えは一方向です。一度変更すると API 2 に戻すことはできません。
AppsFlyer S2S API 2 から 3 に切り替えるには:
1. [AppsFlyer サイト](https://www.appsflyer.com/home)を開いてログインします。
2. ダッシュボード左上の **Your account name** -> **Security Center** をクリックします。
3. **Manage your account security** ウィンドウで、**Manage your AppsFlyer API and S2S tokens** ボタンをクリックします。
4. S2S トークンがない場合は **New token** ボタンをクリックします。すでにある場合は手順 8 に進んでください。
5. **New token** ウィンドウで、トークンの名前を入力します。この名前はあなただけの管理用です。
6. **Choose type** リストから **S2S** を選択します。
7. **Create new token** ボタンをクリックして新しいトークンを保存することを忘れずに。
8. **Tokens** ウィンドウで S2S トークンをコピーします。
9. Adapty ダッシュボードで [**Integrations** -> **AppsFlyer**](https://app.adapty.io/integrations/appsflyer) を開きます。
10. **AppsFlyer S2S API** フィールドで **API 3** を選択します。
11. コピーした S2S キーを **Dev key for iOS** と **Dev key for Android** フィールドに貼り付けます。
12. **Save** ボタンをクリックして切り替えを確定します。
この操作が完了すると、インテグレーションは即座に AppsFlyer S2S API 3 に切り替わり、新しいイベントは新しい URL `https://api3.appsflyer.com/inappevent` に送信されます。
---
# File: asapty
---
---
title: "Asapty"
description: "AdaptyのサブスクリプションエコシステムにおけるAsaptyとその役割を詳しく説明します。"
---
[Asapty](https://asapty.com/) インテグレーションを使用すると、Search Ads キャンペーンを最適化できます。AdaptyはサブスクリプションイベントをAsaptyに送信するため、Apple Search Adsアトリビューションに基づいたカスタムダッシュボードをAsapty上で構築できます。
このインテグレーションはAdaptyにアトリビューションデータを追加しません。[ASA](apple-search-ads) から直接必要なデータをすべて取得しているためです。
## インテグレーションの設定 \{#set-up-integration\}
### AdaptyとAsaptyを接続する \{#connect-adapty-to-asapty\}
Asaptyを連携するには、Adapty ダッシュボードの [Integrations > Asapty](https://app.adapty.io/integrations/asapty) に移動し、Asapty IDのフィールドに値を入力してください。
Asapty IDは、Asaptyアカウントの Settings > General セクションで確認できます。
### イベントとタグを設定する \{#configure-events-and-tags\}
認証情報の下には、AdaptyからAsaptyに送信できるイベントが3つのグループに分かれています。必要なものをオンにするだけです。Adaptyが提供するイベントの全リストは[こちら](events)で確認できます。
Asaptyが提供するデフォルトのイベント名を使用することを推奨しますが、必要に応じてイベント名を変更することもできます。
### アプリをAsaptyに接続する \{#connect-your-app-to-asapty\}
上記の手順を完了すると、Adaptyは自動的にAsaptyからアトリビューションデータを受信します。アプリのコードでアトリビューションデータを明示的にリクエストする必要はありません。アトリビューションデータの精度を高めるために、各イベントのデータに `customerUserId` を含めるようAsaptyを設定してください。
## Asaptyイベントの構造 \{#asapty-event-structure\}
AdaptyはGETリクエストのクエリパラメーターを使用してAsaptyにイベントを送信します。各イベントのURLは次のような形式になります。
```
https://asapty.com/_api/mmpEvents/?source=adapty&asaptyid=a1b2c3d4&keywordid=12345&adgroupid=67890&campaignid=11223&conversiondate=1709294400000&event_name=subscription_renewed&install_time=1709100000&app_name=MyApp&json=%7B%22af_revenue%22%3A%229.99%22%2C%22af_currency%22%3A%22USD%22...%7D
```
クエリパラメーター:
| パラメーター | 型 | 説明 |
|:-----------------|:-------|:-----------------------------------------------------|
| `source` | String | 常に "adapty"。 |
| `asaptyid` | String | 認証情報のAsapty ID。 |
| `keywordid` | String | Apple Search AdsのキーワードID(利用可能な場合)。 |
| `adgroupid` | String | Apple Search AdsのADグループID(利用可能な場合)。 |
| `campaignid` | String | Apple Search AdsのキャンペーンID(利用可能な場合)。 |
| `conversiondate` | Long | イベントのタイムスタンプ(**ミリ秒**単位)。 |
| `event_name` | String | イベント名(Adaptyイベントからマッピングされたもの)。|
| `install_time` | Long | インストールのタイムスタンプ(秒単位)。 |
| `app_name` | String | Adaptyのアプリタイトル(利用可能な場合)。 |
| `json` | String | イベントの詳細を含むURLエンコードされたJSON文字列(下記参照)。 |
`json` パラメーターは、以下のフィールドを含むURLエンコードされたJSON文字列です:
| パラメーター | 型 | 説明 |
|:--------------------------|:-------|:---------------------------------------------|
| `af_revenue` | String | 収益金額(文字列形式)。 |
| `af_currency` | String | 通貨コード(例:"USD")。 |
| `transaction_id` | String | ストアのトランザクションID。 |
| `original_transaction_id` | String | ストアの元のトランザクションID。 |
| `purchase_date` | Long | 購入タイムスタンプ(ミリ秒単位)。 |
| `original_purchase_date` | Long | 元の購入タイムスタンプ(ミリ秒単位)。 |
| `environment` | String | `Production` または `Sandbox`。 |
| `vendor_product_id` | String | ストアのプロダクトID。 |
| `profile_country` | String | ユーザーのIPに基づく国コード。 |
| `store_country` | String | ストアユーザーの国コード。 |
## トラブルシューティング \{#troubleshooting\}
- AdaptyでApple Search Adsを設定し、[認証情報をアップロード](https://app.adapty.io/settings/apple-search-ads)していることを確認してください。設定がないとAsaptyは機能しません。
- 詳細な非オーガニックASAアトリビューションを持つプロファイルのみが、Asaptyにイベントを送信します。アトリビューションが不十分な場合は、"The user profile is missing the required integration data." と表示されます。
- インテグレーションの設定前に作成されたプロファイルは、Asaptyにイベントを送信できません。
- 正しく設定しているにもかかわらずAdaptyとのインテグレーションが機能しない場合は、[**App Settings** -> **Apple Search Ads** タブ](https://app.adapty.io/settings/apple-search-ads)で **Receive Apple Search Ads attribution in Adapty** トグルが有効になっているか確認してください。
---
# File: branch
---
---
title: "Branch"
description: "Branch と Adapty を統合して、ディープリンクとアプリのコンバージョンを追跡します。"
---
[Branch](https://www.branch.io/) を使うと、さまざまなデバイス・チャネル・プラットフォームをまたいでユーザーへのリーチ、エンゲージメント、効果測定ができます。あらゆるデバイス・チャネル・プラットフォームで機能する専用リンクを通じて、モバイル収益を高めるために設計された使いやすいプラットフォームです。
Adapty は、ストアからの[サブスクリプションイベント](events)を一か所で追跡できる完全なデータセットを提供します。Adapty を使えば、サブスクライバーの行動を簡単に把握し、好みを理解した上で、ターゲットを絞った効果的なコミュニケーションに役立てることができます。
Adapty と Branch の連携は、主に 2 つの方法で動作します。
1. **Branch からアトリビューションデータを受信する**
Branch 連携を設定すると、Adapty は Branch からアトリビューションデータを受信し始めます。このデータはユーザーのプロファイルページで簡単に確認できます。
2. **サブスクリプションイベントを Branch に送信する**
Adapty は、連携で設定されたすべてのサブスクリプションイベントを Branch に送信できます。これにより、Branch ダッシュボード内でこれらのイベントを追跡し、獲得キャンペーンと紐付けることができます。
## 連携のセットアップ \{#set-up-integration\}
### Adapty を Branch に接続する \{#connect-adapty-to-branch\}
Branch を連携するには、Adapty ダッシュボードの [Integrations > Branch](https://app.adapty.io/integrations/branch) に移動し、トグルをオンにして各フィールドに入力してください。
**Branch Key** の値を取得するには、Branch の [Account Settings](https://dashboard.branch.io/account-settings/profile) を開き、**Branch Key** フィールドを確認してください。Adapty ダッシュボードの **Key test**(サンドボックス用)または **Key live**(本番用)フィールドに使用します。Branch 側では、Live と Test の環境を切り替えて適切なキーを取得してください。
### イベントとタグを設定する \{#configure-events-and-tags\}
認証情報の下には、Adapty から Branch に送信できるイベントが 3 つのグループに分かれています。必要なものをオンにするだけです。Adapty が提供するイベントの全一覧は[こちら](events)で確認できます。
収益(Apple/Google の手数料差し引き後)または売上金額のみでイベントを送信できます。また、ユーザーの通貨でレポートするチェックボックスもあります。
Adapty が提供するデフォルトのイベント名を使用することを推奨します。ただし、必要に応じてイベント名を変更することも可能です。
Adapty はサーバー間連携を使って Branch にサブスクリプションイベントを送信するため、Branch ダッシュボードですべてのサブスクリプションイベントを確認し、獲得キャンペーンと紐付けることができます。
### アプリを Branch に接続する \{#connect-your-app-to-branch\}
1. `.setIntegrationIdentifier()` SDK メソッドを呼び出して接続を初期化します。Branch の Identity ID を `customerUserId` パラメータに渡すことができます。
:::note
サードパーティSDKはユーザーIDを非同期で生成します。`Adapty.activate()` の実行時にIDがまだ準備できていない場合があります。**Customer User ID** がこれらのSDKのいずれかから取得される場合は、IDなしで `Adapty.activate()` を呼び出してください。IDが取得できたら、`setIntegrationIdentifier()` を呼び出し、次にCUIDで `identify()` を呼び出してください。
:::
1. App IDを確認するには、[App Store Connect](https://appstoreconnect.apple.com/) でアプリのページを開き、**General** セクションの **App Information** ページに移動して、画面左下の **Apple ID** を確認します。
2. [Meta for Developers](https://developers.facebook.com/) プラットフォームでアプリケーションが必要です。アプリにログインして詳細設定を開くと、ヘッダーに **App ID** が表示されます。
3. Meta Ads Managerでの収益の二重カウントを防ぐため、Meta SDKの設定でクライアントサイドのトラッキングを無効にしてください。この設定は、Meta Developer Consoleの **App Settings > Advanced Settings** にあります。**Log in-app events automatically** を「No」に設定してください。これにより、収益イベントはAdaptyの連携経由でのみトラッキングされます。
インストールや使用状況のイベントをトラッキングするには、コード内でMeta SDKを有効化する必要があります。各プラットフォームのMeta SDKドキュメントで実装の詳細を確認できます:
- [iOS SDK](https://developers.facebook.com/docs/ios/getting-started)
- [Android SDK](https://developers.facebook.com/docs/android/getting-started)
- [Unity SDK](https://developers.facebook.com/docs/unity/getting-started/canvas)
この連携はAndroidアプリでも利用できます。**App Settings** でAndroid SDKの設定を行っている場合は、**Facebook App ID** を設定するだけで十分です。
### イベントとタグの設定 \{#configure-events-and-tags\}
Facebook Ads連携は、Metaを広告キャンペーンに活用し、顧客行動に基づいて最適化している企業向けです。Metaの標準イベントを最適化目的でサポートしています。そのため、Meta Ads連携ではイベント名の変更はできません。Adaptyはお客様の顧客イベントを対応するMetaイベントに正確にマッピングします。
| Adaptyイベント | Meta Adsイベント |
| :---------------------------- | :-------------------------- |
| Subscription initial purchase | Subscribe |
| Subscription renewed | Subscribe |
| Subscription cancelled | CancelSubscription |
| Trial started | StartTrial |
| Trial converted | Subscribe |
| Trial cancelled | CancelTrial |
| Non subscription purchase | fb_mobile_purchase |
| Billing issue detected | billing_issue_detected |
| Entered grace period | entered_grace_period |
| Auto renew off | auto_renew_off |
| Auto renew on | auto_renew_on |
| Auto renew off subscription | auto_renew_off_subscription |
| Auto renew on subscription | auto_renew_on_subscription |
StartTrial、Subscribe、CancelSubscriptionは標準イベントです。
特定のイベントを有効にするには、必要なものをトグルでオンにするだけです。複数のイベント名が選択された場合、Adaptyはすべての選択されたイベントのデータを1つのAdaptyイベント名にまとめます。
### アプリをFacebook Adsに接続する \{#connect-your-app-to-facebook-ads\}
上記の手順を完了すると、FacebookはAdaptyからサブスクリプションデータを自動的に受信します。
iOS 14.5でのIDFAの変更を受け、ユーザーの`facebookAnonymousId`をFacebookからリクエストすることをお勧めします。これにより、ユーザーのIDFAが取得できない場合でも連携が継続して機能します。このパラメーターを設定するには、
認証情報の下には、AdaptyからSingularに送信できる3グループのイベントがあります。Adaptyが提供するイベントの完全なリストは[こちら](events)でご確認ください。
Adaptyが提供するデフォルトのイベント名を使用することをお勧めします。ただし、必要に応じてイベント名を変更することも可能です。
Adaptyはサーバー間連携を使用してサブスクリプションイベントをSingularに送信するため、Singularダッシュボードですべてのサブスクリプションイベントを確認し、獲得キャンペーンと紐付けることができます。
:::warning
連携を設定する前に作成されたプロファイルは、Singularにイベントを送信できません。
:::
### アプリをSingularに接続する \{#connect-your-app-to-singular\}
AdaptyとSingularの連携はサーバー間連携です。そのため、アプリケーションに追加のコードを記述する必要はありません。
## イベント構造 \{#event-structure\}
AdaptyはGETリクエストのクエリパラメーターを使用してSingularにイベントを送信します。各イベントの構造は次のとおりです:
```json
{
"n": "subscription_renewed",
"a": "singular_sdk_key_123",
"p": "iOS",
"i": "com.example.app",
"ip": "192.168.100.1",
"idfa": "00000000-0000-0000-0000-000000000000",
"idfv": "00000000-0000-0000-0000-000000000000",
"ve": "17.0.1",
"att_authorization_status": 3,
"custom_user_id": "user_12345",
"utime": 1709294400,
"amt": 9.99,
"cur": "USD",
"purchase_product_id": "yearly.premium.6999",
"purchase_transaction_id": "GPA.3383...",
"e": "{\"is_revenue_event\":true,\"amt\":9.99,\"cur\":\"USD\",\"purchase_product_id\":\"yearly.premium.6999\",\"purchase_transaction_id\":\"GPA.3383...\"}"
}
```
各パラメーターの説明:
| パラメーター | 型 | 説明 |
|:---------------------------|:--------|:---------------------------------------------------------|
| `n` | String | イベント名(Adaptyイベントからマッピングされたもの)。 |
| `a` | String | Singular SDKキー。 |
| `p` | String | プラットフォーム("iOS" または "Android")。 |
| `i` | String | ストアアプリID(バンドルID)。 |
| `ip` | String | ユーザーのIPアドレス。 |
| `idfa` | String | **iOSのみ**。広告主向けID(大文字)。 |
| `idfv` | String | **iOSのみ**。ベンダー向けID(大文字)。 |
| `aifa` | String | **Androidのみ**。Google広告ID(小文字)。 |
| `andi` | String | **Androidのみ**。Android ID(小文字)。 |
| `asid` | String | **Androidのみ**。アプリセットID(小文字)。 |
| `ve` | String | OSバージョン。 |
| `att_authorization_status` | Integer | **iOSのみ**。ATTステータス(例:`3` は承認済み)。 |
| `custom_user_id` | String | ユーザーのカスタマーユーザーID。 |
| `utime` | Long | イベントのUNIXタイムスタンプ(秒単位)。 |
| `amt` | Float | 収益金額。 |
| `cur` | String | 通貨コード(例:"USD")。 |
| `purchase_product_id` | String | ストアのプロダクトID。 |
| `purchase_transaction_id` | String | 元のトランザクションID。 |
| `e` | String | イベント詳細を含むJSONエンコード文字列(以下参照)。 |
`e` パラメーター(カスタムイベントデータ)は、以下を含むJSONエンコード文字列です:
| パラメーター | 型 | 説明 |
|:--------------------------|:--------|:---------------------------------------|
| `is_revenue_event` | Boolean | イベントに収益が含まれる場合は `true`。 |
| `amt` | Float | 収益金額。 |
| `cur` | String | 通貨コード。 |
| `purchase_product_id` | String | ストアのプロダクトID。 |
| `purchase_transaction_id` | String | 元のトランザクションID。 |
---
# File: tenjin
---
---
title: "Tenjin連携"
description: ""
---
Tenjinは、アプリ開発者やマーケター向けのモバイルアトリビューション・分析プラットフォームです。広告ネットワークやアプリストアのデータを集約し、ROIの分析、コンバージョンのトラッキング、主要なパフォーマンス指標のモニタリングを可能にします。透明性が高く柔軟なアプローチで、ユーザー獲得キャンペーンの計測と最適化を支援します。
[サブスクリプションイベント](events)をTenjinに転送することで、コンバージョンの発生源や最も価値をもたらすキャンペーンを、すべてのチャネル・プラットフォーム・デバイスにわたって正確に把握できます。TenjinのダッシュボードはマーケティングキャンペーンのA/Bテスト向け高度な分析機能を提供します。
TenjinのアトリビューションをAdaptyに転送することで、Adaptyのアナリティクスにコホート分析やコンバージョン分析で活用できる追加フィルタ条件を追加できます。
この連携は2つの方法で機能します:
1. **Tenjinからアトリビューションデータを受け取る**
連携後、AdaptyはTenjinからアトリビューションデータを収集します。この情報はAdapty Dashboardのユーザーのプロファイルページで確認できます。
2. **サブスクリプションイベントをTenjinに送信する**
Adatyはリアルタイムで購入イベントをTenjinに送信します。これらのイベントを使って、Tenjinのダッシュボード内で広告キャンペーンの効果を直接評価できます。
| 連携の特性 | 説明 |
| -------------------------- | ------------------------------------------------------------ |
| スケジュール | リアルタイム |
| データの方向 | 双方向転送:
3. [Tenjin Dashboard](https://tenjin.com/)にログインします。
4. ナビゲーションメニューで**Configuration** -> **Apps**に移動します。
5. お使いのプラットフォーム(iOSまたはAndroid)のアプリを選択し、**App and SDK**タブに移動します。
6. **App and SDK**タブで、**SDK Key**列の**Copy**をクリックします。SDKキーがまだない場合は、**Generate SDK Key**ボタンをクリックして作成します。
7. Adapty Dashboardに戻り、コピーしたSDKキーを対応するプラットフォームのフィールドに貼り付けます:
- iOSアプリの場合:**iOS SDK Key**または**iOS Sandbox SDK Key**フィールドに貼り付けます
- Androidアプリの場合:**Android SDK Key**または**Android Sandbox SDK Key**フィールドに貼り付けます
:::info
Tenjinにはサーバー間連携向けの専用サンドボックスモードはありません。本番環境とサンドボックスイベントの両方に、別のTenjinアプリまたは同じキーを使用してください。
:::
8. 両方のプラットフォームにアプリがある場合は、もう一方のプラットフォームについて手順5〜7を繰り返します。
9. (任意)必要に応じて**How the revenue data should be sent**セクションを調整します。設定の詳細については、[連携設定](configuration#integration-settings)を参照してください。
10. **Save**をクリックしてセットアップを完了します。
これでAdaptyはTenjinに購入イベントを送信し、アトリビューションデータを受信します。**Events names**セクションでイベントの共有を調整できます。
### イベントとタグを設定する \{#configure-events-and-tags\}
Tenjinは購入イベントと**Trial started**イベントのみを受け付けます。**Events names**セクションで、トラッキング目標に合わせてTenjinと共有するイベントを選択します。
### アプリをTenjinに接続する \{#connect-your-app-to-tenjin\}
`Adapty.updateAttribution()` SDKメソッドを使用してTenjinからアトリビューションデータを取得し、Adaptyに渡します。
2. **Amplitude integration** をオンに切り替えて有効化します。
3. 連携フィールドに入力します:
| フィールド | 説明 |
| ------------------------------------------ | ------------------------------------------------------------ |
| **Amplitude iOS/ Android/ Stripe API key** | iOS / Android / Stripe用のAmplitude **API Key** をAdaptyに入力します。Amplitudeの **Project settings** から確認できます。詳しくは [Amplitude ドキュメント](https://amplitude.com/docs/apis/authentication) をご覧ください。まず **Sandbox** キーでテストを行い、成功したら **Production** キーに切り替えてください。 |
4. さらに詳細なカスタマイズのためのオプション設定:
| パラメータ | 説明 |
| --------------------------------------- | ------------------------------------------------------------ |
| **How the revenue data should be sent** | 総収益を送るか、税金と手数料控除後の収益を送るかを選択します。詳細は[ストア手数料と税金](controls-filters-grouping-compare-proceeds#display-gross-or-net-revenue)をご覧ください。 |
| **Exclude historical events** | Adapty SDK インストール以前のイベントを除外するか選択します。データの重複を防ぐことができます。たとえば、ユーザーが1月10日にサブスクリプションを開始し、3月6日にAdapty SDKをインストールした場合、Adaptyは3月6日以降のイベントのみを送信します。 |
| **Send User Attributes** | 言語設定などのユーザー固有の属性を送信するにはこのオプションを選択します。 |
| **Always populate user_id** | Adaptyは自動的に `device_id` を `amplitudeDeviceId` として送信します。`user_id` については、この設定で動作を定義します:
Adaptyが提供するデフォルトのイベント名を使用することをお勧めします。ただし、必要に応じてイベント名を変更することも可能です。Adaptyはサーバー間連携を使ってAmplitudeにサブスクリプションイベントを送信するため、Amplitudeダッシュボードですべてのサブスクリプションイベントを確認できます。
### SDK の設定 \{#sdk-configuration\}
`setIntegrationIdentifier()` メソッドを使用して `amplitude_device_id` パラメータを設定します。これは連携のセットアップに必須です。
ユーザー登録がある場合は、`amplitude_user_id` も合わせて渡すことができます。
:::note
サードパーティSDKはユーザーIDを非同期で生成します。`Adapty.activate()` の実行時にIDがまだ準備できていない場合があります。**Customer User ID** がこれらのSDKのいずれかから取得される場合は、IDなしで `Adapty.activate()` を呼び出してください。IDが取得できたら、`setIntegrationIdentifier()` を呼び出し、次にCUIDで `identify()` を呼び出してください。
:::
4. Adapty ダッシュボードの [Integrations > AppMetrica](https://app.adapty.io/integrations/appmetrica) に移動する
5. AppMetricaの認証情報を貼り付ける
### イベントとタグ \{#events-and-tags\}
Adaptyでは、3つのグループのイベントをAppMetricaに送信できます。アプリのパフォーマンスを追跡するために必要なイベントを有効化してください。利用可能なイベントの完全なリストは、[イベントドキュメント](events)をご参照ください。
:::note
AppMetricaは4時間ごとにイベントを同期するため、ダッシュボードにイベントが表示されるまで遅延が生じる場合があります。
:::
:::tip
一貫性を保つためにAdaptyのデフォルトイベント名の使用を推奨しますが、既存のアナリティクス設定に合わせてカスタマイズすることも可能です。
:::
### 収益の設定 \{#revenue-settings\}
デフォルトでは、Adaptyは収益データをイベントのプロパティとして送信し、AppMetricaのEventsレポートに表示されます。この収益データの計算と表示方法を設定できます。
- **収益の計算方法**: 財務レポートのニーズに合わせて収益値の計算方法を選択します:
- **総収益(Gross revenue)**: 控除前の総収益を表示します。顧客が支払う全額の追跡に役立ちます
- **ストア手数料控除後の収益(Proceeds after store commission)**: App Store/Play Storeの手数料を差し引いた収益を表示します。実際の収益の追跡に役立ちます
- **ストア手数料・税金控除後の収益(Proceeds after store commission and taxes)**: ストア手数料と適用される税金の両方を差し引いた純収益を表示します。最も正確な収益の把握ができます
- **ユーザーの通貨で報告(Report user's currency)**: 有効にすると、売上がユーザーのローカル通貨で報告され、地域別の収益分析がしやすくなります。無効にすると、異なる市場間での一貫したレポートのためにすべての売上がUSDに変換されます。
- **収益イベントを送信(Send revenue events)**: このオプションを有効にすると、収益データがEventsレポートだけでなく、AppMetricaの[アプリ内・広告収益](https://appmetrica.yandex.com/docs/en/mobile-reports/revenue-report)レポートにも表示されます。収益の重複を避けるため、他の場所からすでに収益を送信していないことを確認してください。
- **過去のイベントを除外(Exclude historical events)**: 有効にすると、ユーザーがAdapty SDKを含むアプリをインストールする前に発生したイベントは送信されません。Adaptyを統合する前からアナリティクスにイベントを送信していた場合のデータ重複を防ぐのに役立ちます。
### SDKの設定 \{#sdk-configuration\}
アプリでAppMetrica連携を有効にするには、2つの識別子を設定する必要があります。
1. `appmetrica_device_id`: 基本的な連携に必要
2. `appmetrica_profile_id`: 任意ですが、アプリにユーザー登録機能がある場合は推奨
これらの値を設定するには `setIntegrationIdentifier()` メソッドを使用します。各プラットフォームでの実装方法は以下のとおりです。
:::note
サードパーティSDKはユーザーIDを非同期で生成します。`Adapty.activate()` の実行時にIDがまだ準備できていない場合があります。**Customer User ID** がこれらのSDKのいずれかから取得される場合は、IDなしで `Adapty.activate()` を呼び出してください。IDが取得できたら、`setIntegrationIdentifier()` を呼び出し、次にCUIDで `identify()` を呼び出してください。
:::
### Mixpanel トークンの確認方法 \{#finding-your-mixpanel-token\}
**Mixpanel Token** を取得するには:
1. [Mixpanel ダッシュボード](https://mixpanel.com/settings/project/)にログインします。
2. **Settings** を開き、**Organization Settings** を選択します。
3. 左サイドバーから **Projects** に移動し、プロジェクトを選択します。
## 連携の仕組み \{#how-the-integration-works\}
Adapty は、ユーザー ID や売上などの関連イベントプロパティを[Mixpanel ネイティブプロパティ](https://docs.mixpanel.com/docs/data-structure/user-profiles)に自動的にマッピングします。これにより、サブスクリプション関連イベントの正確なトラッキングとレポーティングが実現されます。
また、Adapty はユーザーごとに売上データを蓄積し、`subscription state` や `subscription product ID` などの[ユーザープロファイルプロパティ](https://docs.mixpanel.com/docs/data-structure/user-profiles)を更新します。イベントを受信すると、Mixpanel は対応するフィールドをリアルタイムで更新します。
## イベントとタグ \{#events-and-tags\}
認証情報の下には、Adapty から Mixpanel に送信できるイベントが 3 つのグループに分かれています。必要なものをオンにするだけです。Adapty が提供するイベントの完全な一覧は[こちら](events)をご確認ください。
Adapty が提供するデフォルトのイベント名を使用することをお勧めします。ただし、必要に応じてイベント名を変更することも可能です。
## SDK の設定 \{#sdk-configuration\}
`.setIntegrationIdentifier()` メソッドを使用して `mixpanelUserId` を設定します。設定しない場合、Adapty はユーザー ID(`customerUserId`)を使用し、それが null の場合は Adapty ID を使用します。アプリから Mixpanel にデータを送信する際に使用するユーザー ID と、Adapty に送信するユーザー ID が同じであることを確認してください。
:::note
サードパーティSDKはユーザーIDを非同期で生成します。`Adapty.activate()` の実行時にIDがまだ準備できていない場合があります。**Customer User ID** がこれらのSDKのいずれかから取得される場合は、IDなしで `Adapty.activate()` を呼び出してください。IDが取得できたら、`setIntegrationIdentifier()` を呼び出し、次にCUIDで `identify()` を呼び出してください。
:::
2. [PostHog ダッシュボード](https://posthog.com/)にログインします。
3. **Settings -> Project** に移動します。
4. **Project** ウィンドウで下にスクロールして **Project ID** セクションを表示し、**Project API key** をコピーします。
5. APIキーを Adapty ダッシュボードの **Project API key** フィールドに貼り付けます。PostHog にはサーバー間連携専用のサンドボックスモードはありません。
6. **PostHog Deployment** を選択します:
| オプション | 説明 |
| ------ | ------------------------------------------------------------ |
| us/eu | PostHog がホストするデフォルトのデプロイメント。 |
| Custom | セルフホスト環境向け。**PostHog Instance URL** フィールドにインスタンスのURLを入力します。 |
7. (任意)セルフホストの PostHog デプロイメントを使用している場合は、**PostHog Instance URL** フィールドにデプロイメントのアドレスを入力します。
8. (任意)**Reporting Proceeds**、**Exclude Historical Events**、**Report User's Currency**、**Send Trial Price** などの設定を調整します。これらのオプションの詳細は [Integration settings](configuration#integration-settings) を参照してください。
9. (任意)**Events names** セクションで PostHog に送信するイベントをカスタマイズすることもできます。不要なイベントを無効にしたり、名前を変更したりできます。
10. **Save** をクリックして設定を確定します。
## SDK の設定 \{#sdk-configuration\}
PostHog からアトリビューションデータを受け取るには、以下のように `distinctId` の値を Adapty に渡してください:
:::note
サードパーティSDKはユーザーIDを非同期で生成します。`Adapty.activate()` の実行時にIDがまだ準備できていない場合があります。**Customer User ID** がこれらのSDKのいずれかから取得される場合は、IDなしで `Adapty.activate()` を呼び出してください。IDが取得できたら、`setIntegrationIdentifier()` を呼び出し、次にCUIDで `identify()` を呼び出してください。
:::
SplitMetrics Acquire のアカウントを開き、いずれかの MMP ロゴにカーソルを合わせて **Settings** ボタンをクリックします。ダイアログの項目 **5** に表示されている Client ID をコピーし、Adapty の **Client ID** フィールドに貼り付けてください。
連携を使用するには Apple App ID の設定も必要です。App ID を確認するには、App Store Connect でアプリのページを開き、**General** セクションの **App Information** ページに移動して、画面左下の **Apple ID** を確認してください。
## イベントとタグ \{#events-and-tags\}
認証情報の下に、Adapty から SplitMetrics Acquire に送信できる 3 つのイベントグループがあります。必要なものをオンにするだけです。Adapty が提供するイベントの全一覧は[こちら](events)をご確認ください。
Adapty が提供するデフォルトのイベント名を使用することをおすすめします。ただし、必要に応じてイベント名を変更することも可能です。Adapty はサーバー間連携を使用してサブスクリプションイベントを SplitMetrics Acquire に送信するため、SplitMetrics ダッシュボードですべてのサブスクリプションイベントを確認できます。
## SDK の設定 \{#sdk-configuration\}
SDK 側での設定は不要ですが、精度向上のために `customerUserId` を Adapty に送信することをおすすめします。
:::warning
[Apple Search Ads](apple-search-ads) を Adapty で設定し、[認証情報をアップロード](https://app.adapty.io/settings/apple-search-ads)していることを確認してください。これらがない場合、SplitMetrics Acquire は機能しません。
:::
## トラブルシューティング \{#troubleshooting\}
正しく設定しているにもかかわらず SplitMetrics Acquire との連携が機能しない場合:
- [App Settings -> Apple Search Ads タブ](https://app.adapty.io/settings/apple-search-ads) で **Receive Apple Search Ads attribution in Adapty** トグルが有効になっていること、Adapty で [Apple Search Ads](apple-search-ads) が設定されていること、および[認証情報がアップロード](https://app.adapty.io/settings/apple-search-ads)されていることを確認してください。これらがない場合、SplitMetrics は機能しません。
- プロファイルにオーガニックではない ASA アトリビューションが設定されていることを確認してください。詳細なオーガニックでない ASA アトリビューションを持つプロファイルのみ、イベントが Adapty に配信されます。
## SplitMetrics Acquire のイベント構造 \{#splitmetrics-acquire-event-structure\}
Adapty はクエリパラメーターを使用した GET リクエストで SplitMetrics Acquire にイベントを送信します。各イベントの構造は次のとおりです:
```json
{
"source": "Apple Search Ads",
"app_id": "123456789",
"name": "subscription_renewed",
"type": "subscription_renewed",
"revenue": 9.99,
"currency": "USD",
"tap_time": "2024-03-01 12:00:00",
"open_time": "2024-03-01 12:05:00",
"event_time": "2024-03-02 12:00:00",
"adaccount_id": "123456",
"campaign_id": "123456789",
"adgroup_id": "123456789",
"keyword_id": "123456789",
"creative_set_id": "123456789",
"Ad_id": "123456789",
"country_or_region": "US",
"conversion_type": "Download",
"user_id": "user_12345",
"att_status": "3",
"device_type": "iphone",
"app_version": "1.2.3",
"sdk_version": "2.10.0",
"ios_version": "17.2",
"event_value": "{\"vendor_product_id\":\"yearly.premium.6999\",\"original_transaction_id\":\"GPA.3383...\"}",
"event_id": "123e4567-e89b-12d3-a456-426614174000"
}
```
各パラメーターの説明:
| パラメーター | 型 | 説明 |
|:--------------------|:-------|:---------------------------------------------------------------------------------------------------------------|
| `source` | String | 常に "Apple Search Ads"。 |
| `app_id` | String | Apple App ID。 |
| `name` | String | イベント名(Adapty イベントからマッピング)。 |
| `type` | String | イベントタイプ(`name` と同じ)。 |
| `revenue` | Float | 収益金額。 |
| `currency` | String | 通貨コード。 |
| `tap_time` | String | 広告タップの日時。 |
| `open_time` | String | アプリを開いた(インストールした)日時。 |
| `event_time` | String | イベントの日時。 |
| `adaccount_id` | String | ASA 組織 ID。 |
| `campaign_id` | String | ASA キャンペーン ID。 |
| `adgroup_id` | String | ASA 広告グループ ID。 |
| `keyword_id` | String | ASA キーワード ID。 |
| `creative_set_id` | String | ASA クリエイティブセット ID。 |
| `Ad_id` | String | ASA 広告 ID。 |
| `country_or_region` | String | ストアの国または地域。 |
| `conversion_type` | String | コンバージョンタイプ(例: "Download")。 |
| `user_id` | String | カスタマーユーザー ID または Adapty プロファイル ID。 |
| `att_status` | String | トラッキング使用状況ステータス(0〜3)。 |
| `device_type` | String | デバイスタイプ(例: "iphone"、"ipad")。 |
| `app_version` | String | アプリケーションバージョン。 |
| `sdk_version` | String | Adapty SDK バージョン。 |
| `ios_version` | String | iOS バージョン。 |
| `event_value` | String | 利用可能なすべての[イベント詳細](webhook-event-types-and-fields#for-most-event-types)を含む JSON 文字列。 |
| `event_id` | String | 一意のイベント ID(UUID)。 |
---
# File: braze
---
---
title: "Braze"
description: "シームレスなカスタマーエンゲージメントとプッシュ通知のために、BrazeとAdaptyを統合します。"
---
トップクラスのカスタマーエンゲージメントソリューションのひとつである [Braze](https://www.braze.com/) は、プッシュ通知、メール、SMS、アプリ内メッセージングなど幅広いツールを提供しています。AdaptyとBrazeを統合することで、すべてのサブスクリプションイベントを一箇所で確認でき、それらのイベントをもとに自動コミュニケーションをトリガーできます。
Adaptyは、すべてのストアからの[サブスクリプションイベント](events)を一元管理できる完全なデータセットを提供しており、Brazeのユーザープロファイルの更新に活用できます。Adaptyを使えば、サブスクライバーの行動を把握し、好みを把握して、ターゲットを絞った効果的なコミュニケーションに役立てることができます。この統合により、Brazeダッシュボードでサブスクリプションイベントを追跡し、[獲得キャンペーン](https://www.braze.com/product/journey-orchestration)と紐付けることが可能になります。
Adaptyはサブスクリプションイベントやユーザープロパティ、購入情報をBrazeに送信するため、以下に説明する簡単な統合を行うだけで、Brazeのプッシュ通知を使った顧客向けターゲットコミュニケーションを構築できます。
## Braze統合のセットアップ方法 \{#how-to-set-up-braze-integration\}
Brazeを統合するには、[Integrations → Braze](https://app.adapty.io/integrations/braze) に移動してトグルをオンにし、各フィールドを入力してください。
統合の最初のステップは、BrazeとAdaptyのプロファイルを接続するために必要な認証情報を提供することです。統合を正しく動作させるには、**REST API Key**、**Braze Instance ID**、そしてiOSとAndroidの**App ID**が必要です:
1. **REST API Key** は **Braze Dashboard** → **Settings** → **API Keys** で作成できます。作成時にキーに `users.track` 権限が付与されていることを確認してください:
2. **Braze Instance ID** を取得するには、BrazeダッシュボードのURLを確認し、インスタンスIDが記載されている [Braze Docs](https://www.braze.com/docs/api/basics/#endpoints) のセクションを参照してください。US-03、EU-01などの地域形式になっています。
3. iOSおよびAndroidのApp IDは、Braze Dashboard → Settings → API Keys でも確認できます。こちらからコピーしてください:
## イベント、ユーザー属性、購入 \{#events-user-attributes-and-purchases\}
認証情報の下には、AdaptyからBrazeに送信できるイベントが3つのグループで表示されています。必要なものをオンにするだけです。Brazeへの送信に合わせてイベント名を変更することもできます。Adaptyが提供するイベントの完全なリストは[こちら](events)で確認できます:
Adaptyはサブスクリプションイベントとユーザー属性をサーバー間統合でBrazeに送信するため、Brazeダッシュボードで確認してキャンペーンを設定できます。
トライアル転換や更新など収益が発生するイベントについては、Adaptyはその情報を購入としてBrazeに送信します。
Brazeに送信されるイベントプロパティの完全な仕様は[こちら](messaging#event-properties)をご覧ください。
:::note
便利なユーザー属性
AdaptyはBraze統合のためにデフォルトでいくつかのユーザー属性を送信します。ニーズに最適なものを判断するために、以下のリストを参照してください。
:::
| ユーザー属性 | 型 | 値 |
|--------------|----|-----|
| `adapty_customer_user_id` | String | お客様が定義したユーザーの一意識別子の値を含みます。Adaptyの[ダッシュボード](profiles-crm)とBrazeの両方で確認できます。 |
| `adapty_profile_id` | String | Adaptyのユーザープロファイルの一意識別子(Adapty User Profile ID)の値を含みます。Adaptyの[ダッシュボード](profiles-crm)で確認できます。 |
| `environment` | String | ユーザーがサンドボックス環境または本番環境のどちらで操作しているかを示します。
値は `Sandbox` または `Production` のいずれかです。
| | `store` | String |購入に使用したストアの名前を含みます。
設定可能な値:
`app_store` または `play_store`
| | `vendor_product_id` | String |Apple/GoogleストアのプロダクトIDの値を含みます。
例:org.locals.12345
| | `subscription_expires_at` | String |最新のサブスクリプションの有効期限を含みます。
値のフォーマット:
YYYY-MM-DDTHH:mm:ss.SSS+TZ
例:2023-02-15T17:22:03.000+0000
| | `active_subscription` | String | 購入・更新イベント時に `true`、サブスクリプションが期限切れの場合は `false` に設定されます。 | | `period_type` | String |購入または更新の最新の期間タイプを示します。
設定可能な値:
トライアル期間の場合は `trial`、それ以外は `normal`
| すべてのfloat値はintに丸められます。文字列はそのまま維持されます。 定義済みのタグリストに加えて、タグを使って[カスタム属性](segments#custom-attributes)を送信することも可能です。これにより、タグに含めるデータの種類の柔軟性が高まり、プロダクトやサービスに関連する特定の情報の追跡に役立ちます。すべてのカスタムユーザー属性は、ユーザーが[統合ページ](https://app.adapty.io/integrations/braze)の **Send user attributes** チェックボックスをオンにすることで、自動的にBrazeに送信されます。 ## SDK設定 \{#sdk-configuration\} AdaptyとBrazeのユーザープロファイルを紐付けるには、Braze SDKをAdaptyと同じカスタマーユーザーIDで設定するか、`.changeUser()` メソッドを使用する必要があります:
2. 連携トグルを有効にします。
3. **OneSignal App ID** を入力します。
OneSignal との連携を設定するには、Adapty ダッシュボードの [Integrations -> OneSignal](https://app.adapty.io/integrations/onesignal) に移動し、トグルをオンにして連携の認証情報を設定してください。
## OneSignal App ID の取得 \{#retrieving-your-onesignal-app-id\}
**OneSignal App ID** は [OneSignal ダッシュボード](https://dashboard.onesignal.com/login)で確認できます:
1. **Settings** → **Keys & IDs** に移動します。
2. **OneSignal App ID** をコピーして、Adapty ダッシュボードの **App ID** フィールドに貼り付けます。
OneSignal ID の詳細については、[こちらのドキュメント](https://documentation.onesignal.com/docs/en/keys-and-ids)をご覧ください。
### イベントの設定 \{#configuring-events\}
Adapty では、3 つのグループのイベントを OneSignal に送信できます。Adapty ダッシュボードで必要なものをトグルでオンにしてください。利用可能なイベントの完全なリストと詳細な説明は[こちら](events)で確認できます。
Adapty はサーバー間連携を使用してサブスクリプションイベントを OneSignal に送信するため、OneSignal ですべてのサブスクリプション関連のアクティビティを追跡できます。
:::warning
2023 年 4 月 17 日より、OneSignal の無料プランではこの連携がサポートされなくなりました。**Growth**、**Professional**、およびそれ以上のプランでのみ利用可能です。詳細は [OneSignal Pricing](https://onesignal.com/pricing) をご覧ください。
:::
## カスタムタグ \{#custom-tags\}
この連携では、Adapty ユーザーのさまざまなプロパティをタグとして更新・付与し、OneSignal に送信します。以下のタグ一覧から、ニーズに合ったものをご確認ください。
:::warning
OneSignal にはタグの上限があります。これには Adapty が生成するタグと OneSignal に既存するタグの両方が含まれます。上限を超えると、イベント送信時にエラーが発生する可能性があります。
:::
| タグ | 型 | 説明 |
|---|----|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `adapty_customer_user_id` | String | アプリ内でのユーザーの一意の識別子。システム、Adapty、OneSignal 全体で一貫している必要があります。 |
| `adapty_profile_id` | String | Adapty のユーザープロファイル ID。[Adapty ダッシュボード](profiles-crm)で確認できます。 |
| `environment` | String | ユーザーの現在の環境を示す `Sandbox` または `Production`。 |
| `store` | String | プロダクトが購入されたストア。選択肢:**app_store**、**play_store**、**stripe**、または[カスタムストア](custom-store)の名前。 |
| `vendor_product_id` | String | アプリストアにおけるプロダクト ID(例:`org.locals.12345`)。 |
| `subscription_expires_at` | String | 最新のサブスクリプションの有効期限(`YYYY-MM-DDTHH:MM:SS+0000`、例:`2023-02-10T17:22:03.000000+0000`)。 |
| `last_event_type` | String | [Adapty イベントリスト](events)における最新のイベントタイプ。
1. **App ID** はPushwooshのダッシュボードで確認できます。
2. **Auth token** はPushwoosh の設定画面にある「API Access」セクションで確認できます。
## イベントとタグ \{#events-and-tags\}
認証情報の下には、AdaptyからPushwooshに送信できるイベントのグループが3つあります。必要なものをオンにするだけです。Pushwooshに送信するイベント名は変更することもできます。Adaptyが提供するイベントの全リストは[こちら](events)でご確認ください。
Adaptyはサーバー間インテグレーションを使用してPushwooshにサブスクリプションイベントを送信するため、Pushwooshダッシュボードですべてのサブスクリプションイベントを確認できます。
:::note
カスタムタグ
AdaptyではPushwooshインテグレーションにカスタムタグを使用することもできます。以下のタグ一覧を参照して、用途に合ったタグをお選びください。
:::
| タグ | タイプ | 値 |
|---|----|-----|
| `adapty_customer_user_id` | String | Pushwoosh側で確認できるユーザーの一意の識別子の値を含みます。 |
| `adapty_profile_id` | String | Adaptyの[ダッシュボード](profiles-crm)で確認できるユーザーのAdaptyプロファイルIDの値を含みます。 |
| `environment` | String | ユーザーがサンドボックス環境または本番環境のいずれで操作しているかを示します。
値は `Sandbox` または `Production` のいずれかです。
| | `store` | String |購入に使用されたストアの名前を含みます。
設定可能な値:
`app_store` または `play_store`
| | `vendor_product_id` | String |Apple/GoogleストアのプロダクトIDの値を含みます。
例:org.locals.12345
| | `subscription_expires_at` | String |最新のサブスクリプションの有効期限日を含みます。
値の形式:
year-month dayThour:minute:second
例:2023-02-10T17:22:03.000000+0000
| | `last_event_type` | String | インテグレーションで有効化した標準の[Adaptyイベント](events)の中で、最後に受信したイベントの種類を示します。 | | `purchase_date` | String |最後のトランザクション(初回購入または更新)の日付を含みます。
値の形式:
year-month dayThour:minute:second
例:2023-02-10T17:22:03.000000+0000
| | `original_purchase_date` | String |トランザクションに基づく最初の購入日を含みます。
値の形式:
year-month dayThour:minute:second
例:2023-02-10T17:22:03.000000+0000
| | `active_subscription` | String | 購入または更新イベント時に `true`、サブスクリプションが期限切れの場合は `false` に設定されます。 | | `period_type` | String |購入または更新の最新の期間タイプを示します。
設定可能な値:
トライアル期間の場合は `trial`、それ以外は `normal`
| すべての浮動小数点値は整数に丸められます。文字列はそのまま維持されます。 定義済みのタグ一覧に加えて、タグを使用して[カスタム属性](segments#custom-attributes)を送信することも可能です。これにより、タグに含めるデータの種類の柔軟性が高まり、プロダクトやサービスに関連する特定の情報のトラッキングに役立ちます。**Send user custom attributes** チェックボックスを[インテグレーションページ](https://app.adapty.io/integrations/pushwoosh)でオンにすると、すべてのカスタムユーザー属性が自動的にPushwooshに送信されます。 ## SDK の設定 \{#sdk-configuration\} AdaptyとPushwooshを連携するには、`HWID` の値を送信する必要があります:
2. 任意の名前(例:`Adapty`)を付け、ワークスペースに追加します:
### 2\. 投稿権限を付与してトークンを取得する \{#2-give-permission-to-post-and-get-a-token-for-your-app\}
アプリのページにリダイレクトされます。
1. 下にスクロールして **Permissions** をクリックします:
2. リダイレクト後、**Scopes** までスクロールして **Add an OAuth Scope** をクリックします:
3. チャンネルへの投稿とメッセージのカスタマイズに必要な `chat:write`、`chat:write.public`、`chat:write.customize` の権限を付与します:
4. ページ上部に戻り、**Install to Workspace** をクリックします:
5. **Allow** をクリックします:
この操作後、同じページにリダイレクトされますが、OAuth トークン(`xoxb-...`)が表示されます。これが設定完了に必要なトークンです:
### 3\. Adapty で連携を設定する \{#3-configure-the-integration-in-adapty\}
1. [**Integrations** → **Slack**](https://app.adapty.io/integrations/slack) に移動します:
2. 前のステップで取得した `xoxb-...` トークンを貼り付け、投稿先のチャンネルを選択します。本番環境のみ、サンドボックスのみ、または両方でイベントを受け取るよう設定できます。また、通知に使用する通貨(元の通貨または USD 換算)も選択できます。
:::note
プライベートチャンネルに Adapty からメッセージを投稿したい場合は、Slack で作成した `Adapty` アプリをそのチャンネルに手動で追加する必要があります。追加しないと正常に動作しません。
:::
3. 最後に、**Events** で受け取りたいイベントを選択します:
これで設定完了です!
指定したチャンネルにイベントが送信されます。該当する場合は収益も確認でき、Adapty でカスタマープロファイルを参照することもできます:
---
# File: s3-exports
---
---
title: "Amazon S3"
description: "高度な分析とレポートのためにサブスクリプションデータをS3にエクスポートします。"
---
AdaptyのAmazon S3との連携により、イベントやペイウォール訪問データを一か所に安全に保存できます。[サブスクリプションイベント](events)をAmazon S3バケットに.csvファイルとして保存することが可能です。
この連携を設定するには、AWSコンソールとAdapty ダッシュボードでいくつかの手順を行う必要があります。
:::note
スケジュール
Adaptyはデータを毎日**24時間ごと**、UTC 4:00に送信します。
各ファイルには、UTC 基準で前日のカレンダー1日分に発生したイベントデータが含まれます。たとえば、3月8日の4:00 UTC に自動エクスポートされるデータには、3月7日の00:00:00〜23:59:59(UTC)に発生したすべてのイベントが含まれます。
:::
## Amazon S3 インテグレーションの設定方法 \{#how-to-set-up-amazon-s3-integration\}
データの受信を開始するには、以下の認証情報が必要です:
1. アクセスキー ID
2. シークレットアクセスキー
3. S3 バケット名
4. S3 バケット内のフォルダ名
:::note
ネストされたディレクトリ
Amazon S3 バケット名フィールドにネストされたディレクトリを指定できます(例:adapty-events/com.sample-app)
:::
Amazon S3 のインテグレーションを設定するには、[**Integrations** -> **Amazon S3**](https://app.adapty.io/integrations/s3) に移動し、トグルをオフからオンに切り替えて、各フィールドに入力してください。
まず、Amazon S3 と Adapty プロファイルの接続を確立するための認証情報を設定します。
Adapty ダッシュボードでは、接続を設定するために以下のフィールドが必要です:
| フィールド | 説明 |
| :--------------------------- | :----------------------------------------------------------- |
| **Access Key ID** | AWS サービスへのアクセスを認証するために使用される一意の識別子です。ダウンロードした [csv ファイル](s3-exports#how-to-create-amazon-s3-credentials) で確認できます。 |
| **Secret Access Key** | Access Key ID と組み合わせて AWS サービスへのアクセスを認証するためのプライベートキーです。ダウンロードした [csv ファイル](s3-exports#how-to-create-amazon-s3-credentials) で確認できます。 |
| **S3 Bucket Name** | AWS クラウド内の特定の S3 バケットを識別するグローバルに一意の名前です。S3 バケットはシンプルなストレージサービスで、ファイルや画像などのデータオブジェクトをクラウド上に保存・取得できます。 |
| **Folder Inside the Bucker** | 選択した S3 バケット内に作成するフォルダーの名前です。S3 はオブジェクトキーのプレフィックス(実質的にフォルダー名)を使用してフォルダーを疑似的に表現している点にご注意ください。 |
## Amazon S3 認証情報の作成方法 \{#how-to-create-amazon-s3-credentials\}
このガイドでは、AWS コンソールで必要な認証情報を作成する手順を説明します。
### 1\. アクセスポリシーの作成 \{#1-create-access-policy\}
まず、AWS コンソールの [IAM ポリシーダッシュボード](https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/policies) に移動し、**Create Policy** を選択します。
In the Policy editor, paste the following JSON and change `adapty-s3-integration-test` to your bucket name:
```json showLineNumbers title="Json"
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListObjectsInBucket",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
},
{
"Sid": "AllowAllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": [
"arn:aws:s3:::adapty-s3-integration-test/*",
"arn:aws:s3:::adapty-s3-integration-test"
]
},
{
"Sid": "AllowBucketLocation",
"Effect": "Allow",
"Action": "s3:GetBucketLocation",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
}
]
}
```
ポリシーの設定が完了したら、タグを追加する(任意)かどうかを選択し、**Next** をクリックして最終ステップに進みます。このステップでポリシーに名前を付け、**Create policy** ボタンをクリックするだけで作成が完了します。
### 2\. IAM ユーザーの作成 \{#2-create-iam-user\}
Adapty がローデータレポートをバケットにアップロードできるようにするには、対象バケットへの書き込みアクセス権を持つユーザーの Access Key ID と Secret Access Key を提供する必要があります。
手順を進めるには、IAM コンソールにアクセスし、[Users セクション](https://console.aws.amazon.com/iamv2/home#/users)を選択してください。次に、**Add users** ボタンをクリックします。
ユーザーに名前を付け、**Access key – Programmatic access** を選択して、権限の設定に進みます。
次のステップでは、**Add user to group** オプションを選択し、**Create group** ボタンをクリックしてください。
次に、User Group の名前を入力し、先ほど作成したポリシーを選択します。ポリシーを選択したら、**Create group** ボタンをクリックして完了です。
グループの作成が完了したら、**それを選択**して次のステップに進んでください。
このセクションの最後のステップなので、**Create User** ボタンをクリックして進んでください。
最後に、認証情報を**.csv 形式でダウンロード**するか、ダッシュボードから直接コピー&ペーストすることができます。
## 手動データエクスポート \{#manual-data-export\}
Amazon S3 への自動イベントデータエクスポートに加えて、Adapty では手動ファイルエクスポート機能も提供しています。この機能を使うと、エクスポートするイベントデータの期間を指定し、S3 バケットに手動でエクスポートできます。これにより、エクスポートするデータとそのタイミングをより細かく管理できます。
指定した日付範囲では、Date A の 00:00:00 UTC から Date B の 23:59:59 UTC までに作成されたイベントがエクスポートされます。
## テーブル構造 \{#table-structure\}
AWS S3 連携では、Adapty はトランザクションイベントおよびペイウォール訪問の履歴データを保存するテーブルを提供します。このテーブルには、ユーザープロファイル、収益および収益額、元のストアなど、さまざまなデータが含まれています。基本的に、これらのテーブルはアプリが一定期間に生成したすべてのトランザクションを記録します。
:::warning
この構造は今後拡張される可能性があります。新しいデータが Adapty または連携先のサードパーティによって追加されることがあります。この構造を処理するコードは、特定のフィールドに依存する形で実装し、構造全体に依存しないよう堅牢に設計してください。
:::
イベントのテーブル構造は以下の通りです:
:::note
Adapty は [currencylayer.com](https://currencylayer.com/) の為替レート(8時間ごとに更新)を使用して他の通貨を USD に変換します。レートは**取引時点で固定**されるため、その後の変動は変換結果に影響しません。
:::
| カラム | 説明 |
|---------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **profile_id** | Adapty ユーザー ID。 |
| **event_type** | 小文字のイベント名。イベントの種類については [Events](events) セクションを参照してください。 |
| **event_datetime** | ISO 8601 形式の日付。 |
| **transaction_id** | 購入や更新などのトランザクションの一意の識別子。 |
| **original_transaction_id** | 最初の購入のトランザクション識別子。 |
| **subscription_expires_at** | サブスクリプションの有効期限。通常は未来の日時。 |
| **environment** | Sandbox または Production。 |
| **revenue_usd** | USD での売上。空の場合があります。 |
| **proceeds_usd** | USD での収益。空の場合があります。 |
| **net_revenue_usd** | USD での純収益(税引き後の収入)。空の場合があります。 |
| **tax_amount_usd** | USD での税額。空の場合があります。 |
| **revenue_local** | 現地通貨での売上。空の場合があります。 |
| **proceeds_local** | 現地通貨での収益。空の場合があります。 |
| **net_revenue_local** | 現地通貨での純収益(税引き後の収入)。空の場合があります。 |
| **tax_amount_local** | 現地通貨での税額。空の場合があります。 |
| **customer_user_id** | 開発者のユーザー ID。たとえば、ユーザーの UUID、メールアドレス、その他の ID を使用できます。設定していない場合は Null。 |
| **store** | _app_store_ または _play_store_。 |
| **product_id** | Apple App Store、Google Play Store、または Stripe でのプロダクト ID。 |
| **base_plan_id** | Google Play Store での [ベースプラン ID](https://support.google.com/googleplay/android-developer/answer/12154973) または Stripe での [価格 ID](https://docs.stripe.com/products-prices/how-products-and-prices-work#use-products-and-prices)。 |
| **developer_id** | トランザクションが発生したペイウォールの開発者(SDK)ID。 |
| **ab_test_name** | トランザクションが発生した A/B テストの名前。 |
| **ab_test_revision** | トランザクションが発生した A/B テストのリビジョン。 |
| **paywall_name** | トランザクションが発生したペイウォールの名前。 |
| **paywall_revision** | トランザクションが発生したペイウォールのリビジョン。 |
| **profile_county** | IP アドレスをもとに Adapty が判定したプロファイルの国。 |
| **install_date** | インストールが行われた日付(ISO 8601 形式)。 |
| **idfv** | iOS デバイスの [identifierForVendor](https://developer.apple.com/documentation/uikit/uidevice/identifierforvendor) |
| **idfa** | iOS デバイスの [advertisingIdentifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/advertisingidentifier) |
| **advertising_id** | Android オペレーティングシステムが割り当てる一意のコードで、広告主がユーザーのデバイスを識別するために使用する広告 ID。 |
| **ip_address** | デバイスの IP アドレス(IPv4 または IPv6。利用可能な場合は IPv4 を優先)。デバイスの IP が変わるたびに更新されます。 |
| **cancellation_reason** | ユーザーがサブスクリプションをキャンセルした理由。
以下の値が設定されます:
**iOS & Android** _voluntarily_cancelled_、_billing_error_、_refund_
**iOS** _price_increase_、_product_was_not_available_、_unknown_、_upgraded_
**Android** _new_subscription_replace_、_cancelled_by_developer_
| | **android_app_set_id** | [AppSetId](https://developer.android.com/design-for-safety/privacy-sandbox/reference/adservices/appsetid/AppSetId) — デバイスおよび開発者アカウントごとに一意で、ユーザーがリセット可能な、非収益化広告用途向けの ID。 | | **android_id** | Android 8.0(API レベル 26)以降では、アプリの署名キー、ユーザー、デバイスの組み合わせごとに一意な 64 ビットの数値(16 進数文字列で表現)。詳細は [Android 開発者ドキュメント](https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID) を参照してください。 | | **device** | エンドユーザーに表示されるデバイスのモデル名。 | | **currency** | トランザクションの 3 文字の通貨コード(ISO-4217)。 | | **store_country** | Apple/Google ストアが判定したプロファイルの国。 | | **attribution_source** | アトリビューションソース。 | | **attribution_network_user_id** | アトリビューションソースがユーザーに割り当てた ID。 | | **attribution_status** | organic、non_organic、または unknown。 | | **attribution_channel** | マーケティングチャネル名。 | | **attribution_campaign** | マーケティングキャンペーン名。 | | **attribution_ad_group** | アトリビューションの広告グループ。 | | **attribution_ad_set** | アトリビューションの広告セット。 | | **attribution_creative** | アトリビューションのクリエイティブキーワード。 | | **attributes** | [カスタムユーザー属性](setting-user-attributes#custom-user-attributes) の JSON。モバイルアプリから送信するよう設定したカスタム属性が含まれます。送信するには、[Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook) ページで **Send User Attributes** オプションを有効にしてください。 | | **integration_ids** | プロファイルに関連付けられたすべてのインテグレーション ID。ディクショナリ形式。例: {'mixpanel_user_id': 'mixpanelUserId-test', 'facebook_anonymous_id': 'facebookAnonymousId-test'} | ここにペイウォール訪問数のテーブル構造を示します: | カラム | 説明 | | :-------------------- | :----------------------------------------------------------------------------------------------------------- | | **profile_id** | Adapty のユーザー ID。 | | **customer_user_id** | 開発者のユーザー ID。例えば、ユーザーの UUID、メールアドレス、その他の ID などを設定できます。未設定の場合は Null。 | | **profile_country** | Apple/Google ストアによって決定されるプロファイルの国。 | | **install_date** | インストールが行われた日時(ISO 8601 形式)。 | | **store** | _app_store_ または _play_store_ のいずれか。 | | **paywall_showed_at** | ペイウォールがユーザーに表示された日時。 | | **developer_id** | トランザクションが発生したペイウォールの開発者(SDK)ID。 | | **ab_test_name** | トランザクションが発生した A/B テストの名前。 | | **ab_test_revision** | トランザクションが発生した A/B テストのリビジョン。 | | **paywall_name** | トランザクションが発生したペイウォールの名前。 | | **paywall_revision** | トランザクションが発生したペイウォールのリビジョン。 | ## イベントとタグ \{#events-and-tags\} インテグレーションで通信するデータを管理できます。このインテグレーションでは、以下の設定オプションを利用できます。 | 設定 | 説明 | | :--------------------------------- | :----------------------------------------------------------- | | **Exclude Historical Events** | Adapty SDK を含むアプリをユーザーがインストールする前に発生したイベントを除外するかどうかを選択します。これにより、イベントの重複を防ぎ、正確なレポートを確保できます。たとえば、ユーザーが 1 月 10 日に月次サブスクリプションを有効化し、3 月 6 日に Adapty SDK を含むアプリにアップデートした場合、Adapty は 3 月 6 日より前のイベントを除外し、以降のイベントのみを保持します。 | | **Include events without profile** | Adapty のユーザープロファイルに紐付いていないトランザクションを含めるかどうかを選択します。これには、Adapty SDK のインストール前に行われた購入や、特定のユーザーにすぐに関連付けられないストアのサーバー通知から受信したトランザクションが含まれる場合があります。 | | **Send User Attributes** | 言語設定などのユーザー固有の属性を送信したい場合で、かつ OneSignal のプランが 10 個を超えるタグをサポートしている場合は、このオプションを選択します。有効にすると、デフォルトの 10 タグを超える追加情報を含めることができます。タグの上限を超えるとエラーが発生する可能性がある点に注意してください。 |
インテグレーション設定の下には、Adapty から Amazon S3 にエクスポート・送信・保存できるイベントが3つのグループに分かれています。必要なものをオンにするだけです。Adapty が提供するイベントの全一覧は[こちら](events)をご確認ください。
---
# File: google-cloud-storage
---
---
title: "Google Cloud Storage"
description: "Adapty と Google Cloud Storage を統合してデータを安全に保存する方法。"
---
Google Cloud Storage インテグレーションを有効にすると、[サブスクリプションイベント](events)と[ペイウォール訪問データ](paywall-metrics)を Google Cloud Storage バケットに一元的かつ安全に保存できます。
毎日UTC午前4時に、Adaptは前日のデータを含む.csvファイルをあなたのバケットにアップロードします。**イベント**データ、**ペイウォール訪問**データ、または**両方**を受信するかどうかを選択できます。また、任意の期間のデータを[手動](#manual-data-export)でエクスポートすることもできます。
インテグレーションを設定するには、Google CloudコンソールでBucketアクセスキーを[生成](#create-google-cloud-storage-credentials)し、それをAdaptyの設定に[追加](#set-up-google-cloud-storage-integration)します。
## アップロードスケジュールと所要時間 \{#upload-schedule-and-duration\}
AdapyはUTC 04:00に24時間ごとにGoogle Cloud Storageへデータをアップロードします。
ファイルには前の暦日(UTC)に作成されたイベントのデータが含まれます。3月8日にアップロードされるファイルには、3月7日の00:00:00〜23:59:59 UTCに作成されたすべてのイベントが含まれます。
キュー内のファイルの総数やご自身がリクエストしたデータ量によっては、処理に数時間かかる場合があります。初回アップロードに過去のデータが含まれる場合、以降の毎日のアップロードより時間がかかります。
## Google Cloud Storage連携の設定 \{#set-up-google-cloud-storage-integration\}
**書き込みアクセス権**を持つ有効なGoogle Cloudサービスアカウントキーが必要です。生成方法については、[認証情報の作成](#create-google-cloud-storage-credentials)セクションの手順に従ってください。
:::warning
イベントとペイウォール訪問に対して、それぞれ異なるバケットと認証情報を使用できます。ただし、**いずれか**の認証情報が無効な場合、[**両方のアップロードが失敗します**](#troubleshooting)。
:::
[**Integrations** -> **Google Cloud Storage**](https://app.adapty.io/integrations/google-cloud-storage) に移動し、必要なタブ(**Events** または **Paywall visits**)を開きます。連携を有効にします。
**Google Cloudサービスアカウントキー**を含むファイルをアップロードします。対象の**バケット**と**フォルダー**を指定します。変更を保存します。
### イベントデータのオプション設定 \{#optional-settings-for-event-data\}
レポートに含めるイベントを指定したり、イベントにカスタム名を設定したりできます。利用可能なイベントの全一覧は[イベント](events)の記事をご覧ください。
| 名前 | デフォルト | 説明 |
| ------------------------------ | ----------------- | ----------- |
| Exclude historical events | true | AdaptySDKをアプリに統合する前に発生したイベントの情報を除外します。ユーザーが1月10日に月次サブスクリプションを購入しました。3月1日のアプリアップデートが初めてAdapty SDKを含むものでした。
この設定が**オン**の場合、レポートには1月の「サブスクリプション開始」イベントも2月の「サブスクリプション更新」イベントも含まれません。3月10日の「サブスクリプション更新」イベント**は**含まれます。
ユーザーがサブスクリプションをキャンセルした理由。
使用可能な値:
**iOS & Android** — *voluntarily_cancelled*, *billing_error*, *refund*
**iOSのみ** — *price_increase*, *product_was_not_available*, *unknown*, *upgraded*
**Androidのみ** — *new_subscription_replace*, *cancelled_by_developer*
| | **android_app_set_id** | [AppSetId](https://developer.android.com/design-for-safety/privacy-sandbox/reference/adservices/appsetid/AppSetId) — 非収益化広告用途向けの、デバイスごと・開発者アカウントごとにリセット可能な一意のID。 | | **android_id** | Android 8.0(APIレベル26)以降では、アプリの署名キー、ユーザー、デバイスの組み合わせごとに一意な64ビットの数値(16進数文字列として表現)。詳細は[Androidデベロッパードキュメント](https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID)を参照してください。 | | **device** | エンドユーザーに表示されるデバイスモデル名。 | | **currency** | トランザクションの3文字通貨コード(ISO-4217)。 | | **store_country** | Apple/Google Storeが判定したプロファイルの国。 | | **attribution_source** | アトリビューションソース。 | | **attribution_network_user_id** | アトリビューションソースがユーザーに割り当てたID。 | | **attribution_status** | organic、non_organic、unknownのいずれか。 | | **attribution_channel** | マーケティングチャネル名。 | | **attribution_campaign** | マーケティングキャンペーン名。 | | **attribution_ad_group** | アトリビューションの広告グループ。 | | **attribution_ad_set** | アトリビューションの広告セット。 | | **attribution_creative** | アトリビューションのクリエイティブキーワード。 | | **attributes** | [カスタムユーザー属性](setting-user-attributes#custom-user-attributes)のJSON。モバイルアプリから送信するよう設定したカスタム属性が含まれます。送信するには、[Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook)ページで**Send User Attributes**オプションを有効にしてください。 | | **integration_ids** | プロファイルに関連付けられたすべての連携ID。ディクショナリ形式。例:{'mixpanel_user_id': 'mixpanelUserId-test', 'facebook_anonymous_id': 'facebookAnonymousId-test'} | ### ペイウォール訪問 \{#paywall-visits\} | カラム | 説明 | | :-------------------- | :----------------------------------------------------------------------------------------------------------- | | **profile_id** | AdapyユーザーID。 | | **customer_user_id** | 開発者のユーザーID。ユーザーのUUID、メールアドレス、その他のIDを設定できます。設定していない場合はNull。 | | **profile_country** | Apple/Google Storeが判定したプロファイルの国。 | | **install_date** | インストールが発生したISO 8601形式の日時。 | | **store** | *app_store*または*play_store*のいずれか。 | | **paywall_showed_at** | ペイウォールが顧客に表示された日時。 | | **developer_id** | トランザクションが発生したペイウォールの開発者(SDK)ID。 | | **ab_test_name** | トランザクションが発生したA/Bテストの名前。 | | **ab_test_revision** | トランザクションが発生したA/Bテストのリビジョン。 | | **paywall_name** | トランザクションが発生したペイウォールの名前。 | | **paywall_revision** | トランザクションが発生したペイウォールのリビジョン。 | ## トラブルシューティング \{#troubleshooting\} Adaptyはアップロードを開始する**前に**アクセスキーの有効性を確認します。Google Cloud Storageのキーが1つでも無効な場合、Adaptyは**アップロードを中断**してエラーをスローします。 アップロードが中断されないよう、キーの有効期限が切れる前に更新してください。**イベント**のキーを更新した場合は、**ペイウォール訪問**のキーも忘れずに更新してください(逆も同様です)。 --- # File: webhook-event-types-and-fields --- --- title: "Webhookイベントの種類とフィールド" description: "" --- Adaptyはサブスクリプションイベントに応じてWebhookを送信します。このセクションでは、これらのイベントの種類と各Webhookに含まれるデータについて説明します。 ## Webhookイベントタイプ \{#webhook-event-types\} すべてのイベントタイプをWebhookに送信するか、一部のみを選択して送信できます。受信データの内容やビジネスロジックの構築方法については、[イベントフロー](event-flows)を参照してください。不要なイベントタイプは、[Webhook連携の設定](set-up-webhook-integration#configure-webhook-integration-in-the-adapty-dashboard)時に無効化できます。また、必要に応じてAdaptyのデフォルトイベントIDを独自のIDに置き換えることも可能です。 | イベント名 | 説明 | |:-----------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | subscription_started | トライアル期間なしで有料サブスクリプションを開始したとき(つまり即座に課金されたとき)にトリガーされます。 | | subscription_renewed | サブスクリプションが更新され、ユーザーに課金されたときに発生します。このイベントはトライアルあり・なしを問わず、2回目以降の請求から記録されます。 | | subscription_renewal_cancelled | ユーザーがサブスクリプションの自動更新をオフにしました。有料サブスクリプション期間が終了するまでプレミアム機能へのアクセスは継続されます。 | | subscription_renewal_reactivated | ユーザーがサブスクリプションの自動更新を再度有効にしたときにトリガーされます。 | | subscription_expired | キャンセルされたサブスクリプションが完全に終了したときにトリガーされます。たとえば、12月12日にサブスクリプションをキャンセルしても12月31日まで有効な場合、イベントは12月31日に記録されます。 | | subscription_paused | ユーザーが[サブスクリプションの一時停止](https://developer.android.com/google/play/billing/lifecycle/subscriptions#pause)を有効にしたときに発生します(Android のみ)。 | | subscription_deferred | サブスクリプションの購入が[延期](https://adapty.io/glossary/subscription-purchase-deferral/)され、ユーザーが支払いを先送りしながらプレミアム機能へのアクセスを維持できる場合にトリガーされます。この機能は Google Play Developer API を通じて利用可能で、無料トライアルや支払いが困難なユーザーへの対応に活用できます。 | | non_subscription_purchase | 永続アクセスやゲーム内コインなどの消耗型アイテムといった、サブスクリプション以外のすべての購入。 | | trial_started | ユーザーがトライアルサブスクリプションを開始したときにトリガーされます。 | | trial_converted | トライアルが終了してユーザーに課金されたとき(初回購入)に発生します。たとえば、1月14日までトライアル期間があるにもかかわらず1月7日に課金された場合、イベントは1月7日に記録されます。 | | trial_renewal_cancelled | トライアル期間中にユーザーがサブスクリプションの自動更新をオフにしました。トライアルが終了するまでプレミアム機能へのアクセスは継続されますが、課金やサブスクリプションの開始は行われません。 | | trial_renewal_reactivated | トライアル期間中にユーザーがサブスクリプションの自動更新を再度有効にしたときに発生します。 | | trial_expired | サブスクリプションに転換されずにトライアルが終了したときにトリガーされます。 | | entered_grace_period | 支払い試行が失敗し、ユーザーがグレース期間(有効な場合)に入ったときに発生します。この期間中もユーザーはプレミアム機能にアクセスできます。 | | billing_issue_detected | 課金試行中に請求エラーが発生したとき(例:カード残高不足)にトリガーされます。 | | subscription_refunded | サブスクリプションが返金されたとき(例:Apple サポートによる返金)にトリガーされます。 | | non_subscription_purchase_refunded | サブスクリプション以外の購入が返金されたときにトリガーされます。 | | access_level_updated | ユーザーのアクセスレベルが更新されたときに発生します。 | :::note `subscription_renewal_reactivated` は、ユーザーがキャンセルした時点でアクティブだったプロダクト ID(**以前の**プロダクト ID)を保持します。これは、ユーザーが別のプロダクトを購入して再アクティブ化した場合でも同様です。Apple はキャンセル → 再アクティブ化の一連の流れを通じて同じ `original_transaction_id` を維持するため、このイベントは元のプロダクトを反映します。新しいプロダクトは、新しいプロダクトの課金が開始される次の `subscription_renewed` イベントで確認できます。 ::: ## Webhookイベントの構造 \{#webhook-event-structure\} Adaptyは、[Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook)ページの**Events names**セクションで選択したイベントのみを送信します。 Webhookイベントは JSON 形式でシリアライズされます。サーバーへの `POST` リクエストのボディには、以下の構造でラップされたシリアライズ済みイベントが含まれます。すべてのイベントは同じ構造に従いますが、フィールドの内容はイベントタイプ、ストア、および設定内容によって異なります。ユーザー属性は、設定した[カスタムユーザー属性](setting-user-attributes#custom-user-attributes)であるため、設定した内容が反映されます。アトリビューションデータのフィールドはすべてのイベントタイプで共通ですが、アトリビューションのリストはモバイルアプリで使用しているアトリビューションソースによって異なります。イベントの例を以下に示します: ```json title="Json" showLineNumbers { "profile_id": "00000000-0000-0000-0000-000000000000", "customer_user_id": "UserIdInYourSystem", "idfv": "00000000-0000-0000-0000-000000000000", "idfa": "00000000-0000-0000-0000-000000000000", "advertising_id": "00000000-0000-0000-0000-000000000000", "profile_install_datetime": "2000-01-31T00:00:00.000000+0000", "user_agent": "ExampleUserAgent/1.0 (Device; OS Version) Browser/Engine", "email": "john.doe@company.com", "event_type": "subscription_started", "event_datetime": "2000-01-31T00:00:00.000000+0000", "event_properties": { "store": "play_store", "currency": "USD", "price_usd": 4.99, "profile_id": "00000000-0000-0000-0000-000000000000", "cohort_name": "All Users", "environment": "Production", "price_local": 4.99, "original_price_usd": 4.99, "original_price_local": 4.99, "discount_amount_usd": 0, "discount_amount_local": 0, "base_plan_id": "b1", "developer_id": "onboarding_placement", "ab_test_name": "onboarding_ab_test", "ab_test_revision": 1, "paywall_name": "UsedPaywall", "proceeds_usd": 4.2315, "variation_id": "00000000-0000-0000-0000-000000000000", "purchase_date": "2024-11-15T10:45:36.181000+0000", "store_country": "AR", "event_datetime": "2000-01-31T00:00:00.000000+0000", "proceeds_local": 4.2415, "tax_amount_usd": 0, "transaction_id": "0000000000000000", "net_revenue_usd": 4.2415, "profile_country": "AR", "paywall_revision": "1", "profile_event_id": "00000000-0000-0000-0000-000000000000", "tax_amount_local": 0, "net_revenue_local": 4.2415, "vendor_product_id": "onemonth_no_trial", "profile_ip_address": "10.10.1.1", "consecutive_payments": 1, "rate_after_first_year": false, "original_purchase_date": "2000-01-31T00:00:00.000000+0000", "original_transaction_id": "0000000000000000", "subscription_expires_at": "2000-01-31T00:00:00.000000+0000", "profile_has_access_level": true, "profile_total_revenue_usd": 4.99, "promotional_offer_id": null, "store_offer_category": null, "store_offer_discount_type": null }, "event_api_version": 1, "profiles_sharing_access_level": [{"profile_id": "00000000-0000-0000-0000-000000000000", "customer_user_id": "UserIdInYourSystem"}], "attributions": { "appsflyer": { "ad_set": "Keywords 1.12", "status": "non_organic", "channel": "Google Ads", "ad_group": null, "campaign": "Social media influencers - Rest of the world", "creative": null, "created_at": "2000-01-31T00:00:00.000000+0000" } }, "user_attributes": {"Favourite_color": "Violet", "Pet_name": "Fluffy"}, "integration_ids": {"firebase_app_instance_id": "val1", "branch_id": "val2", "one_signal_player_id": "val3"}, "play_store_purchase_token": { "product_id": "product_123", "purchase_token": "token_abc_123", "is_subscription": true } } ``` ### イベントフィールド \{#event-fields\} イベントパラメーターはすべてのイベントタイプで共通です。 | **フィールド** | **型** | **説明** | |---|---|---| | **advertising_id** | UUID | 広告ID(Android のみ)。 | | **attributions** | JSON | [アトリビューションデータ](webhook-event-types-and-fields#attributions)。[Webhook 設定](https://app.adapty.io/integrations/customwebhook)で **Send Attribution** が有効な場合に含まれます。 | | **customer_user_id** | String | [ユーザーの識別](ios-quickstart-identify)時にアプリコードで設定したアプリ側のユーザー ID(UUID、メールアドレス、その他の ID)。アプリコードでユーザーを識別していない場合、または該当ユーザーが匿名(未ログイン)の場合は `null` になります。 | | **email** | String | Adapty SDK の [`updateProfile`](setting-user-attributes) メソッド、またはサーバーサイド API でプロファイルを作成・更新する際に設定したユーザーのメールアドレス。`email` の値を SDK や API メソッドに渡していない場合は `null` になります。 | | **event_api_version** | Integer | Adapty API のバージョン(現在: `1`)。 | | **event_datetime** | ISO 8601 | イベントのビジネス上の有効時刻。購入イベントなら購入日時、有効期限イベントなら有効期限など、Adapty がイベントを受信・送信した時刻ではありません。[ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) 形式(例: `2020-07-10T15:00:00.000000+0000`)。順序については下記の注記を参照してください。 | | **event_properties** | JSON | [イベントプロパティ](webhook-event-types-and-fields#event-properties)。 | | **event_type** | String | Adapty 形式のイベント名。全リストは[Webhook イベントタイプ](webhook-event-types-and-fields#webhook-event-types)を参照してください。 | | **idfa** | UUID | 広告識別子(Apple のみ)。[Adapty ダッシュボード](https://app.adapty.io/profiles/users)のプロファイルに表示される **IDFA**。トラッキング制限、キッズモード、プライバシー設定により利用できない場合は `null` になる場合があります。 | | **idfv** | UUID | ベンダー識別子(IDFV)。開発者ごとに一意の値。[Adapty ダッシュボード](https://app.adapty.io/profiles/users)のプロファイルに表示される **IDFV**。 | | **integration_ids** | JSON | Adapty SDK の `setIntegrationIdentifier` メソッド、またはサーバーサイド API でプロファイルを作成・更新する際に設定したユーザーのインテグレーション ID。利用できない場合またはインテグレーションが無効な場合は `null`。 | | **play_store_purchase_token** | JSON | [Play Store 購入トークン](webhook-event-types-and-fields#play-store-purchase-token)。[Webhook 設定](https://app.adapty.io/integrations/customwebhook)で **Send Play Store purchase token** が有効な場合に含まれます。 | | **profile_id** | UUID | Adapty が各プロファイルに対して自動生成するプロファイル ID。ユーザーを識別しない場合やログイン前に購入を許可している場合、1 つの Apple/Google ID が異なるプロファイル ID と紐付く可能性があります。詳しくは[Adapty の親プロファイルと継承プロファイルの仕組み](how-profiles-work#parent-and-inheritor-profiles)を参照してください。 | | **profile_install_datetime** | ISO 8601 | [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) 形式のインストール日時(例: `2020-07-10T15:00:00.000000+0000`)。 | | **profiles_sharing_access_level** | JSON | 現在のユーザープロファイルを除く、[アクセスレベルを共有している](general#6-sharing-paid-access-between-user-accounts)ユーザーの一覧。アプリでアクセスレベルの共有が有効になっている場合、同じ Apple/Google ID で使用されている他のプロファイルが含まれます。モバイルアプリコードではカスタム属性値を float または文字列として設定できますが、サーバーサイド API や過去データのインポートで受け取った属性は異なる形式で届く場合があります。その場合、boolean と integer の値は float に変換されます。
| :::note `event_datetime` はサブスクリプションのライフサイクルでイベントが発生した日時を表しており、Adapty が処理または配信した日時ではありません。そのため、複数のイベントが同じ `event_datetime` を持つ場合や、時系列順とは異なる順序で届く場合があります。たとえば、`subscription_expired` イベントの `event_datetime` が、それより前に配信された `subscription_renewal_cancelled` イベントの `event_datetime` より早い場合があります。イベントの順序付けに `event_datetime` を使用しないでください。代わりに、受信時刻を基準にイベントを並べ替え、`profile_event_id` またはトランザクション ID を使って重複を排除してください。 ::: ### アトリビューション \{#attributions\} アトリビューションデータを送信するには、[Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook) ページで **Send Attribution** オプションを有効にしてください。アトリビューションデータの送信を有効にしており、[アトリビューション連携](attribution-integration)を設定済みの場合、以下のデータがすべてのソースのイベントに付与されて送信されます。同じアトリビューションデータはすべてのイベントタイプに送信されます。 ```json title="Json" showLineNumbers { "attributions": { "appsflyer": { "ad_set": "sample_ad_set_123", "status": "non_organic", "channel": "sample_channel", "ad_group": "sample_ad_group_456", "campaign": "sample_ios_campaign", "creative": "sample_creative_789", "created_at": "2000-01-31T00:00:00.000000+0000", "network_user_id": "0000000000000-0000000" } } } ``` | フィールド名 | フィールド型 | 説明 | | :------------------ | :------------ | :------------------------------------------------- | | **ad_set** | String | アトリビューションの広告セット。 | | **status** | String | `organic`、`non_organic,`、または `unknown` のいずれか。 | | **channel** | String | マーケティングチャネル名。 | | **ad_group** | String | アトリビューションの広告グループ。 | | **campaign** | String | マーケティングキャンペーン名。 | | **creative** | String | アトリビューションのクリエイティブキーワード。 | | **created_at** | ISO 8601 date | アトリビューションレコードの作成日時。 | | **network_user_id** | String | アトリビューションソースがユーザーに割り当てたID。 | ### インテグレーション ID \{#integration-ids\} 現在、イベントで使用されているインテグレーション ID は以下のとおりです: - `adjust_device_id` - `airbridge_device_id` - `amplitude_device_id` - `amplitude_user_id` - `appmetrica_device_id` - `appmetrica_profile_id` - `appsflyer_id` - `branch_id` - `facebook_anonymous_id` - `firebase_app_instance_id` - `mixpanel_user_id` - `pushwoosh_hwid` - `one_signal_player_id` - `one_signal_subscription_id` - `tenjin_analytics_installation_id` - `posthog_distinct_user_id` ### Play Store の購入トークン \{#play-store-purchase-token\} このフィールドには、必要に応じて購入を再検証するために必要なすべてのデータが含まれています。[Webhookインテグレーションの設定](https://app.adapty.io/integrations/customwebhook)で **Send Play Store purchase token** オプションが有効になっている場合にのみ送信されます。 | Field | Type | Description | | :------------------ | :------ | :----------------------------------------------------------- | | **product_id** | String | Play Store で購入したプロダクトの一意識別子(SKU)。 | | **purchase_token** | String | この購入トランザクションを一意に識別するために Google Play が生成するトークン。 | | **is_subscription** | Boolean | 購入したプロダクトがサブスクリプション(`true`)か買い切り購入(`false`)かを示します。 | ### イベントプロパティ \{#event-properties\} イベントプロパティは、イベントの種類によって、また同じ種類のイベント間でも異なる場合があります。たとえば、App Store から発生したイベントには、`base_plan_id` のような Android 固有のプロパティは含まれません。 [アクセスレベル更新](webhook-event-types-and-fields#for-access-level-updated-event)イベントには固有のプロパティがあるため、専用セクションを設けています。同様に、[追加の税・収益イベントプロパティ](webhook-event-types-and-fields#additional-tax-and-revenue-event-properties)も特定のイベントタイプのみに該当するため、別セクションに分けています。 #### ほとんどのイベントタイプに共通 \{#for-most-event-types\} ほとんどのイベントタイプのイベントプロパティは共通です(**Access Level Updated** イベントは除き、そちらは別セクションで説明しています)。以下の表は、各プロパティと、それが特定のイベントに属するかどうかをまとめたものです。 :::note Adapty は [currencylayer.com](https://currencylayer.com/) の為替レート(8時間ごとに更新)を使用して他の通貨を USD に変換します。レートは**取引時点で固定**されるため、その後の変動は変換結果に影響しません。 ::: | フィールド | 型 | 説明 | |:------------------------------|:--------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **ab_test_name** | String | トランザクションが発生した[Adapty A/B テスト](ab-tests)の名前。 | | **ab_test_revision** | Integer | トランザクションが発生した A/B テストのリビジョン。 | | **base_plan_id** | String | Google Play ストアの[ベースプラン ID](https://support.google.com/googleplay/android-developer/answer/12154973)、または Stripe の[価格 ID](https://docs.stripe.com/products-prices/how-products-and-prices-work#use-products-and-prices)。 | | **cancellation_reason** | String |キャンセルの理由として考えられる値: `voluntarily_cancelled`、`billing_error`、`price_increase`、`product_was_not_available`、`refund`、`cancelled_by_developer`、`new_subscription_replace`、`upgraded`、`unknown`、`adapty_revoked`。
以下のイベントタイプに含まれます:
`subscription_cancelled`、`subscription_refunded`、`trial_cancelled`。 | | **cohort_name** | String | ユーザーに表示するペイウォールを決定した[オーディエンス](audience)の名前。 | | **consecutive_payments** | Integer | ユーザーが中断なくサブスクリプションを継続している期間数。現在の期間を含みます。 | | **currency** | String | ローカル通貨。 | | **developer_id** | String | トランザクションが発生した[プレースメント](placements)の ID。 | | **discount_amount_local** | Float | トランザクションに適用された割引額: Apple/Google の手数料を差し引く前の、標準価格と実際に請求された金額の差(ローカル通貨)。通常価格での購入の場合は `0`。無料トライアルの場合は何も請求されないため、標準価格の全額(`original_price_local`)と等しくなります。オファーが適用されたが標準価格が不明な場合は `null`(`original_price_local` を参照)。App Store の前払いオファーでは常に `null`: 単一の前払い請求が複数の請求期間をカバーするため、期間ごとの標準価格と比較できません。 | | **discount_amount_usd** | Float | `discount_amount_local` の USD 換算値。 | | **environment** | String | 可能な値は `Sandbox` または `Production`。 | | **event_datetime** | ISO 8601 date | イベントの日時。イベントのルートレベルの値と同じです。 | | **original_price_local** | Float | Apple/Google の手数料を差し引く前の、プロダクトの標準(非割引)価格(ローカル通貨)。サブスクリプションの場合は更新時の価格です。通常価格での購入では `price_local` と等しく、買い切り購入では常に `price_local` と等しくなります(ストアが別途標準価格を報告しないため)。割引購入でストアが信頼できる標準価格を報告しない場合は `null`(例: 自動更新がオフ、更新にオファーが適用されている、またはプロダクト変更が保留中の場合)。 | | **original_price_usd** | Float | `original_price_local` の USD 換算値。 | | **original_purchase_date** | ISO 8601 date | 継続サブスクリプションの場合、初回購入とは更新チェーンの最初のトランザクションであり、そのIDはオリジナルトランザクションIDと呼ばれ、更新チェーンをつなぐものです。以降のトランザクションはその延長です。初回購入日は、この最初のトランザクションの日時です。 | | **original_transaction_id** | String |継続サブスクリプションの場合、これは更新チェーンをつなぐオリジナルトランザクション ID です。オリジナルトランザクションはチェーンの最初のものであり、以降のトランザクションはその延長です。
延長がない場合、`original_transaction_id` は store_transaction_id と一致します。
| | **paywall_name** | String | トランザクションが発生したペイウォールの名前。 | | **paywall_revision** | String | トランザクションが発生したペイウォールのリビジョン。デフォルト値は 1。 | | **price_local** | Float | Apple/Google の手数料を差し引く前の、トランザクションで請求された金額(ローカル通貨)。無料トライアルは何も請求されないため `null`。 | | **price_usd** | Float | Apple/Google の手数料を差し引く前の、トランザクションで請求された金額(USD)。無料トライアルは何も請求されないため `null`。 | | **profile_country** | String | プロファイルの IP を基に Adapty が判定した国。 | | **profile_event_id** | UUID | 重複排除に使用できる一意のイベント ID。 | | **profile_has_access_level** | Boolean | プロファイルにアクティブなアクセスレベルがあるかどうかを示すブール値。 | | **profile_id** | UUID | Adapty が生成したプロファイル ID。イベントのルートレベルの値と同じです。 | | **profile_ip_address** | String | プロファイルの IP アドレス(IPv4 または IPv6。利用可能な場合は IPv4 が優先されます)。[アプリ設定](https://app.adapty.io/settings/general)で **Collect users' IP addresses** が無効になっている場合は `null`。 | | **profile_total_revenue_usd** | Float | 返金を差し引いたプロファイルの総収益(USD)。 | | **promotional_offer_id** | String | 使用された[プロモーションオファー](offers)の Adapty ID。ダッシュボードでオファーを作成する際にこの ID を設定します。 | | **purchase_date** | ISO 8601 date | プロダクトが購入された日時。 | | **rate_after_first_year** | Boolean | サブスクリプションが 1 年間継続更新した後に手数料の軽減(通常 15%)の対象となるかどうかを示すブール値。手数料率はプログラムの適格性や国によって異なります。詳細は[ストア手数料と税金](controls-filters-grouping-compare-proceeds#display-gross-or-net-revenue)を参照してください。 | | **store** | String | プロダクトが購入されたストア。標準値: **app_store**、**play_store**、**stripe**、**paddle**。Apple App Store、Google Play ストア、または Stripe におけるプロダクト ID。
実際のストアトランザクションなしでアクセスが付与された場合、`vendor_product_id` は以下のいずれかになります:
自動更新サブスクリプションの場合、更新チェーンをつなぐオリジナルトランザクション ID。オリジナルトランザクションはチェーンの最初のもので、以降のトランザクションはその延長である。
延長がない場合、`original_transaction_id` は store_transaction_id と一致する。
最初の購入のトランザクション識別子。 | | **paywall_name** | String | トランザクションが発生したペイウォールの名前。 | | **paywall_revision** | String | トランザクションが発生したペイウォールのリビジョン。デフォルト値は 1。 | | **profile_country** | String | プロファイルの IP を基に Adapty が判定した国。 | | **profile_event_id** | UUID | 重複排除に使用できる一意のイベント ID。 | | **profile_has_access_level** | Boolean | プロファイルにアクティブなアクセスレベルがあるかどうかを示す Boolean 値。 | | **profile_id** | UUID | Adapty の内部ユーザープロファイル ID。 | | **profile_ip_address** | String | プロファイルの IP アドレス(IPv4 または IPv6。利用可能な場合は IPv4 が優先される)。[アプリ設定](https://app.adapty.io/settings/general)で **Collect users' IP addresses** が無効になっている場合は `null`。 | | **profile_total_revenue_usd** | Float | プロファイルの累計収益(返金を含む)。 | | **purchase_date** | ISO 8601 date | プロダクトを購入した日時。 | | **renewed_at** | ISO 8601 date | アクセスが更新される日時。 | | **starts_at** | ISO 8601 date | アクセスレベルが開始する日時。 | | **store** | String | プロダクトを購入したストア。標準値: **app_store**、**play_store**、**stripe**、**paddle**。ストア(Apple / Google / Stripe)内のプロダクト ID。
実際のストアトランザクションなしでアクセスが付与された場合、`vendor_product_id` は以下のいずれかになる:
1. **エンドポイントを設定する:** 1. サーバーが **Content-Type** ヘッダーを `application/json` に設定したAdaptyリクエストを処理できることを確認します。 2. サーバーがAdaptyの検証リクエストを受信し、任意の `2xx` ステータスとJSONボディで応答するよう設定します。 3. 接続が確認されたら、[サブスクリプションイベントを処理します](#subscription-events)。 2. **[Adapty ダッシュボード](#configure-webhook-integration-in-the-adapty-dashboard)でwebhook連携を設定して有効化します。** [Adaptyのイベントをカスタムイベント名にマッピング](#configure-webhook-integration-in-the-adapty-dashboard)することもできます。本番環境に切り替える前に、**Sandbox環境**でテストすることをおすすめします。 3. **Adaptyがサーバーに検証リクエストを送信します。** 4. **サーバーが** `2XX` ステータスとJSONボディで**応答します。** 5. **Adaptyが有効なレスポンスを受信すると、サブスクリプションイベントの送信を開始します。** ## Adaptyリクエストを処理するサーバーを設定する \{#set-up-your-server-to-process-adapty-requests\} AdaptyはWebhookエンドポイントに2種類のリクエストを送信します。 1. [検証リクエスト](#verification-request): 接続が正しく設定されているか確認するための初回リクエストです。このリクエストにはイベントは含まれず、Adapty ダッシュボードのWebhook連携で **Save** ボタンをクリックした瞬間に送信されます。エンドポイントが検証リクエストを正常に受信したことを確認するため、エンドポイントは検証レスポンスを返す必要があります。 2. [サブスクリプションイベント](#subscription-events): Adaptyサーバーでイベントが作成されるたびに送信される標準リクエストです。サーバーは特定のレスポンスを返す必要はありません。Adaptyサーバーが必要とするのは、メッセージを正常に受信した場合に標準の200コードHTTPレスポンスを受け取ることだけです。 ### 検証リクエスト \{#verification-request\} Adapty ダッシュボードでwebhook連携を有効にすると、Adaptyは空のJSONオブジェクト `{}` をボディとして含むPOST検証リクエストを送信します。 エンドポイントの **Content-Typeヘッダー** が `application/json` になるよう設定してください。つまり、サーバーのエンドポイントは受信するWebhookリクエストのペイロードがJSON形式でフォーマットされることを想定している必要があります。 サーバーは2xxステータスコードで応答し、以下のような有効なJSONレスポンスを返す必要があります。 ```json title="Json" {} ``` Adaptyが正しい形式かつ2xxステータスコードの検証レスポンスを受信すると、AdaptyのWebhook連携は完全に設定された状態になります。 ### サブスクリプションイベント \{#subscription-events\} サブスクリプションイベントは **Content-Type** ヘッダーが `application/json` に設定された状態で送信され、JSON形式のイベントデータが含まれます。可能なイベントタイプとリクエスト構造については、[Webhookイベントの種類とフィールド](webhook-event-types-and-fields)を参照してください。 ## Adapty ダッシュボードでWebhook連携を設定する \{#configure-webhook-integration-in-the-adapty-dashboard\} Adaptyでは、本番イベントとApple・Sandbox環境またはGoogleテストアカウントから受信するテストイベントに対して、別々のフローを設定できます。 :::tip Adaptyは環境(本番とサンドボックス)ごとに1つのWebhook URLをサポートしています。複数のサービスにイベントを配信するには、Webhookを自分のバックエンドに向けてそこからファンアウトしてください。 ::: 本番イベントには、コールバックの送信先URLを指定する **Production endpoint URL** フィールドを使用します。また、**Authorization header value for production endpoint** フィールドも設定してください。これはサーバーがAdaptyイベントを認証するためのヘッダーです。**Authorization header value for production endpoint** フィールドに指定した値は、変更や追加なしにそのまま `Authorization` ヘッダーとして使用されることにご注意ください。 テストイベントには、**Sandbox endpoint URL** と **Authorization header value for sandbox endpoint** フィールドをそれぞれ使用します。 Webhook連携を設定するには: 1. Adapty ダッシュボードで [Integrations -> Webhook](https://app.adapty.io/integrations/customwebhook) を開きます。
2. トグルをオンにして連携を開始します。
4. 連携フィールドに入力します。
| フィールド | 説明 |
| ------------------------------------------------------ | ------------------------------------------------------------ |
| **Production endpoint URL** | AdaptyがHTTP POSTリクエストを本番環境のイベントとして送信するURL。 |
| **Authorization header value for production endpoint** | 本番環境でサーバーがAdaptyからのリクエストを認証するためのヘッダー。このフィールドに指定した値は、変更や追加なしにそのまま `Authorization` ヘッダーとして使用されることにご注意ください。
必須ではありませんが、セキュリティ強化のために強くお勧めします。
| サンドボックス環境でのテスト用に、さらに2つのフィールドが利用可能です。 | テストフィールド | 説明 | | --------------------------------------------------- | ------------------------------------------------------------ | | **Sandbox endpoint URL** | AdaptyがサンドボックスHTTP POSTリクエストを送信するURL。 | | **Authorization header value for sandbox endpoint** |サンドボックス環境でのテスト中にサーバーがAdaptyからのリクエストを認証するためのヘッダー。このフィールドに指定した値は、変更や追加なしにそのまま `Authorization` ヘッダーとして使用されることにご注意ください。
必須ではありませんが、セキュリティ強化のために強くお勧めします。
| 4. (任意)受信するイベントを選択して名前をマッピングします。様々な状況でどのイベントが発生するかは、[イベントフロー](event-flows)をご確認ください。 イベントIDがAdaptyで使用されているものと異なる場合は、システム内のIDをそのまま維持し、[Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook) ページの **Events names** セクションでデフォルトのAdaptyイベントIDをご自身のIDに置き換えてください。 イベントIDには任意の文字列を使用できます。Webhookを処理するサーバーのイベントIDと、Adapty ダッシュボードに入力したIDが一致していることを確認してください。有効なイベントのイベントIDを空のままにすることはできません。
5. その他のフィールドや設定は任意です。必要に応じて使用してください。
| 設定 | 説明 |
| :--------------------------------- | :----------------------------------------------------------- |
| **Send Trial Price** | 有効にすると、Adaptyは **Trial Started** イベントの `price_local` と `price_usd` フィールドにサブスクリプション価格を含めます。 |
| **Exclude Historical Events** | ユーザーがAdapty SDKを含むアプリをインストールする前に発生したイベントを除外するオプションです。これによりイベントの重複を防ぎ、正確なレポートを確保します。例えば、ユーザーが1月10日に月次サブスクリプションを有効化し、3月6日にAdapty SDK付きのアプリにアップデートした場合、Adaptyは3月6日より前のイベントを省略し、以降のイベントを保持します。 |
| **Send user attributes** | このオプションを有効にすると、言語設定などのユーザー固有の属性が送信されます。これらの属性は `user_attributes` フィールドに表示されます。詳細については、[イベントフィールド](webhook-event-types-and-fields#event-fields)を参照してください。 |
| **Send attribution** | このオプションをオンにすると、`attributions` フィールドにアトリビューション情報(AppsFlierデータなど)が含まれます。詳細は[アトリビューションデータ](webhook-event-types-and-fields#attributions)セクションを参照してください。 |
| **Send Play Store purchase token** | このオプションをオンにすると、必要に応じて購入の再検証に必要なPlay Storeトークンを受け取れます。有効にすると、イベントに `play_store_purchase_token` パラメータが追加されます。その内容の詳細については、[Play Store購入トークン](webhook-event-types-and-fields#play-store-purchase-token)セクションを参照してください。 |
6. **Save** ボタンをクリックして変更を確定することを忘れないでください。
**Save** ボタンをクリックした瞬間、Adaptyは検証リクエストを送信し、サーバーからの検証レスポンスを待ちます。
### 送信するイベントを選択してイベント名をマッピングする \{#choose-events-to-send-and-map-event-names\}
受信したいイベントの横にあるトグルを有効にして、サーバーで受信するイベントを選択します。Adaptyで使用されているイベント名と異なる名前を使用していて、そのままの名前を維持したい場合は、[Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook) ページの **Events names** セクションでデフォルトのAdaptyイベント名をご自身のものに置き換えてマッピングを設定できます。
イベント名には任意の文字列を使用できます。有効なイベントのフィールドを空のままにすることはできません。誤ってAdaptyのイベント名を削除してしまった場合は、[サードパーティ連携に送信するイベント](events)のトピックからいつでも名前をコピーできます。
## Webhookイベントを処理する \{#handle-webhook-events\}
Webhookは通常、イベント発生後5〜60秒以内に配信されます。ただし、キャンセルイベントはユーザーがサブスクリプションをキャンセルしてから最大2時間後に配信される場合があります。
サーバーのレスポンスステータスコードが200〜404の範囲外の場合、Adaptyは指数バックオフで再送を試みます。最初の再試行は初回の失敗からおよそ**1分後**に行われ、その後は試行ごとに間隔が倍になり、最大9回の再試行が24時間にわたって行われます。Adaptyが応答する前にイベントボディの基本的な検証のみを行うようWebhookを設定することをお勧めします。サーバーがイベントを処理できず、Adaptyに再試行させたくない場合は、200〜404の範囲内のステータスコードを使用してください。また、時間のかかるタスクは非同期で処理し、Adaptyに素早く応答するようにしてください。Adaptyが10秒以内にレスポンスを受信しない場合、その試行は失敗とみなされ、再試行が行われます。
---
# File: test-webhook
---
---
title: "Webhookインテグレーションのテスト"
description: "AdaptyでWebhookインテグレーションをテストし、サブスクリプションイベントの追跡を自動化します。"
---
インテグレーションを設定したら、次はテストを行いましょう。サンドボックスと本番のどちらのインテグレーションもテストできます。まずサンドボックスから始めて、以下の項目を十分に検証することをおすすめします:
- イベントが送信され、正常に配信されること。
- 過去のイベント、**Trial started** イベントのサブスクリプション価格、アトリビューション、ユーザー属性、Google Play ストアの購入トークンについて、送信・非送信のオプションが正しく設定されていること。
- イベント名が正しくマッピングされており、サーバーで処理できること。
## テスト方法 \{#how-to-test\}
インテグレーションのテストを始める前に、以下が完了していることを確認してください:
1. [Webhookインテグレーションの設定](set-up-webhook-integration)のトピックに従ってWebhookインテグレーションを設定済みであること。
2. [Apple App StoreでのIn-App Purchaseのテスト](test-purchases-in-sandbox)および[Google Play StoreでのIn-App Purchaseのテスト](testing-on-android)のトピックに従って環境を設定済みであること。テストアプリが本番環境ではなくサンドボックス環境でビルドされていることを確認してください。
3. Webhookに送信するよう選択したイベントを発生させる購入・トライアル開始・返金などを実行済みであること。例えば、**Subscription started** イベントを取得するには、新しいサブスクリプションを購入します。
## 結果の検証 \{#validation-of-the-result\}
### イベント送信成功時の結果 \{#successful-sending-events-result\}
インテグレーションが正常に機能した場合、イベントはインテグレーションの **Last sent events** セクションに表示され、**Success** ステータスになります。
### イベント送信失敗時の結果 \{#unsuccessful-sending-events-result\}
| 問題 | 解決策 |
|-----|--------|
| イベントが表示されない | 購入が完了しなかったため、イベントが作成されませんでした。解決策については[テスト購入のトラブルシューティング](troubleshooting-test-purchases)のトピックを参照してください。 |
| イベントが表示され、**Sending failed** ステータスになっている | 配信可否はHTTPステータスに基づいて判定し、**200〜399の範囲外**はすべて失敗とみなします。
詳しい原因を確認するには、以下に示すように失敗したイベントの **Sending failed** ステータスにマウスを重ねてください。
|
---
# File: handle-integration-errors
---
---
title: "インテグレーションのエラーを処理する"
description: "インテグレーションのエラーを処理する"
---
アトリビューション、メッセージング、またはアナリティクスのインテグレーションを使用する際に、いくつかの一般的なエラーが発生することがあります。トラブルシューティングのケースについては、このガイドを参照してください。
## データの不一致 \{#data-discrepancy\}
**原因**: Adapty SDK が含まれているアプリバージョンを使用していないユーザーが存在するために発生する可能性があります。
**解決策**: データの一貫性を確保するために、ユーザーに Adapty SDK が含まれているバージョンへのアップデートを促すことができます。
## ネットワークエラー \{#network-errors\}
**原因**: Adapty サーバーとインテグレーションサーバー間のインターネット接続が途切れた可能性が高いです。
**解決策**: このような問題は通常長く続かず、影響を受けるイベントの数もごく少数です。
## インテグレーションサーバーがイベントの処理に失敗した \{#integration-server-failed-to-process-the-event\}
**原因**: インテグレーションが正しく設定されていません。
**解決策**: ドキュメントのインテグレーションに関する記事を参照してください。Adapty ダッシュボード、サードパーティツール側、およびアプリコードの両方で、すべてのセットアップ手順を完了していることを確認してください。
## インテグレーションデータが不足している \{#missing-integration-data\}
**原因**: プロファイルにインテグレーション固有の ID が含まれていません。これはアプリコードでインテグレーションが正しく設定されていない場合に発生することがあります。
**解決策**: ドキュメントのインテグレーションに関する記事を参照してください。アプリコードにコードスニペットのメソッドを実装し、それらのメソッドが実際にユーザープロファイルと連携していることを確認してください。
## インテグレーションの認証情報が不足している \{#missing-integration-credentials\}
**原因**: インテグレーションの一部の認証情報が不足しているか、正しくありません。
**解決策**: Adapty ダッシュボードでそのインテグレーションの認証情報をすべて確認してください。バージョンまたは環境の不一致が原因で問題が発生することがあります。
## イベントの有効期限が切れた \{#the-event-has-expired\}
**原因**: インテグレーション設定で **Exclude historical events** オプションが有効になっており、イベントの作成日がシステム内のプロファイル作成日より前になっています。
これは、数年前に開始されたトランザクションのチェーンが、最近作成されたプロファイルのレシート検証を通じて Adapty に届いた場合に発生することがあります。
**解決策**: 新しいイベントでこれが発生しないようにしてください。過去のイベントをインテグレーションに送信したい場合は、**Exclude historical events** を無効にしてください。
## 無効/未対応のイベントタイプ \{#disabledunsupported-event-type\}
**原因**: このインテグレーションでイベントがサポートされていないか、インテグレーションのセットアップ時に無効にされています。たとえば、`access_level_updated` イベントはほとんどのインテグレーションでサポートされていません。
**解決策**: インテグレーションのドキュメントで、そのインテグレーションがこのイベントタイプをサポートしているか確認してください。サポートされている場合は、Adapty ダッシュボードでそのイベントタイプがインテグレーション設定で有効になっていることを確認してください。
---
# File: manage-adapty-with-ai
---
---
title: "AIエージェントとコーディングツールでAdaptyを管理する"
description: "AdaptyをAIと組み合わせるすべての方法 — コーディングエージェントでSDKを統合したり、LLMでアナリティクスを取得したり、AIツールにAdaptyのドキュメントを提供したりできます。"
---
AdaptyはAIコーディングツールやエージェントと連携できます。SDKの統合、アナリティクスへの質問、エディタを離れずにAdaptyのドキュメントを検索するなど、さまざまな用途に活用できます。このページでは利用可能なツールと、それぞれの対象ユーザーを紹介します。
## AIでAdapty SDKを統合する \{#integrate-the-adapty-sdk-with-ai\}
AIコーディングツールを使ってAdapty SDKをアプリに追加する方法は2つあります。どちらもCursor、Claude、その他のAIアシスタントで動作します。
### スキルベースの統合 \{#skill-based-integration\}
Adapty SDK統合スキルは、AIコーディングツールからワンコマンドで統合全体を実行します。ガイド付きの自動セットアップが必要な場合に使用してください。
プラットフォームを選択してください: [iOS](adapty-sdk-integration-skill) · [Android](adapty-sdk-integration-skill-android) · [React Native](adapty-sdk-integration-skill-react-native) · [Flutter](adapty-sdk-integration-skill-flutter) · [Unity](adapty-sdk-integration-skill-unity) · [Kotlin Multiplatform](adapty-sdk-integration-skill-kmp) · [Capacitor](adapty-sdk-integration-skill-capacitor)
### ステップバイステップの統合 \{#step-by-step-integration\}
適切なドキュメントを順番に提供しながら、AIツールを統合の各段階でガイドします。各ステップを確認しながら進めたい場合に使用してください。
プラットフォームを選択してください: [iOS](adapty-cursor) · [Android](adapty-cursor-android) · [React Native](adapty-cursor-react-native) · [Flutter](adapty-cursor-flutter) · [Unity](adapty-cursor-unity) · [Kotlin Multiplatform](adapty-cursor-kmp) · [Capacitor](adapty-cursor-capacitor)
## コマンドラインからAdaptyを管理する \{#manage-adapty-from-the-command-line\}
[Adapty Developer CLI](developer-cli-quickstart)を使用すると、ダッシュボードを開かずにターミナルからAdaptyのエンティティ(アプリ、アクセスレベル、プロダクト、ペイウォール、プレースメント)を管理できます。コマンドラインツールなので、AIコーディングエージェントから直接実行できます。
## データについて質問する \{#ask-about-your-data\}
AIコーディングエージェントをExport Analytics APIに向けると、収益、リテンション、LTVなどの指標を自然言語でクエリできます。MCPサーバーは不要です。
[AIにアナリティクスデータについて質問する](export-analytics-with-ai)
## AIツールにAdaptyのドキュメントを提供する \{#give-your-ai-tool-the-adapty-docs\}
### プレーンテキストのドキュメント \{#plain-text-docs\}
すべてのAdaptyドキュメントはMarkdown形式で利用できます。ページURLに`.md`を追加するか、タイトルの下にある **Copy for LLM** をクリックしてください。より広いコンテキストを提供するには、[`llms.txt`](https://adapty.io/docs/ja/llms.txt)インデックスや[`ios-llms.txt`](https://adapty.io/docs/ja/ios-llms.txt)などのプラットフォーム別サブセットをツールに渡してください。
### Context7 \{#context7\}
[Context7](https://context7.com/adaptyteam/adapty-docs)はAdaptyのドキュメントをAIツールに提供するMCPサーバーですが、コードスニペットのみをインデックスし、散文全体はインデックスしません。簡単なコード例を調べる場合に使用してください。完全なガイダンスが必要な場合は、上記のプレーンテキストのドキュメントをツールに提供してください。Context7はCursor、Claude Code、Windsurf、その他のMCP対応ツールで動作します。
---
# File: export-analytics-with-ai
---
---
title: "AI にアナリティクスデータについて質問する"
description: "Export Analytics API を使用して、AIコーディングエージェントで Adapty アナリティクスを自然言語でクエリします。"
---
Ask an AI coding agent about your Adapty analytics in plain language — revenue, conversions, retention, LTV — and let it pull the numbers for you. Point a tool that can make API calls at the [Export Analytics API](https://adapty.io/docs/ja/export-analytics-api.md), and it queries your metrics on demand.
## 質問できる内容 \{#what-you-can-ask-about\}
Export Analytics API は、Adapty ダッシュボードのチャートで確認できる指標と同じものを返します。各指標には固有のオペレーションがあります。
| 指標 | カバー範囲 | オペレーション |
| --- | --- | --- |
| Revenue、MRR、ARR、ARPU | 期間・国・キャンペーン別にグループ化された収益 | [retrieveAnalyticsData](https://adapty.io/docs/ja/api-export-analytics/operations/retrieveAnalyticsData.md) |
| コホートリテンション | 特定のコホートのサブスクライバーが支払いを継続する期間 | [retrieveCohortData](https://adapty.io/docs/ja/api-export-analytics/operations/retrieveCohortData.md) |
| コンバージョン率 | あるステップやチャネルから次のステップに進むユーザー数 | [retrieveConversionData](https://adapty.io/docs/ja/api-export-analytics/operations/retrieveConversionData.md) |
| チャーンとファネル | ユーザーが離脱する箇所と解約スピード | [retrieveFunnelData](https://adapty.io/docs/ja/api-export-analytics/operations/retrieveFunnelData.md) |
| ライフタイムバリュー(LTV) | 時間経過によるユーザーセグメントあたりの平均収益 | [retrieveLTVData](https://adapty.io/docs/ja/api-export-analytics/operations/retrieveLTVData.md) |
| リテンション | 一定日数後もアクティブなユーザーの割合 | [retrieveRetentionData](https://adapty.io/docs/ja/api-export-analytics/operations/retrieveRetentionData.md) |
APIパラメーターとフィルターの全一覧については、[APIリファレンス](https://adapty.io/docs/ja/api-export-analytics.md)をご覧ください。
## 始める前に \{#before-you-start\}
次の3つが必要です:
- **データのある Adapty アカウント**: この API はダッシュボードのチャートと同じ指標を返すため、アプリがすでにアナリティクスを収集している必要があります。
- **シークレット API キー**: [App settings → General](https://app.adapty.io/settings/general) の **Secret key** フィールドで確認できます。キーはアプリごとに異なるため、アプリごとに別々のキーを使用してください。エージェントがチャットに貼り付けずに読み取れるよう、環境変数(例: `ADAPTY_SECRET_KEY`)に保存してください。
- **API を呼び出せる AI ツール**: Claude Code、Cursor、またはフェッチツールを備えた Claude Desktop などが使えます。claude.ai や ChatGPT のような通常のチャットツールは直接 API を呼び出せません。
## エージェントにAPI仕様を提供する \{#give-your-agent-the-api-spec\}
[OpenAPI仕様](https://adapty.io/docs/ja/api-specs/export-analytics-api.yaml)には、すべてのエンドポイント、認証ヘッダー、リクエストボディ、レスポンス例が記載されています。エージェントがこの仕様を参照することで、コードを書かなくても正しいリクエストを構築できます。
エージェントにURLで仕様を渡す:
- **URLを貼り付ける**: エージェントがURLを取得できる場合は、`https://adapty.io/docs/ja/api-specs/export-analytics-api.yaml` を渡して仕様を読むよう指示してください。
- **フェッチツールを使用する**: エージェントにURLを取得するツール(例:MCP フェッチサーバー)がある場合は、同じURLを指定してください。
仕様にはベースURLとして `https://api-admin.adapty.io` が設定されているため、キーが環境に設定されていれば、エージェントは必要なものをすべて揃えています。
## データについて質問する \{#ask-about-your-data\}
スペックを読み込み、APIキーを環境変数に設定したら、取得したい指標を平易な言葉で説明してください。
プロンプトの例:
```
What was my MRR at the end of each month this year, and how does it compare to last year?
Show my trial-to-paid conversion rate for the last 90 days, broken down by product.
Which countries drive the most revenue from my yearly subscription? Top 10.
How is week-1 retention trending for subscribers who started in the last 6 months?
What's the refund rate on my annual plan since launch, by month?
Compare LTV for paid-campaign users vs. organic over the last year, and export it as CSV.
```
エージェントはリクエストを適切なオペレーションにマッピングし、環境変数からキーを読み取ってデータを返します。レスポンスはデフォルトでJSONです。スプレッドシートに適したファイルが必要な場合はCSVをリクエストしてください — エージェントはリクエストボディの `format` を `csv` に設定します。
:::warning
シークレットキーは環境変数に保存してください — チャットに貼り付けたり、ルールファイルにコミットしたりしないでください。キーはアプリ固有のため、漏洩した場合は **Settings → General** でローテーションしてください。[APIキーのローテーション](https://adapty.io/docs/ja/export-analytics-api-authorization.md)を参照してください。
:::
## セッションをまたいで再利用するための初期設定 \{#set-up-once-for-repeated-use\}
毎回セットアップを繰り返さなくて済むよう、エージェントが再利用できる場所にスペックとキーを保存しておきましょう。
- **スペックリンクを保存する**: スペックのURLをエージェントのルールやメモリファイル(例:`CLAUDE.md`やCursorのルールファイル)に追加しておくと、毎セッションで自動的に読み込まれます。
- **キーを環境変数に保存する**: `ADAPTY_SECRET_KEY`をシェルプロファイルやツールのシークレットストアに保存しておけば、二度と貼り付ける手間がかかりません。
- **よく使うプロンプトを保存するか、カスタムスキルを作成する**: よく使う質問を保存済みプロンプトとして管理するか、カスタムスキルやスラッシュコマンドとしてまとめておくと、オンデマンドでレポートを実行できます。
## 制限事項 \{#limits\}
以下の制約に注意してください。
- **レート制限**: APIはAPIキーごとに1秒あたり2リクエストまで許可されています。超過すると`429 Too Many Requests`エラーが返ります。`429`が返ったときは待ってからリトライするようエージェントに伝えてください。
- **アプリごとのキー**: 各キーは1つのアプリにのみ有効です。複数アプリのデータを取得する場合は、アプリごとに対応するキーを提供してください。
- **出力フォーマット**: レスポンスはデフォルトでJSON形式です。CSVでエクスポートするには、リクエストボディで`format`を`csv`に設定してください。
認証とリクエストのルールの詳細は、[認証とリクエスト形式](export-analytics-api-authorization)を参照してください。
---
# File: handle-webhooks-with-ai
---
---
title: "ウェブフックでAdaptyのサブスクリプションイベントを処理する"
description: "ウェブフックを使ってサーバーでAdaptyのサブスクリプションイベントを受信・処理する方法 — エンドポイントの設定、認証、ペイロード、テストを1ページで解説。"
---
Webhookを使うと、サーバーがAdaptyのサブスクリプションイベント(購入、更新、キャンセル、請求エラー、返金)をリアルタイムで受信できます。アクセス権の付与、バックエンドとの同期、ワークフローのトリガーなどに活用できます。このガイドでは、エンドポイントの設定から検証済みの統合テストまでを1ページで説明し、AIコーディングエージェントを使ってハンドラーを自動生成する方法も紹介します。
:::tip
AIコーディングエージェントを使っていますか?タイトル下の **Copy for LLM** をクリックして、このページ全体をエージェントに貼り付けてください。セットアップ、ペイロード、ハンドラーロジックがすべて含まれています。
:::
## Adapty ウェブフックの仕組み \{#how-adapty-webhooks-work\}
- **一方向かつリアルタイム**: イベントが発生すると、Adapty がサーバーに HTTP `POST` を送信します。ポーリング不要です。
- **2 種類のリクエスト**: インテグレーション保存時に送信される一回限りの確認リクエストと、継続的なサブスクリプションイベントの 2 種類があります。
- **環境ごとに 1 つの URL**: 本番環境とサンドボックス環境それぞれに別々のエンドポイントを設定します。
- **各リクエストへの応答が必要**: `2xx` ステータスをすばやく返してください。失敗した場合、Adapty はリトライします。
## エンドポイントを構築する \{#build-your-endpoint\}
2種類のリクエストを処理する公開HTTPSエンドポイントを作成します。
- **確認リクエスト**: インテグレーションを保存したときに1回送信されます。JSONボディは空(`{}`)です。`2xx` ステータスとJSONボディを返してください。
- **サブスクリプションイベント**: イベントをボディに含む継続的な `POST` リクエストです。10秒以内に `200` を返し、重い処理は非同期で行ってください。
シークレット文字列を選んで環境変数(例:`ADAPTY_WEBHOOK_SECRET`)として保存してください。リクエストのたびに `Authorization` ヘッダーがその値と一致するか検証し、一致しない場合はリクエストを拒否します。この同じシークレットを、次のステップでダッシュボードに入力します。
```javascript title="webhook.js"
const app = express();
app.use(express.json());
const WEBHOOK_SECRET = process.env.ADAPTY_WEBHOOK_SECRET;
app.post("/adapty/webhook", (req, res) => {
// 1. Verify the shared secret Adapty echoes back.
if (req.get("Authorization") !== WEBHOOK_SECRET) {
return res.sendStatus(401);
}
// 2. Acknowledge fast, then process asynchronously.
res.status(200).json({});
// 3. The verification request has an empty body — nothing to handle.
const event = req.body;
if (!event.event_type) return;
switch (event.event_type) {
case "subscription_started":
case "subscription_renewed":
case "trial_converted":
// Grant or extend access.
break;
case "subscription_expired":
case "subscription_refunded":
// Revoke access.
break;
default:
break;
}
});
app.listen(3000);
```
Adaptyはエンドポイントを保存した瞬間に検証リクエストを送信するため、インテグレーションを設定する前にエンドポイントをパブリックなHTTPS URLにデプロイしておいてください。
### 主なイベントとペイロード \{#key-events-and-the-payload\}
すべてのイベントは同じエンベロープを共有しています。フィールドはイベントタイプ、ストア、有効にしたオプションによって異なります。以下は `subscription_started` イベントの簡略版です。
```json title="Example event"
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": "UserIdInYourSystem",
"event_type": "subscription_started",
"event_datetime": "2024-11-15T10:45:36.181000+0000",
"event_properties": {
"store": "play_store",
"currency": "USD",
"price_usd": 4.99,
"vendor_product_id": "onemonth_no_trial",
"transaction_id": "0000000000000000",
"original_transaction_id": "0000000000000000",
"subscription_expires_at": "2024-12-15T10:45:36.181000+0000",
"profile_event_id": "00000000-0000-0000-0000-000000000000"
},
"event_api_version": 1
}
```
最もよく扱うイベント:
| イベントタイプ | 発火タイミング |
| --- | --- |
| `subscription_started` | ユーザーが有料サブスクリプションを開始したとき |
| `subscription_renewed` | サブスクリプションが正常に更新・課金されたとき |
| `subscription_renewal_cancelled` | ユーザーが自動更新をオフにしたとき(アクセスは有効期限まで継続) |
| `subscription_expired` | 更新されなかったサブスクリプションの有効期限が切れてアクセスが終了したとき |
| `trial_started` | ユーザーが無料トライアルを開始したとき |
| `trial_converted` | トライアルが有料サブスクリプションに転換したとき |
| `billing_issue_detected` | 更新時の支払いが失敗したとき |
| `subscription_refunded` | サブスクリプションの購入が返金されたとき |
全イベントの一覧とフィールドの詳細については、[Webhookイベントのタイプとフィールド](https://adapty.io/docs/ja/webhook-event-types-and-fields.md)を参照してください。
:::warning
`event_datetime` でイベントを並べないでください。これはイベントのビジネス上の発生時刻であるため、イベントが順序どおりに届かなかったり、同じタイムスタンプを持つ場合があります。並べ替えには自分の受信時刻を使用し、`profile_event_id` またはトランザクションIDを使って重複を排除してください。
:::
## Adapty でウェブフックを設定する \{#configure-the-webhook-in-adapty\}
1. Adapty ダッシュボードで [Integrations → Webhook](https://app.adapty.io/integrations/customwebhook) を開きます。
2. インテグレーションをオンにします。
3. **Production endpoint URL** に、デプロイしたエンドポイントの HTTPS URL を入力します。
4. **Authorization header value for production endpoint** に、エンドポイントが検証に使用するシークレットと同じ値を入力します。Adapty はすべてのリクエストの `Authorization` ヘッダーにこの値を付与して送信します。省略可能ですが、強く推奨されます。
5. 先にサンドボックスでテストする場合は、**Sandbox endpoint URL** とその **Authorization header value** も入力します。
6. **Save** をクリックします。Adapty はすぐにエンドポイントへ検証リクエストを送信し、エンドポイントが `2xx` を返すとセットアップが完了します。
送信するイベントの選択、イベント名のマッピング、オプションフィールド(トライアル価格、過去のイベント、アトリビューション、ユーザー属性、Play Store トークン)の有効化については、[Webhook インテグレーションの設定](https://adapty.io/docs/ja/set-up-webhook-integration.md)をご参照ください。
## AIコーディングエージェントで構築する \{#build-it-with-your-ai-coding-agent\}
このガイドとリファレンスドキュメントをMarkdown形式(任意のページURLに`.md`を追加)でAIコーディングエージェントに渡し、使用しているスタックを伝えて、ハンドラーのひな形を生成させましょう。
- [Webhookイベントの種類とフィールド](https://adapty.io/docs/ja/webhook-event-types-and-fields.md)
- [Webhook連携のセットアップ](https://adapty.io/docs/ja/set-up-webhook-integration.md)
プロンプトの例:
```
Read these Adapty webhook docs, then write a webhook handler for my Express app:
verify the Authorization header against ADAPTY_WEBHOOK_SECRET, answer the
verification request, acknowledge events with 200, and grant or revoke access
based on event_type.
```
The agent writes the handler code, but it can't deploy your endpoint or configure the dashboard — host the endpoint yourself and set the URL and secret in **Integrations → Webhook**.
## Webhookをテストする \{#test-your-webhook\}
本番環境に移行する前に、サンドボックスでテストしましょう:
1. 上記の手順に従って、サンドボックス用のエンドポイントとシークレットを設定します。
2. サンドボックスアプリで、購入・トライアル開始・返金などを行い、イベントをトリガーします。
3. インテグレーションの **Last sent events** セクションを開きます。正常に配信されたイベントには **Success** ステータスが表示されます。
**Sending failed** と表示されている場合、サーバーが200〜399の範囲外のステータスを返しています。ステータスにカーソルを合わせると詳細を確認できます。テストの詳細な手順については、[Webhookインテグレーションのテスト](https://adapty.io/docs/ja/test-webhook.md)をご覧ください。
## 制限事項 \{#limits\}
- **10秒以内に応答すること**: 時間内にレスポンスが返らない場合、Adapty はその試みを失敗とみなして再試行します。
- **再試行**: ステータスが 200〜404 の範囲外の場合、Adapty は指数バックオフで再試行します — 24時間以内に最大 9 回まで。
- **キャンセルの遅延**: キャンセルイベントは届くまで最大 2 時間かかる場合があります。
- **環境ごとに URL は 1 つ**: 複数のサービスにイベントを配信したい場合は、自分のバックエンドに Webhook を向け、そこからファンアウトしてください。
---
# File: server-side-api-with-ai
---
---
title: "バックエンドからサブスクリプションアクセスを確認・付与する"
description: "Adapty のサーバーサイド API を使って、ユーザーのサブスクリプションがアクティブかどうかを確認し、手動でアクセスを付与する方法を AI コーディングエージェントとともに解説します。"
---
バックエンドから Adapty のサーバーサイド API を使って、ユーザーのアクティブなサブスクリプションを確認したり、アクセスを手動で付与したりできます。このガイドでは、最もよく使われる 2 つの呼び出し — `getProfile` と `grantAccessLevel` — を取り上げ、AI コーディングエージェントを使って自分のスタック向けに統合を実装する方法を説明します。
:::tip
AI コーディングエージェントを使っていますか?タイトル下の **Copy for LLM** をクリックして、このページ全体をエージェントに貼り付けてください。必要な呼び出し、フィールド、注意点がすべて含まれています。
:::
## 始める前に \{#before-you-start\}
- **シークレット API キー**: [App settings → General](https://app.adapty.io/settings/general) の **Secret key** フィールドで確認できます。キーはアプリごとに異なります。環境変数(例: `ADAPTY_SECRET_KEY`)に保存し、`Authorization: Api-Key {key}` の形式で送信してください。
- **ベース URL**: すべてのリクエストは `https://api.adapty.io` に送信します。
- **ユーザーの識別方法**: `adapty-customer-user-id`(独自のユーザー ID — アプリでユーザーを識別している場合のみ使用可能)または `adapty-profile-id`(Adapty のプロファイル ID)のいずれかを送信します。どちらも同じように使えるので、どちらか一方を使用してください。
## サブスクリプションを確認する \{#check-a-subscription\}
ステータスを確認するには、`getProfile` を `GET` で呼び出し、ユーザー識別子をヘッダーとして渡します。リクエストボディは不要です。
```javascript title="check-access.js"
const res = await fetch("https://api.adapty.io/api/v2/server-side-api/profile/", {
headers: {
"Authorization": `Api-Key ${process.env.ADAPTY_SECRET_KEY}`,
"adapty-customer-user-id": userId,
},
});
const { data } = await res.json();
function hasActiveAccess(profile, accessLevelId = "premium") {
const level = profile.access_levels?.find(a => a.access_level_id === accessLevelId);
if (!level) return false;
if (level.is_in_grace_period) return true;
if (!level.expires_at) return true; // lifetime / non-expiring
return new Date(level.expires_at) > new Date(); // not expired yet
}
if (hasActiveAccess(data)) {
// unlock premium features
}
```
SDKのプロファイルとは異なり、サーバーサイドのレスポンスには **`is_active` フィールドがありません**。ステータスは `access_levels[].expires_at` から自分で判定してください。`null` の場合は永続アクセス、未来の日付の場合はアクティブ、過去の日付の場合は期限切れです。`is_in_grace_period` はアクティブとして扱ってください。プロファイルおよびアクセスレベルのフィールドの詳細については、[getProfile](https://adapty.io/docs/ja/api-adapty/operations/getProfile.md) を参照してください。
## アクセスレベルを手動で付与する \{#grant-access-manually\}
購入なしで有料機能を解放したい場合(プロモーションコード、投資家・ベータアクセス、サポート対応など)は、`grantAccessLevel` を `POST` で呼び出します。
```javascript title="grant-access.js"
await fetch("https://api.adapty.io/api/v2/server-side-api/purchase/profile/grant/access-level/", {
method: "POST",
headers: {
"Authorization": `Api-Key ${process.env.ADAPTY_SECRET_KEY}`,
"adapty-customer-user-id": userId,
"Content-Type": "application/json",
},
body: JSON.stringify({ access_level_id: "premium" }), // 一時的なアクセスには "expires_at" を追加
});
```
- **アクセスレベルはダッシュボード(**Access levels**)に事前に存在している必要があります** — `access_level_id` はその識別子であり、新しい名前ではありません。
- **手動付与はアナリティクスに表示されません**。Webhook インテグレーションと Event Feed にのみ配信されるため、収益やコンバージョンのチャートには反映されません。
リクエストとレスポンスの詳細については、[grantAccessLevel](https://adapty.io/docs/ja/api-adapty/operations/grantAccessLevel.md) を参照してください。
## AIコーディングエージェントで構築する \{#build-it-with-your-ai-coding-agent\}
このガイドとAPIスペックをMarkdown形式(任意のページURLに`.md`を追加)でAIコーディングエージェントに渡し、使用するスタックを伝えれば、あとはエージェントがAPIコールを書いてくれます:
- [OpenAPI仕様](https://adapty.io/docs/ja/api-specs/adapty-api.yaml)
- [getProfile](https://adapty.io/docs/ja/api-adapty/operations/getProfile.md)
- [grantAccessLevel](https://adapty.io/docs/ja/api-adapty/operations/grantAccessLevel.md)
プロンプト例:
```
Using the Adapty server-side API spec, write backend functions to check whether a
user has an active "premium" access level (GET /profile/, derive status from
expires_at — there's no is_active field) and to grant it (grantAccessLevel).
Authenticate with ADAPTY_SECRET_KEY and identify users by adapty-customer-user-id.
```
The agent writes the code, but it can't run your backend or set your keys — you provide the secret key and the user identifiers.
## 制限 \{#limits\}
- **レート制限**: アプリごとに1分あたり最大40,000リクエスト。
- **アプリ固有のキー**: 各キーは1つのアプリにのみ使用可能です。アプリごとに対応するキーを使用してください。
- **識別子の必須指定**: すべてのリクエストには `adapty-customer-user-id` または `adapty-profile-id` が必要です。
---
# File: test-purchases-in-sandbox
---
---
title: "サンドボックステスト"
description: "サンドボックス環境で購入をテストして、スムーズなトランザクションを確認しましょう。"
---
Adapty ダッシュボードとモバイルアプリの設定が完了したら、アプリ内課金のテストを実施しましょう。
**注意:** テストツールはいずれも、プロダクトの購入テスト時にユーザーへの課金は行いません。App Store はテスト環境での購入や返金に関するメールを送信しません。
:::note
**サンドボックスのトランザクションはすべてのアナリティクスチャートから除外されます。** 個々のプロファイルページやイベントフィードには引き続き表示されます。
:::
:::info
アプリ内課金テストを進めるにあたり、以下を確認してください。
- ストア連携、プロダクトの追加、Adapty SDK の連携に関する[クイックスタート](quickstart)ガイドが完了していること。
- プロダクトが App Store Connect で [**Ready to submit**](InvalidProductIdentifiers#step-2-check-products) としてマークされていること。
:::
## サンドボックステスト \{#sandbox-testing\}
2. テストユーザーの詳細を入力します。テストする **Country or Region** を必ず設定してください。これはリージョンのプロダクト利用可否や購入通貨に影響します。
:::tip
- Gmail や iCloud をお使いの場合は、[プラス記号サブアドレッシング](https://www.wikihow.com/Use-Plus-Addressing-in-Gmail)を使って既存のメールアドレスを再利用できます。
- 実際には存在しないランダムなメールアドレスも使用できますが、後でテストデバイスにサインインする際に 2 段階認証(2FA)を拒否するようにしてください。
:::
3. **Create** をクリックします。
### ステップ 2. デベロッパーモードを有効にする \{#step-2-enable-the-developer-mode\}
:::note
テストデバイスでデベロッパーモードが**すでに有効になっている**場合、または **Mac デバイスをお持ちでない**場合は、このステップをスキップしてください。
:::
Xcode がインストールされた Mac とテストデバイスのケーブルが必要です。
1. Mac で Xcode を開きます。TestFlight でアプリ内課金をテストする場合は、Xcode がインストールされていれば十分で、アプリを開く必要はありません。
2. ケーブルを使ってテストデバイスを Mac に接続します。
3. テストデバイスで **Settings > Privacy & Security > Developer Mode** に移動し、**Developer Mode** をオンにします。
### ステップ 3. TestFlight からアプリをダウンロードする \{#step-3-download-the-app-from-testflight\}
:::info
このステップは TestFlight でテストする場合にのみ適用されます。Xcode でアプリをビルドする場合はスキップしてください。
:::
TestFlight へのアプリの提出については、[Apple のドキュメント](https://developer.apple.com/documentation/StoreKit/testing-in-app-purchases-with-sandbox#Prepare-for-sandbox-testing)を参照してください。
TestFlight アプリをダウンロードする前に、テストデバイスで本番の Apple アカウントにサインインしていることを確認してください。その後、TestFlight からテストするアプリをダウンロードします。
:::danger
ダウンロードしたらアプリを開かないでください。次のステップに進んでください。
誤って開いてしまった場合は、テストデバイスからアプリを削除して再度ダウンロードしてください。そうしないと購入履歴がクリーンな状態にならず、アプリ内課金のテストでエラーが発生する可能性があります。
:::
### ステップ 4. サンドボックステストアカウントに切り替える \{#step-4-switch-to-sandbox-test-account\}
4. **Sandbox Apple Account** セクションまでスクロールし、**Sign In** をタップします。
5. サンドボックス Apple アカウントの認証情報でサインインします。
### ステップ 5. 購入履歴をクリアする \{#step-5-clear-purchase-history\}
新しいサンドボックステストアカウントを作成して切り替えたばかりの場合は、このステップをスキップできます。このステップは同じサンドボックステストアカウントを使って繰り返しテストする場合にのみ適用されます。
1. テストデバイスで **Settings > Developer > Sandbox Apple Account** に移動します。
2. ポップアップメニューから **Manage** を選択します。
3. **Account Settings** に移動し、**Clear Purchase History** をタップします。
:::danger
このステップは同じサンドボックステストアカウントを使ってテストを繰り返すたびに必要です。この場合、[サンドボックステストアカウントからサインアウト](#step-4-switch-to-sandbox-test-account)した後、再度サインインしてテストデバイス上の購入履歴キャッシュをクリアする必要があります。
:::
### ステップ 6. Xcode でビルドして実行する \{#step-6-build-in-xcode-and-run\}
:::info
このステップは Xcode ビルドでテストする場合にのみ適用されます。TestFlight を使用する場合はスキップしてください。
:::
1. テストデバイスを Mac に接続します。
2. Xcode を開きます。
3. ツールバーの **Run** をクリックするか、**Product > Run** を選択して、接続されたデバイスでアプリをビルドして実行します。
ビルドが成功すると、Xcode はデバイス上でアプリを起動し、デバッグエリアにデバッグセッションを開きます。
これでデバイス上でのテストの準備が整いました。
### ステップ 7. テスト購入を行う \{#step-7-make-test-purchase\}
アプリを開き、ペイウォールからテスト購入を行います。
完了したら、[テスト購入の検証](validate-test-purchases)の記事で結果を確認してください。
### ステップ 8. テストを続ける \{#step-8-keep-testing\}
テスト環境の準備が整いました。再度テストしたい場合は、[サンドボックスアカウントの購入履歴をクリア](https://developer.apple.com/help/app-store-connect/test-in-app-purchases/manage-sandbox-apple-account-settings/)してください。
## テストに関する問題 \{#testing-issues\}
以下はアプリテスト時によく発生する問題です。
### TestFlight の問題 \{#testflight-issues\}
**サンドボックステストアカウントなしで TestFlight を使用している場合**は購入履歴をクリアできないため、さまざまな問題や誤ったテスト結果が生じます。
誤って[サンドボックステストアカウントへの切り替え](#step-4-switch-to-sandbox-test-account)を忘れてアプリを一度でも開いてしまうと、TestFlight は購入履歴を本番の Apple アカウントに紐付けてしまい、予期せぬ問題が発生します。
修正するには、以下の手順に従ってください。
1. テストデバイスからアプリを削除します。
2. [サンドボックステスト](#sandbox-testing)の手順に従います。
:::note
アプリを再インストールするだけでなく、サンドボックステストアカウントに切り替え、購入履歴をクリアし、サンドボックステストアカウントを使ってアプリを起動することが重要です。
:::
### 共有アクセスレベルの問題 \{#shared-access-levels-issues\}
同じサンドボックステストアカウントを使って繰り返しテストすると、テストユーザーの[共有アクセスレベル](sharing-paid-access-between-user-accounts)で予期しない動作が発生することがあります。
ユーザーが継承されたアクセスレベルを持っているか確認するには、Adapty ダッシュボードの [Profiles & Segments](https://app.adapty.io/profiles/users) からユーザーのプロファイルを開いてください。
ユーザーが継承されたアクセスレベルを持っている場合は、正確なテスト結果を得るために以下の手順に従ってください。
1. 親プロファイルを削除します。
2. テストデバイスからアプリを削除します。
3. [TestFlight からアプリをダウンロードします](#step-3-download-the-app-from-testflight)。
4. [サンドボックステストアカウントに切り替えます](#step-4-switch-to-sandbox-test-account)。
5. [購入履歴をクリアします](#step-5-clear-purchase-history)。
6. [アプリを開いてテスト購入を行います](#step-6-make-test-purchase)。
:::note
購入履歴のクリアがストア側の購入をリセットします。親プロファイルの削除は Adapty 側の記録を削除するだけです。再利用したアカウントがアクセスを保持し続ける理由と、実際に機能するリセット方法については、[テスターのサブスクリプションのリセット](#resetting-a-testers-subscription)を参照してください。
:::
### TestFlight でのアプリの更新 \{#updating-app-in-testflight\}
TestFlight アプリが更新された場合:
1. テストデバイスからアプリを削除します。
2. [TestFlight からアプリをダウンロードします](#step-3-download-the-app-from-testflight)。
3. [サンドボックステストアカウントに切り替えます](#step-4-switch-to-sandbox-test-account)。
4. [購入履歴をクリアします](#step-5-clear-purchase-history)。
5. [アプリを開いてテスト購入を行います](#step-6-make-test-purchase)。
## テスターのサブスクリプションのリセット \{#resetting-a-testers-subscription\}
サンドボックス環境では、購入は Adapty プロファイルではなく **Apple サンドボックスアカウント**に紐付けられます。プロファイルに対して行う操作(削除やアクセスレベルの編集)は、ストアアカウントから購入を削除しません。次回の再インストールや同期時に、SDK は同じトランザクションを再紐付けし、テスターは再びアクセスを得ます。
以下の表は、各リセット操作が何を変更するか、またその後テスターがどうなるかを示しています。
| 操作 | Adapty プロファイル | Apple サンドボックスアカウント | テスターのその後のアクセス |
| :--- | :--- | :--- | :--- |
| Adapty ダッシュボードでプロファイルを削除 | 削除済み | 変更なし | **復元される** — 再インストール時に新しいプロファイルが同じトランザクションチェーンを再紐付け |
| [Delete profile API](api-adapty/operations/deleteProfile) でプロファイルを削除 | 削除済み | 変更なし | **復元される** — ダッシュボードでの削除と同じ |
| **Add access level** で過去の有効期限を追加 | 次の同期時に上書き | 変更なし | 次の更新時に**復元される** — 有効なサブスクリプションが将来の有効期限を再適用 |
| [Revoke access level API](api-adapty/operations/revokeAccessLevel) を呼び出す | 即時失効、`access_level_updated`(`is_active=false`)が発火 | 変更なし | 次の更新や再インストール時に**復元される** — サンドボックスのリセットとして信頼性が低い |
| サンドボックスアカウントでサブスクリプションをキャンセル | 直接変更なし | サブスクリプションキャンセル済み | 更新が停止し、現在の期間が終了するとアクセスが終了。テスターは再度プロダクトを購入可能 |
| 新しい Apple サンドボックスアカウントでサインイン | 新しいプロファイル | 新しい空のアカウント | **クリーン** — 繰り返しテストに推奨 |
### テスターをクリーンな状態にリセットする \{#reset-a-tester-to-a-clean-state\}
購入フローの繰り返しテストには、テストごとに新しい Apple サンドボックスアカウントを使用してください。アカウントの作成は[ステップ 1](#step-1-create-sandbox-test-account-in-app-store-connect)、デバイスでの切り替えは[ステップ 4](#step-4-switch-to-sandbox-test-account) に従ってください。既存のサンドボックスアカウントを再利用する場合は、先に[購入履歴をクリア](#step-5-clear-purchase-history)してください。Adapty プロファイルを削除してもクリアされません。
### 既存テスターのアクセスを削除する \{#remove-access-from-an-existing-tester\}
テスターのアクセスを削除するには、有効期限を過去に設定したり Revoke access level API を呼び出したりしないでください。サンドボックスでは、サブスクリプションは数分ごとに自動更新されます。更新のたびに同じトランザクションチェーンに将来の有効期限が復元されるため、アクセスは自動的に復活します。Revoke access level API は `access_level_updated`(`is_active=false`)イベントを発火しますが、次の更新でそれが上書きされます。
アクセスを実際に停止するには、ストア側でサブスクリプションをキャンセルしてください。テストデバイスで **Settings > Developer > Sandbox Apple Account** に移動し、**Manage** を選択して、サブスクリプションをキャンセルします。更新が停止し、現在の期間が終了するとアクセスが終了します。
### プロファイルを削除するとアクセスが復活する理由 \{#why-deleting-the-profile-brings-access-back\}
テスターがアプリを再インストールすると、Adapty はサンドボックスアカウントの購入履歴を受け取り、新しいインストールを既存の購入に紐付けます。購入は削除したプロファイルではなく、ストアアカウントに紐付いています。
- **匿名プロファイル**: `customer_user_id` なしで再インストールすると、[有料アクセス共有](sharing-paid-access-between-user-accounts)の設定に関わらず、常にストアアカウントのアクセスレベルを継承します。
- **識別済みプロファイル**: アクセスが新しい `customer_user_id` に引き継がれるかどうかは、有料アクセス共有の設定によります。
Adapty がこれらのプロファイルをチェーンとして紐付ける仕組みについては、[プロファイルの仕組み](how-profiles-work#parent-and-inheritor-profiles)を参照してください。
## テストサブスクリプション \{#test-subscriptions\}
サンドボックステストアカウントを使ってアプリをテストする際、サンドボックス内の各テスターのサブスクリプション更新レートを設定できます。サブスクリプション更新レートの編集について詳しくは、[Apple の公式ドキュメント](https://developer.apple.com/help/app-store-connect/test-in-app-purchases/manage-sandbox-apple-account-settings)を参照してください。
デフォルトでは、サブスクリプションは停止するまで最大 12 回更新されます。スケジュールは以下の通りです。
| サブスクリプション期間 | 1 週間 | 1 ヶ月 | 2 ヶ月 | 3 ヶ月 | 6 ヶ月 | 1 年 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| サブスクリプション更新速度 | 3 分 | 5 分 | 10 分 | 15 分 | 30 分 | 1 時間 |
| 請求リトライ期間 | 10 分 | 10 分 | 10 分 | 10 分 | 10 分 | 10 分 |
| 請求グレース期間 | 3 分 | 5 分 | 5 分 | 5 分 | 5 分 | 5 分 |
:::note
テストトランザクションが [Event feed](validate-test-purchases) に表示されるまで最大 10 分かかることに注意してください。
:::
サンドボックスは、更新・請求リトライ・グレース期間のアプリとバックエンドの処理を確認するために使用してください。本番環境の更新タイミングを予測するためのものではありません。上記の加速・上限付きスケジュールは本番環境とは異なります。バックエンドテスト用にサーバーでトランザクションを再実行するには、[Set transaction API](api-adapty/operations/setTransaction) を使用してください。
## テストオファー \{#test-offers\}
オファーのテストでは、適格性が正しく機能するために、すべてのユーザーレシートを削除する必要があります。
オファーをテストする最も確実な方法は、まったく新しい[サンドボックステストアカウント](#step-1-create-sandbox-test-account-in-app-store-connect)を使用することです。同じサンドボックステストアカウントを使って繰り返しテストすると、予期しない動作が発生する可能性があります。
:::danger
同じサンドボックステストアカウントを使って繰り返しテストする場合は、適格性関連の問題を避けるため、必ず[購入履歴をクリア](#step-5-clear-purchase-history)してください。
:::
---
# File: local-sk-files
---
---
title: "XcodeでのStoreKitテスト"
description: "サンドボックス環境でアプリ内課金をテストして、スムーズなトランザクションを確認しましょう。"
---
XcodeでのStoreKitテストを使用すると、サンドボックスアカウントを設定することなく、アプリ内課金をローカルでテストできます。
このテストを行うには、次の手順が必要です:
1. [Adaptyでプロダクトを作成し](quickstart-products)、**App Store product ID** を割り当てます。
2. Xcodeで、ローカルの [StoreKit設定ファイル](https://developer.apple.com/documentation/xcode/setting-up-storekit-testing-in-xcode) を作成し、プロダクトを追加します。プロダクトIDは、AdaptyのApp Store product IDと同じである必要があります。
3. StoreKit設定ファイルをビルドスキーマに追加し、アプリをビルドします。エミュレータまたはデバイスで起動してください。
## XcodeでのStoreKitテストを使うべきか? \{#should-i-use-storekit-testing-in-xcode\}
このテスト方法は、ビルドをその場でテストしたい、またはXcodeの機能を使ってさまざまな購入シナリオをテストしたいアプリ開発者に最も便利です。
ただし、このテストはローカルで行われるため、Adaptyダッシュボードには変更が表示されないことを覚えておいてください。本番環境でアプリを公開する前に、[サンドボックス環境](test-purchases-in-sandbox)を使用して[プロファイルの操作](ios-quickstart-identify)をテストすることをおすすめします。
StoreKitテストを**使うべき**場合:
- 購入ロジックをテストしたい
- Xcodeのツールを使ってさまざまな購入シナリオを再現したい(例:キャンセルされた支払いや返金)
- エミュレータを使ってテストしたい
StoreKitテストを**使うべきでない**場合:
- プロファイル関連のロジックをテストしたい
- アプリ内での操作がAdaptyダッシュボードに反映されるか確認したい
- 開発チーム以外とアプリを共有してテストしたい
## ステップ1. StoreKit設定ファイルを作成する \{#step-1-create-a-storekit-configuration-file\}
StoreKit設定ファイルを作成するには、Xcodeで以下の手順を実行します:
1. **File > New > File from template** をクリックします。次に、**StoreKit Configuration File** を選択して **Next** をクリックします。
2. ファイル名を入力します。次に、App Store Connectにすでにプロダクトがあるかどうかに応じて:
- **Sync this file with an app in App Store Connect** を選択:App Store Connectのすべてのプロダクトを含む設定ファイルを作成し、ローカルでテストできるようにします。
- **Sync this file with an app in App Store Connect** を選択しない:空の設定ファイルを作成し、プロダクトを手動で追加する必要があります。
**Next** をクリックします。
3. アプリをターゲットとして追加しないでください。そのまま進んでください。App Store Connectから同期されたプロダクトを使用している場合は、[ステップ2](#step-2-add-the-configuration-file-to-the-build-scheme)に進んでください。
4. App Store Connectからプロダクトを同期していない場合は、左下の **+** をクリックして、プロダクトタイプを選択します。
5. サブスクリプショングループ名を入力し、**Next** をクリックします。
6. 参照名を入力します。**Product ID** フィールドに、AdaptyのプロダクトのApp Store product IDを入力します。
7. 設定ファイルで価格、オファー、その他のプロダクト設定を構成します。または、さらにプロダクトを追加します。
## ステップ2. 設定ファイルをビルドスキームに追加する \{#step-2-add-the-configuration-file-to-the-build-scheme\}
この設定ファイルを使ってアプリをビルドするには、ビルドスキームに追加する必要があります。テスト用と本番用のスキームを分けるのがベストプラクティスなので、テスト用に新しいスキームを作成することをおすすめします:
1. 上部のアプリ名をクリックして、**New scheme** を選択します。
2. スキームの名前を入力し、**OK** をクリックします。
3. アプリ名を再度クリックし、**Edit scheme** を選択します。**StoreKit configuration** でローカルの設定ファイルを選択すると、ビルド時に使用されます。
## ステップ3. ビルドとテスト \{#step-3-build--test\}
これで、App Storeバックエンドに接続することなくアプリをビルドし、アプリ内課金をテストできます。プロダクトを購入し、ローカルでアクセスレベルを取得できます。これらの変更はAdaptyダッシュボードには反映されませんが、有料機能のアンロックをローカルでテストすることは引き続き可能です。
XcodeでのStoreKitテストで利用できる他の機能については、[こちら](https://developer.apple.com/documentation/xcode/testing-in-app-purchases-with-storekit-transaction-manager-in-code)をご覧ください。
---
# File: testing-on-android
---
---
title: "Google Play StoreでのIn-App Purchaseのテスト"
description: "AdaptyでAndroidのサブスクリプション購入をテストする方法。"
---
AndroidアプリのIn-App Purchase(IAP)テストは、アプリを一般公開する前の重要なステップです。サンドボックステストは、ユーザーに実際の料金を請求することなく、IAPを安全かつ効率的にテストできる方法です。このガイドでは、Google Play StoreでAndroid向けにIAPのサンドボックステストを行う手順を説明します。
:::note
**サンドボックスのトランザクションはすべてのアナリティクスチャートから除外されます。** 個々のプロファイルページやイベントフィードには引き続き表示されます。
:::
## テスト環境 \{#testing-environment\}
Androidアプリの最適なパフォーマンスを確認するには、エミュレーターではなく実機でテストすることを推奨します。エミュレーターでのテストに成功した実績もありますが、Googleは実機の使用を推奨しています。
エミュレーターを使用する場合は、Google Playがインストールされていることを確認してください。これにより、アプリが正常に動作しているかどうかを確認しやすくなります。
## 1. アプリテスト用のテストアカウントを設定する \{#1-set-up-test-account-for-app-testing\}
開発の後半段階でスムーズにテストを行うため、アプリ内課金テスト用のテストユーザーを事前に設定しておく必要があります。このユーザーは、Androidテストデバイスで最初にログインするアカウントになります。
Androidデバイスのプライマリアカウントは、端末の初期化(すべてのデータが消去されます)を行わないと変更できません。そのため、初期化が必要にならないよう、テストユーザーアカウントを適切に設定することが重要です。
:::important
テストアカウントの設定方法は、使用するデバイスによって異なります。
- テスト専用デバイスがある場合は、**別のテストアカウント(新しいGmailアカウント)**を作成してください。
- テスト専用デバイスがない場合は、**個人アカウント**を使用し、一時的に**ライセンステスト**を有効にすることができます。
- Androidデバイスをまったく持っていない場合は、**別のテストアカウントを作成してエミュレーターで使用**できます。ただし、この方法では実機固有の問題をすべて検出できるわけではないため、推奨はしません。
:::
## 2. ライセンステストを有効にする \{#2-enable-license-testing\}
テストユーザーアカウントを設定したら、アプリのライセンステストを設定する必要があります。以下の手順に従ってください。
1. Google Play Consoleのサイドバーで **Settings** に移動し、**Monetization** セクションの **License testing** を選択します。
2. 既存のライセンステスターリストを選択するか、新しいリストを作成します。
3. テストに使用するアカウントをリストに追加して変更を保存します。チームメンバーもテストを行う場合は、メールアドレスをリストに追加することでグループ全体にアクセスを付与できます。
## 3. クローズドトラックを作成してテストアカウントを追加する \{#3-create-closed-track-and-add-test-account-to-it\}
テストを開始するには、署名済みバージョンのアプリをクローズドトラックに公開する必要があります。
1. アプリを開き、メニューから **Test and release > Testing > Closed testing** を選択します。そこで **Create track** をクリックします。
2. クローズドテストトラック名を入力し、**Create track** をクリックします。
3. テスタリストをトラックに追加します。
4. **How testers join your test** セクションからリンクをコピーし、テストアカウントでログインしているデバイスに送信します。テストデバイスでリンクを開き、そのユーザーをテスターとして登録します。
:::warning
テストを正常に行うために、以下の点に注意してください。
- オプトインURLを開くと、Playアカウントがテストモードとしてマークされます。この手順を完了しないと、プロダクトが読み込まれません。
- 開発者がテストビルドに異なるアプリケーションIDを使用することがよくありますが、Google Play ServicesはアプリケーションIDを使用してアプリ内課金を検索するため、問題が発生します。
- テストデバイスにPINが設定されていない場合、テストユーザーが消耗型アイテムを購入できるにもかかわらず、サブスクリプションを購入できないケースがあります。この場合、「Something went wrong」という不明なメッセージが表示されることがあります。テストデバイスにPINが設定されており、Google Play Storeにログインしていることを確認してください。
:::
## 4. 署名済みAPKをクローズドトラックにアップロードする \{#4-upload-a-signed-apk-to-the-closed-track\}
署名済みAPKを生成するか、Android App Bundleを使用して、先ほど作成したクローズドトラックに署名済みAPKをアップロードします。リリースをロールアウトする必要はありません。APKをアップロードするだけです。詳細については、[こちら](https://support.google.com/googleplay/android-developer/answer/9859348?visit_id=638929100639477968-3849460621&rd=1)のサポート記事を参照してください。
:::important
アプリが新しい場合は、自分の国や地域でアプリを利用可能にする必要があるかもしれません。そのためには、**Testing > Closed testing** に移動し、テストトラックをクリックして、**Countries/regions** で希望する国や地域を追加してください。
:::
## 5. アプリ内課金をテストする \{#5-test-in-app-purchases\}
APKをアップロードしたら、リリースの処理が完了するまで数分お待ちください。その後、テストデバイスを開き、テスタリストに追加したメールアカウントでサインインします。本番アプリと同様にアプリ内課金をテストできます。
## 関連情報 \{#read-more\}
AndroidアプリのIn-App Purchaseテストについて詳しく知るには、以下のリソースをご覧ください。
- [サンドボックスでの更新期間](https://developer.android.com/google/play/billing/test#subs)
- [買い切り購入のテスト](https://developer.android.com/google/play/billing/test#one-time)
---
# File: validate-test-purchases
---
---
title: "テスト購入の検証"
description: "Adaptyでテスト購入を検証し、スムーズなトランザクションを確保しましょう。"
---
モバイルアプリを本番環境にリリースする前に、アプリ内課金を十分にテストすることが重要です。詳しいテスト手順については、[Apple App Storeでのアプリ内課金のテスト](test-purchases-in-sandbox)および[Google Play Storeでのアプリ内課金のテスト](testing-on-android)をご参照ください。テストを開始したら、テスト購入が成功しているかどうかを確認する必要があります。
モバイルデバイスでテスト購入を行うたびに、Adapty ダッシュボードの[**Event Feed**](https://app.adapty.io/event-feed)で対応するトランザクションを確認してください。購入が **Event Feed** に表示されない場合、Adaptyによってトラッキングされていません。
## テスト購入が成功した場合 \{#test-purchase-is-successful\}
テスト購入が成功すると、そのトランザクションイベントが **Event Feed** に表示されます。
トランザクションが期待どおりに動作している場合は、[リリースチェックリスト](release-checklist)に進み、その後アプリのリリースを行ってください。
## テスト購入が成功しなかった場合 \{#test-purchase-is-not-successful\}
10分以内にトランザクションイベントが表示されない場合や、モバイルアプリでエラーが発生した場合は、[トラブルシューティング](troubleshooting-test-purchases)およびエラーハンドリングに関する記事([iOS向け](ios-sdk-error-handling)、[Android向け](android-sdk-error-handling)、[React Native向け](react-native-handle-errors)、[Flutter向け](error-handling-on-flutter-react-native-unity)、[Unity向け](unity-handle-errors)、[Kotlin Multiplatform向け](kmp-handle-errors))を参照して、解決策を探してください。
---
# File: troubleshooting-test-purchases
---
---
title: "テスト購入のトラブルシューティング"
description: "Adaptyでのテスト購入をトラブルシューティングし、アプリ内トランザクションに関する一般的な問題を解決する方法を解説します。"
---
トランザクションの問題が発生した場合は、まず[リリースチェックリスト](release-checklist)に記載されているすべての手順を完了しているかご確認ください。すべての手順を完了しても問題が解決しない場合は、以下のガイダンスに従って対処してください。
## モバイルアプリでエラーが返される \{#an-error-is-returned-in-the-mobile-app\}
お使いのプラットフォームのエラーリストをご参照ください: [iOS向け](ios-sdk-error-handling)、[Android向け](android-sdk-error-handling)、[React Native向け](react-native-troubleshoot-purchases)、[Flutter](error-handling-on-flutter-react-native-unity)、[Unity](unity-troubleshoot-purchases)。記載の推奨事項に従って問題を解決してください。
## モバイルアプリでエラーが返されないのにイベントフィードにトランザクションが表示されない \{#transaction-is-absent-from-the-event-feed-although-no-error-is-returned-in-the-mobile-app\}
この問題を解決するには、以下の点をご確認ください。
1. **iOS の場合**: シミュレーターではなく実機を使用していることを確認してください。
2. アプリの `Bundle ID`/`Package name` が [**App settings**](https://app.adapty.io/settings/general) に設定されているものと一致していることを確認してください。
3. アプリ内の `PUBLIC_SDK_KEY` が Adapty ダッシュボードの **Public SDK key** と一致していることを確認してください: [**App settings** -> **General** タブ -> **API keys** セクション](https://app.adapty.io/settings/general)。
4. サンドボックスアカウントを使用していることを確認してください([ローカル StoreKit 設定ファイル](local-sk-files)ではなく)。以前にローカル StoreKit 設定ファイルをテストに使用していた場合は、現在のビルドでそれを使用していないことを確認してください。
## テスト用プロファイルにイベントが表示されない \{#no-event-is-present-in-my-testing-profile\}
これは正常な動作です。新しいユーザープロファイルレコードは、以下のタイミングで Adapty に自動作成されます。
- ユーザーが初めてアプリを起動したとき
- ユーザーがアプリからログアウトしたとき
**この動作の理由:** すべてのトランザクションとイベントは、最初のトランザクションを生成したプロファイルに紐付けられます。これにより、トランザクション履歴全体(トライアル、購入、更新)が同じプロファイルにリンクされ続けます。
**表示される内容:** 新しいプロファイルレコード(「非オリジナルプロファイル」と呼ばれます)はイベントなしで表示されることがありますが、アクセスレベルは保持されます。`access_level_updated` イベントが表示される場合があります。これは期待される動作です。
**テスト時の注意:** 複数のプロファイルが作成されないようにするため、アプリを再インストールするたびに新しいテストアカウント(サンドボックス Apple ID)を作成してください。
詳細については、[プロファイルの作成](how-profiles-work#profile-creation)をご覧ください。
以下は非オリジナルプロファイルの例です。**User history** にイベントがなく、アクセスレベルが設定されていることに注目してください。
## App Store Connect で設定した実際の価格が反映されない \{#prices-do-not-reflect-the-actual-prices-set-in-app-store-connect\}
サンドボックスおよびアプリ内課金にサンドボックス環境を使用する TestFlight では、価格の正確さよりも購入フローが正しく機能しているかどうかを確認することが重要です。Apple の API は、デバイスやアカウントに異なる地域が設定されている場合など、不正確なデータを返すことがあります。価格はストアから直接取得されるものであり、Adapty のバックエンドは購入価格に一切影響を与えないため、Adapty を通じた購入テスト中の価格の不正確さは無視していただいて構いません。
そのため、価格の正確さよりも購入フロー自体のテストを優先し、意図した通りに機能していることを確認してください。
## イベントフィードのトランザクション時刻が正しくない \{#the-transaction-time-in-the-event-feed-is-incorrect\}
**Event Feed** は **App Settings** で設定されたタイムゾーンを使用します。イベントのタイムゾーンをローカル時刻に合わせるには、[**App settings** -> **General** タブ](https://app.adapty.io/settings/general)で **Reporting timezone** を変更してください。
## ペイウォールとプロダクトの読み込みに時間がかかる \{#paywalls-and-products-take-a-long-time-to-load\}
この問題は、テストアカウントのトランザクション履歴が長い場合に発生することがあります。[App Store Connect でサンドボックステストアカウント(サンドボックス Apple ID)を作成する](test-purchases-in-sandbox#step-1-create-sandbox-test-account-in-app-store-connect)セクションに記載の通り、毎回新しいテストアカウントを作成することを強くお勧めします。
新しいアカウントを作成できない場合は、iOS デバイスで以下の手順に従って現在のアカウントのトランザクション履歴を消去できます。
1. **設定**を開き、**App Store** をタップします。
2. **サンドボックス Apple ID** をタップします。
3. ポップアップで **管理** を選択します。
4. **アカウント設定**ページで **購入履歴を消去** をタップします。
詳細については、[Apple Developer ドキュメント](https://developer.apple.com/documentation/storekit/testing-in-app-purchases-with-sandbox)をご覧ください。
---
# File: test-devices
---
---
title: "テストデバイス"
description: "Adaptyでテストデバイスを管理し、アプリのテストを効率化する方法を学びましょう。"
---
テスト目的で、自分のデバイスをテストデバイスとして登録できます。これによりキャッシュが無効化され、変更がすぐに反映されるようになります。
:::note
テストデバイスは以下の SDK バージョン以降でサポートされています。
- iOS: 2.11.1
- Android: 2.11.3
- React Native: 2.11.1
Flutter および Unity のサポートは後日追加される予定です。
:::
## デバイスをテストデバイスとして登録する \{#mark-your-device-as-test\}
1. Adapty ダッシュボードで [**App settings**](https://app.adapty.io/settings/general) を開きます。
2. **General** タブの **Test devices** セクションまでスクロールします。
3. **Add test device** ボタンをクリックします。
4. **Add test device** ウィンドウで以下を入力します。
| フィールド | 説明 |
|:-----------------------------------------| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Test device name** | 参照用のテストデバイス名。 |
| **ID used to identify this test device** | テストデバイスの識別に使用する識別子の種類を選択します。最適な選択肢については、下記の [使用すべき識別子](test-devices#which-identifier-you-should-use) セクションの推奨事項を参照してください。 |
| **ID value** | 識別子の値を入力します。 |
5. **Add test device** ボタンをクリックして変更を保存することを忘れないでください。
## 使用すべき識別子 \{#which-identifier-you-should-use\}
デバイスの識別には複数の識別子を使用できます。以下の方法を推奨します。
- ユーザーをシステム内で識別するために設定する一意の識別子。メールアドレス、内部 ID、その他の文字列などが使えます。このオプションを使用するには、
特に同じアカウントで複数のデバイスを使用している場合に、テストデバイスの識別として最適な選択肢です。このアカウントを持つすべてのデバイスがテスト用とみなされます。
| | Adapty profile ID |Adapty における[ユーザープロファイル](profiles-crm)の一意の識別子。
Customer User ID・iOS の IDFA・Android の Advertising ID が使用できない場合にご利用ください。なお、アプリを再インストールしたり再ログインしたりすると Adapty Profile ID が変わる場合があります。
| #### Customer User ID と Adapty Profile ID の取得方法 \{#how-to-obtain-customer-user-id-and-adapty-profile-id\} どちらの識別子も Adapty ダッシュボードの **Profile** 詳細から取得できます。 1. [**Adapty Profiles** -> **Event feed** タブ](https://app.adapty.io/event-feed)でユーザーのプロファイルを見つけます。 :::note 正確なプロファイルを見つけるには、珍しい種類のトランザクションを実行してください。そうすることで、[**Event Feed**](https://app.adapty.io/event-feed) にトランザクションが表示されたときにすぐに特定できます。 ::: 2. プロファイル詳細の **Customer user ID** と **Adapty ID** フィールドの値をコピーします。
### Apple の識別子 \{#apple-identifiers\}
| 識別子 | 使用方法 |
|----------|-----|
| IDFA | IDFA(Identifier for Advertisers)は、Apple がユーザーのデバイスに割り当てる一意のデバイス識別子です。
自動的に変わることがないため(手動でリセットは可能)、iOS デバイスに最適です。
**注意**:iOS 14.5 以降、広告主は IDFA にアクセスするためにユーザーの同意を求める必要があります。アプリ内で同意を求めていること、テストデバイスで同意を付与済みであることを確認してください。
| | IDFV | IDFV(Identifier for Vendors)は、同一パブリッシャー/ベンダーの全アプリに対して Apple が 1 つのデバイスに割り当てる一意の英数字識別子です。アプリを再インストールまたはアップデートすると変わる場合があります。 | #### IDFA の取得方法 \{#how-to-obtain-the-idfa\} Apple はデフォルトで IDFA を提供していません。Adapty ダッシュボードのプロファイルのアトリビューションから取得してください。 1. [**Adapty Profiles** -> **Event feed** タブ](https://app.adapty.io/event-feed)でユーザーのプロファイルを見つけます。 :::note 正確なプロファイルを見つけるには、珍しい種類のトランザクションを実行してください。そうすることで、[**Event Feed**](https://app.adapty.io/event-feed) にトランザクションが表示されたときにすぐに特定できます。 ::: 2. プロファイル詳細を開き、**Attributes** セクションの **IDFA** フィールドの値をコピーします。
または、[App Store で IDFA を表示してくれるアプリを探す](https://www.apple.com/us/search/idfa?src=globalnav)こともできます。
#### Identifier for Vendors(IDFV)の取得方法 \{#how-to-obtain-the-identifier-for-vendors-idfv\}
IDFV を取得するには、開発者に以下のメソッドを使ってアプリ内でリクエストし、取得した識別子をログまたはデバッグパネルに表示するよう依頼してください。
```swift showLineNumbers title="Swift"
UIDevice.current.identifierForVendor
```
### Google の識別子 \{#google-identifiers\}
| 識別子 | 使用方法 |
|----------|-----|
| Advertising ID | Advertising ID は、Google がユーザーのデバイスに割り当てる一意のデバイス識別子です。
自動的に変わることがないため(手動でリセットは可能)、Android デバイスに最適です。
**注意**:使用するには、Android 12 以上の場合、**Ads** 設定の **Opt out of Ads Personalization** をオフにしてください。
| | Android ID | Android ID は、アプリの署名キー・ユーザー・デバイスの組み合わせごとに固有の識別子です。Android 8.0 以上で利用できます。 | #### Advertising ID の取得方法 \{#how-to-obtain-advertising-id\} デバイスの Advertising ID を確認するには: 1. Android デバイスで **Settings** アプリを開きます。 2. **Google** をタップします。 3. **Services** の下にある **Ads** を選択します。画面下部に Advertising ID が表示されます。 #### Android ID の取得方法 \{#how-to-obtain-android-id\} Android ID を取得するには、開発者に以下のメソッドを使って [ANDROID_ID](https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID) をアプリ内でリクエストし、取得した識別子をログまたはデバッグパネルに表示するよう依頼してください。 ```kotlin showLineNumbers title="Kotlin/Java" android.provider.Settings.Secure.getString(contentResolver, android.provider.Settings.Secure.ANDROID_ID); ``` --- # File: release-checklist --- --- title: "リリースチェックリスト" description: "Adaptyのリリースチェックリストに従って、スムーズなアプリのアップデートプロセスを確保しましょう。" --- Adaptyをご利用いただきありがとうございます!実装がうまくいったことを願っています。このガイドでは、アプリをストアに公開する準備が整っているか確認するための手順を説明します。これにより、マネタイゼーションフローが正しく機能していることを安心して確認できます。 ## 事前確認事項 \{#pre-flight-essentials\} バリデーションを始める前に必要なもの: - サンドボックスアカウントを持つ実機デバイス - Adapty ダッシュボードへのアクセス - App Store Connect / Google Play Console へのアクセス :::note サンドボックス購入はシミュレーターでも実行できますが、支払いダイアログや生体認証プロンプトを含むすべてのフローを完全にテストするには実機デバイスが必要です。 ::: ## 共通バリデーション \{#universal-validations\} - [ ] **ストア接続**: AdaptyをApp StoreおよびGoogle Playに接続していることを確認してください: - [ ] [App Store](initial_ios) - [ ] [Google Play](initial-android) - [ ] **サブスクリプションイベントの配信**: サーバー通知が設定されていることを確認してください: - [ ] [App Serverサーバー通知](enable-app-store-server-notifications) - [ ] [リアルタイム開発者通知(RTDN)](enable-real-time-developer-notifications-rtdn) - [ ] **プロファイルの識別**: ユーザー識別ロジックを検証し、購入が正しいプロファイルに紐付けられていることを確認してください: - [ ] [アプリコードの識別ロジックがユースケースに合っているか確認する](ios-quickstart-identify) - [ ] [ユーザープロファイル間で有料アクセスを共有するための親/継承ロジックを理解しているか確認する](sharing-paid-access-between-user-accounts) - [ ] **オファー**: アプリにApp Storeのプロモーションオファーがある場合、[アプリ内購入キー](app-store-connection-configuration#step-4-for-trials-and-special-offers--set-up-promotional-offers)をメインフィールドと **App Store promotional offers** セクションの両方に追加していることを確認してください。 - [ ] **データ収集**: プライバシーへの準拠を確保してください: - [ ] GDPRやCCPAなどのプライバシー規制に準拠する必要がある場合、またはアプリが子供向けの場合は、[IDFAおよびIPの収集と共有を有効にするかどうか](sdk-installation-ios#data-policies)を制御してください。 - [ ] アプリがAppTrackingTransparencyを使用している場合は、[認証ステータスをAdaptyに送信](ios-deal-with-att)していることを確認してください。 - [ ] **プライバシーラベル**: Adaptyが収集するデータとレビューに必要なフラグについては、[詳細はこちら](apple-app-privacy)をご覧ください。 ## 購入バリデーション \{#purchase-validations\} :::tip ご質問やお困りのことがあれば、[サポートフォーラム](https://adapty.featurebase.app/)をご覧ください。よくある質問への回答を見つけたり、ご自身の質問を投稿することができます。チームとコミュニティがサポートいたします! ::: 公開前に、アプリ内購入が正しく機能し、ペイウォールがストアレビューの準備ができていることを確認してください。 アプリ内購入のバリデーション方法は、実装方法によって異なります: - Adapty ペイウォールビルダーで作成したペイウォールを表示する - 独自のペイウォールを実装し、その中で `makePurchase` メソッドを使用して購入を処理する - オブザーバーモードでAdaptyを使用する(Adapty ペイウォールビルダーまたはカスタムペイウォールのどちらでも)
2. メニューバーから **Product** > **Archive** を選択します。
3. アーカイブ処理が完了するまで待ちます。**Organizer** ウィンドウが自動的に開きます。アーカイブを選択して **Distribute App** をクリックします。
4. 配布方法として **App Store Connect** を選択します。画面の指示に従ってアップロードを完了させます。
:::note
アプリアイコンや起動画面など、必要なアセットが不足している場合はアップロードが失敗することがあります。Xcodeのエラーログで詳細を確認してください。
:::
### ステップ2. App Store Connectでビルドを確認する \{#step-2-check-the-build-in-app-store-connect\}
1. [App Store Connect](https://appstoreconnect.apple.com) にアクセスしてアプリを開きます。
2. **Build** セクションまでスクロールし、アップロードしたビルドが表示されていることを確認します。
:::note
アップロード後、ビルドがApp Store Connectに表示されるまで数分かかる場合があります。
:::
## アプリとプロダクトをレビューに申請する \{#submit-your-app-and-products-for-review\}
**Build** セクションにビルドが表示されたら、アプリ内サブスクリプションを添付してAppleのレビューに申請します。
### ステップ1. 申請にプロダクトを添付する \{#step-1-attach-products-to-the-submission\}
各サブスクリプションは、添付できるようになる前にApp Store Connectで **Ready to Submit** ステータスになっている必要があります。サブスクリプションがドラフト状態だったりメタデータが不足していたりすると、リストに表示されません。
1. 同じページで、**In-App Purchases and Subscriptions** セクションまでスクロールします。
2. **Select in-app purchases or subscriptions** をクリックします。
3. この申請に含めたいプロダクトをすべて選択して **Done** をクリックします。
### ステップ2. レビューに申請する \{#step-2-submit-for-review\}
1. ページ上の必須項目(説明文、スクリーンショット、キーワードなど)をすべて入力します。
2. **App Store Version Release** セクションで、承認後にアプリを自動リリースするか、手動でリリースするか、スケジュール設定でリリースするかを選択します。
3. **Add for Review** をクリックし、次に **Submit to App Review** をクリックします。
Appleのレビューは通常1〜2日以内に完了しますが、レビュー期間は変動することがあります。
## 本番環境でアプリを確認する \{#verify-your-app-in-production\}
Appleがアプリを承認したら:
1. 実際に購入を行います(または最初のユーザーが購入するのを待ちます)。
2. Adapty ダッシュボードの [**Event Feed**](https://app.adapty.io/event-feed) を開き、本番トランザクションイベントが表示されていることを確認します。
3. サブスクリプションイベント(更新、キャンセル)が正しく流れているか確認します。これには[App Storeサーバー通知](enable-app-store-server-notifications)の設定が必要です。
本番イベントが表示されない場合は、[App Store接続設定](app-store-connection-configuration)を確認してください。
## 次のステップ \{#next-steps\}
アプリが公開されました。サブスクリプション収益を伸ばしていきましょう:
- **[A/B テスト](ab-tests)**:異なるペイウォールを試して、最もコンバージョンが高いものを見つけましょう。
- **[アナリティクス](charts)**:MRR、チャーン、コンバージョンなどのサブスクリプション指標を追跡しましょう。
- **インテグレーション**:サブスクリプションイベントを[アナリティクス](analytics-integration)や[アトリビューション](attribution-integration)プラットフォームに送信しましょう。
---
# File: general
---
---
title: "App settings"
description: "Adaptyのシームレスな利用に向けた一般設定と構成についてご説明します。"
---
**App Settings** ページの **General** タブから、アプリの動作・外観・収益共有の設定を管理できます。ここでは、アプリ名やアイコンのカスタマイズ、Adapty SDK および API キーの管理、スモールビジネスプログラムのステータス設定、アナリティクスやチャートのタイムゾーン選択などが行えます。
## 1. アプリの詳細 \{#1-app-details\}
Adapty インターフェース上でアプリを識別するための一意の名前とアイコンを設定してください。なお、ここで設定するアプリ名とアイコンは、App Store や Google Play 上のアプリ名・アイコンには影響しません。また、アプリの目的やコンテンツを正確に反映した適切なアプリカテゴリを選択してください。これにより、ユーザーがアプリを見つけやすくなり、適切なストアカテゴリに表示されるようになります。
## 2. スモールビジネスプログラムへの参加と手数料優遇 \{#2-member-of-small-business-program-and-reduced-service-fee\}
Apple の [Small Business Program](app-store-small-business-program) または Google の [Reduced Service Fee プログラム](google-reduced-service-fee) に登録している場合、ストアの手数料が優遇されます。
アプリが手数料優遇プログラムに登録されている場合は、Adapty に通知してください。正確な計算のために、「Reduced Store Fee」セクションでプログラムのステータスを指定してください。
手数料優遇の設定は、今後の取引にのみ適用されます。ステータスが変更される**前に**設定を更新しておくと、Adapty が手数料率を自動的に調整します。
:::warning
* 手数料優遇プログラムの参加期間を延長した場合は、**適用期間を追加してください**。
* プログラムの資格を失った場合は、現在の適用期間の**終了日を変更してください**。
:::
詳細については以下の記事をご覧ください:
* [App Store Small Business Program](app-store-small-business-program)
* [Google Reduced Service Fee](google-reduced-service-fee)
## 3. レポートのタイムゾーン \{#3-reporting-timezone\}
拠点となる場所、またはアプリのアナリティクスやチャートに最も適したタイムゾーンを選択してください。一貫性を保つために、App Store Connect または Google Play Console のアカウントと同じタイムゾーンを使用することをおすすめします。なお、このタイムゾーン設定は、UTC タイムゾーンを使用する Adapty のサードパーティ連携には影響しません。
タイムゾーン設定は、**App Settings** ページの **General** タブにある **Reported timezone** セクションから行えます。また、Adapty アカウント内のすべてのアプリに同じタイムゾーンを設定するチェックボックスもあります。
## 4. アナリティクスにおけるインストールの定義 \{#4-installs-definition-for-analytics\}
アナリティクスにおける新規インストールイベントの定義を選択してください:
| 基準 | 説明 |
|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| New device_ids | (推奨)ストアからデバイスにアプリをインストールするたびに、新規インストールとしてカウントされます。初回インストールと再インストールの両方が含まれます。
インストールはデバイス ID 単位でカウントされ、ユーザー認証の影響を受けません。プロファイルの作成(SDK 起動時またはログアウト時)、ログイン、アプリのアップグレードでは追加のインストールイベントは発生しません。
例えば、同じアプリが 5 台の異なるデバイスにインストールされた場合、アナリティクスには 5 インストールと表示されます。
| | New customer_user_ids |このオプションは、Adapty で
ログイン済みユーザーの場合、顧客ユーザー ID に関連付けられた最初のインストールのみが新規インストールとしてカウントされます。追加デバイスへのインストールは新規インストールとしてカウントされません。
匿名ユーザー(ログインしていないユーザー)はアナリティクスでカウントされません。
アプリの再インストールや再ログインでは追加のインストールは発生しません。
App Store Connect、Google Play Console、AppsFlyer などのアプリストアやアトリビューションプラットフォームは、デバイスベースでインストールをカウントします。Adapty で顧客ユーザー ID によるインストールカウントを使用した場合、これらの外部サービスの数値と異なる場合があります。
⚠️ Adapty でユーザーを識別していない場合、このオプションを有効にするとインストールはカウントされません。
| | New profiles in Adapty | (レガシー)すべてのアプリインストール、再インストール、およびログアウト時に作成された匿名プロファイルが新規インストールとしてカウントされます。 | このオプションは [**Analytics**](https://app.adapty.io/analytics) ページにのみ影響し、別途ビューを設定できる [**Overview**](https://app.adapty.io/overview) ページには影響しない点に注意してください。 ## 5. App Store の価格値上げロジック \{#5-app-store-price-increase-logic\} Adapty アナリティクスと App Store Connect の結果の間に不整合が生じないよう、App Store Connect で価格値上げに関する設定を変更する際は、適切なオプションを選択することが重要です。 Adapty でサブスクリプションの価格値上げに適用するロジックを選択できます:
- **既存ユーザーのサブスクリプション価格を維持する:** このオプションを選択すると、App Store Connect で価格を変更しても、既存のサブスクライバーには元の価格が適用され続けます。つまり、既存のサブスクライバーは引き続き元のサブスクリプション価格で請求されます。
- **App Store Connect でサブスクリプション価格が変更された場合、既存のサブスクライバーにも適用される:** このオプションを選択すると、App Store Connect で行った価格変更が既存のサブスクライバーにも適用されます。つまり、既存のサブスクライバーは App Store Connect に設定された新しい価格で請求されます。
:::warning
選択したオプションは、Adapty のアナリティクスだけでなく、連携機能やトランザクション処理全体にも影響することをご注意ください。
:::
既存のサブスクライバーに対するサブスクリプション価格の取り扱い方針に合ったオプションを選択してください。これにより、Adapty アナリティクスと App Store Connect の結果の正確なデータと同期を維持できます。
## 6. ユーザーアカウント間でのアクセスレベルの共有 \{#6-sharing-paid-access-between-user-accounts\}
:::link
メイン記事:[ユーザーアカウント間でのアクセスレベルの共有](sharing-paid-access-between-user-accounts)
:::
**Sharing paid access between user accounts** 設定は、複数の[ユーザープロファイル](identifying-users)が同じ購入にアクセスしようとした場合に Adapty がどう処理するかを決定します。[サンドボックス環境](test-purchases-in-sandbox)に対して個別のアクセス共有設定を指定することもできます。
**有効(デフォルト)**
識別済みユーザー([Customer User ID](identifying-users#set-customer-user-id-on-configuration)が設定されているユーザー)は、同じApple/Google IDでサインインしているデバイスであれば、Adaptyが提供する同じ[アクセスレベル](access-level)を共有できます。これは、ユーザーがアプリを再インストールして別のメールアドレスでログインした場合でも、以前の購入へのアクセスを維持できるため便利です。このオプションでは、複数の識別済みユーザーが同じアクセスレベルを共有できます。
アクセスレベルは共有されますが、過去および将来のすべてのトランザクションは、一貫したアナリティクスを維持し完全なトランザクション履歴(トライアル期間、サブスクリプション購入、更新など)を同じプロファイルに紐付けるため、元のCustomer User IDのイベントとして記録されます。
**新しいユーザーへアクセスを移譲**
識別済みユーザーは、デバイスが同じApple/Google IDでサインインしている限り、別の[Customer User ID](identifying-users#set-customer-user-id-on-configuration)でログインしたりアプリを再インストールしたりしても、Adaptyが提供する[アクセスレベル](access-level)を引き続き利用できます。
前のオプションとは異なり、Adaptyは識別済みユーザー間で購入を移譲します。これにより購入済みコンテンツへのアクセスが保証されますが、一度にアクセスできるのは1人のユーザーのみです。たとえば、UserAがサブスクリプションを購入し、同じデバイスでUserBがログインしてトランザクションをリストアした場合、UserBがサブスクリプションへのアクセスを取得し、UserAからはアクセスが取り消されます。
いずれかのユーザー(新しいユーザーまたは古いユーザー)が識別されていない場合でも、Adapty内でそれらのプロファイル間でアクセスレベルは共有されます。
アクセスレベルは移譲されますが、過去および将来のすべてのトランザクションは、一貫したアナリティクスを維持し完全なトランザクション履歴(トライアル期間、サブスクリプション購入、更新など)を同じプロファイルに紐付けるため、元のCustomer User IDのイベントとして記録されます。
**新しいユーザーへアクセスを移譲**に切り替えた後、アクセスレベルはすぐにはプロファイル間で移譲されません。特定のアクセスレベルの移譲プロセスは、サブスクリプションの更新、リストア、またはトランザクションの検証など、ストアからのイベントをAdaptyが受信したときにのみトリガーされます。
**無効**
最初にアクセスレベルを取得した識別済みユーザープロファイルが、それを永続的に保持します。これは、ビジネスロジック上、購入を単一のCustomer User IDに紐付ける必要がある場合に最適なオプションです。
なお、匿名ユーザー間ではアクセスレベルは引き続き共有されます。
[オーナーのユーザープロファイルを削除する](https://adapty.io/docs/ja/api-adapty/operations/deleteProfile)ことで、購入の紐付けを解除できます。削除後、アクセスレベルは最初にそれを要求したユーザープロファイル(匿名または識別済みを問わず)に付与されます。
共有の無効化は新しいユーザーにのみ影響します。すでにユーザー間で共有されているサブスクリプションは、このオプションを無効にした後も共有され続けます。
:::warning
AppleとGoogleは、購入をApple/Google IDに紐付けているため、ユーザー間でアプリ内課金を共有または移譲することを求めています。共有がなければ、その後の再インストール時に購入のリストアが機能しない可能性があります。
共有を無効にすると、ログイン後にユーザーがアクセスを取り戻せなくなる場合があります。
共有の無効化は、ユーザーが購入前に**ログインを必須とする**場合にのみ推奨します。そうでない場合、識別済みユーザーがサブスクリプションを購入した後に別のアカウントにログインすると、アクセスを永続的に失う可能性があります。
:::
### どの設定を選べばよいですか? \{#which-setting-should-i-choose\}
| アプリの条件 | 選択するオプション |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| ログインシステムがなく、AdaptyのみMatch anonymous profile IDを使用している。 | デフォルトオプションを使用してください。3つのオプションすべてで、匿名プロファイルID間ではアクセスレベルが常に共有されます。 |
| オプションのログインシステムがあり、アカウント作成前に購入できる。 | **新しいユーザーへアクセスを移譲**を選択してください。アカウントなしで購入したユーザーが後でトランザクションをリストアできるようになります。 |
| 購入前にアカウント作成を必須とするが、購入を複数のCustomer User IDに紐付けることを許可している。 | **新しいユーザーへアクセスを移譲**を選択してください。一度にアクセスできるCustomer User IDは1つに限られますが、別のCustomer User IDでログインしても有料アクセスを失わずに済みます。 |
| 購入前にアカウント作成を必須とし、購入を単一のCustomer User IDに厳密に紐付けるルールがある。 | **無効**を選択してください。アカウント間でトランザクションが移譲されないことが保証されます。 |
## 7. SDK および API キー \{#7-sdk-and-api-keys\}
アプリに Adapty SDK を組み込むには Public SDK キーを使用し、Adapty の Server API にアクセスするには Secret キーを使用します。必要に応じて新しいキーを生成したり、既存のキーを無効化することができます。Developer CLI 用のトークンを作成するには、**Settings → Developer API** に移動してください。詳細は [Authentication](developer-cli-authentication) をご覧ください。
## 8. テストデバイス \{#8-test-devices\}
テストに使用するデバイスを指定することで、キャッシュによる遅延をバイパスし、ペイウォールやプレースメントの変更が即座に反映されるようにします。詳細は [Testing devices](test-devices) をご覧ください。
## 9. クロスプレースメントバリエーションのスティッキネス \{#9-cross-placement-variation-stickiness\}
テスト終了後、どのくらいの期間ユーザーがテスト内のバリアントを引き続き表示されるかを定義します。これはアナリティクスの精度とユーザー体験に影響します。ユーザーが以前に見たものとは異なるオファーを表示すると、購入の意思決定に影響を与える可能性があります。
スティッキネス期間の最大値かつデフォルト値は 90 日間です。
:::warning
以下の点を考慮してください:
- この設定を変更すると、以前にバリアントを受け取ったすべてのユーザーに影響します。対象ユーザーはプレースメントを表示した際に即座に新しいペイウォールの対象となるため、実行中の A/B テストの結果に影響する可能性があります。
- スティッキネス期間が終了したユーザーには、新しいペイウォールや A/B テストが表示される場合があります。ただし、その場合でも、他のクロスプレースメントテストに参加することは永久にできなくなります。
:::
## 10. アプリの削除 \{#10-delete-the-app\}
アプリが不要になった場合、Adapty から削除することができます。
:::warning
この操作は元に戻せません。アプリやそのデータを復元することはできません。
:::
---
# File: ios-settings
---
---
title: "Apple App Store の認証情報"
description: "AdaptyでiOSの設定を構成し、サブスクリプション管理をシームレスに実現します。"
---
App Storeの認証情報を設定し、Adapty iOS SDKの最適な動作を確保するには、Adapty ダッシュボードの App Settings ページ内の [iOS SDK](https://app.adapty.io/settings/ios-sdk) タブに移動します。次に、以下のパラメーターを設定してください:
| フィールド | 説明 |
|----------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Bundle ID** | アプリの [Bundle ID](app-store-connection-configuration#step-1-provide-bundle-id-and-apple-app-id)。 |
| **In-app purchase API (StoreKit 2)** | アプリ内課金のトランザクション履歴リクエストの安全な認証と検証を有効にするための [キー](app-store-connection-configuration#step-2-provide-issuer-id-and-key-id)。 |
| **App Store Server Notifications** | App Store からの [サーバー間通知](enable-app-store-server-notifications) を有効にし、ユーザーのサブスクリプション状態の変化を監視・対応するために使用するURL。 |
| **App Store Promotional Offers** | 特定のプロダクトに対してAdaptyで [プロモーションオファー](generate-in-app-purchase-key) を作成するためのサブスクリプションキー。 |
| **Apple app ID** | App StoreにおけるアプリのID。確認するには、App Store Connectでアプリのページを開き、左メニューから **App Information** ページを開いて **Apple ID** をコピーしてください。 |
| **App Store Connect shared secret (LEGACY)** | **Adapty SDK v2.9.0 以前向けのレガシーキー**
アプリのレシート検証と不正防止のための [キー](app-store-connection-configuration#step-5-enter-app-store-shared-secret)。
| --- # File: google-play-store-connection-configuration --- --- title: "Google Play Storeとの連携を設定する" description: "AdaptyでGoogle Play Storeの接続を設定し、アプリ内課金をスムーズに処理しましょう。" --- このセクションでは、Google Play経由で販売されているモバイルアプリをAdaptyと連携する手順を説明します。Play StoreのアプリケーションデータをAdapty ダッシュボードに入力する必要があります。この作業は、AdaptyがPlay Storeから購入を検証し、サブスクリプションの更新情報を受け取るために欠かせないステップです。 この設定は初回オンボーディング時に行うか、後からAdapty ダッシュボードの **App Settings** で変更できます。 :::danger 設定の変更は、Adaptyのペイウォールをアプリにリリースするまでのみ許容されます。リリース後に変更すると連携が壊れ、モバイルアプリでペイウォールが表示されなくなります。 ::: ## ステップ1. パッケージ名を入力する \{#step-1-provide-package-name\} パッケージ名は、Google Play StoreにおけるアプリのユニークなIDです。サブスクリプション処理などAdaptyの基本機能に必要です。 1. [Google Play Developer Console](https://play.google.com/console/u/0/developers)を開きます。 2. IDを確認したいアプリを選択します。**Dashboard** 画面が開きます。
3. アプリケーション名の下にあるプロダクトIDを確認し、コピーします。
4. AdaptyトップメニューからA[**App settings**](https://app.adapty.io/settings/android-sdk)を開きます。
5. **App settings** 画面の **Android SDK** タブで、コピーした **Package name** を貼り付けます。
## ステップ2. アカウントキーファイルをアップロードする \{#step-2-upload-the-account-key-file\}
1. [サービスアカウントキーファイルの作成](create-service-account)ステップで作成したサービスアカウントの秘密鍵ファイル(JSON形式)を、**Service account key file** エリアにアップロードします。
変更を確定するために、**Save** ボタンをクリックするのを忘れずに。
**次のステップ**
- [Google Play ConsoleでRTDN(リアルタイム デベロッパー通知)を有効にする](enable-real-time-developer-notifications-rtdn)
---
# File: enable-real-time-developer-notifications-rtdn
---
---
title: "Google Play ConsoleでリアルタイムデベロッパーNotification(RTDN)を有効にする"
description: "Google Play ConsoleでリアルタイムデベロッパーNotification(RTDN)を有効にしてAdaptyのデータ精度を維持しましょう。払い戻しやその他の重要なイベントに関する即時更新を受け取るためのRTDNセットアップ方法を学びます"
---
リアルタイムデベロッパーNotification(RTDN)を設定することは、データ精度を確保するうえで非常に重要です。これにより、払い戻しやその他のイベントに関する情報を含む、Play Storeからの更新をリアルタイムで受け取れるようになります。
## 通知を有効にする \{#enable-notifications\}
1. **Google Cloud Pub/Sub** が有効になっていることを確認してください。[こちらのリンク](https://console.cloud.google.com/flows/enableapi?apiid=pubsub)を開き、アプリのプロジェクトを選択します。**Google Cloud Pub/Sub** をまだ有効にしていない場合は、ここで有効にする必要があります。
2. Adaptyのトップメニューから [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) に移動し、**Google Play RTDN topic name** タイトルの横にある **Enable Pub/Sub API** フィールドの内容をコピーします。
:::note **Enable Pub/Sub API** フィールドの内容が正しくない形式の場合(正しい形式は `projects/...` で始まります)、[Enable Pub/Sub APIフィールドの形式を修正する](enable-real-time-developer-notifications-rtdn#fixing-incorrect-format-in-enable-pubsub-api-field) セクションを参照してください。 ::: 3. [Google Play Console](https://play.google.com/console/) を開き、アプリを選択して、**Monetize with Play** -> **Monetization setup** に進みます。**Google Play Billing** セクションで、**Enable real-time notifications** チェックボックスをオンにします。 4. Adaptyの **App Settings** でコピーした **Enable Pub/Sub API** フィールドの内容を、**Topic name** フィールドに貼り付けます。 5. Google Play Consoleで **Save changes** をクリックします。
## 通知をテストする \{#test-notifications\}
リアルタイムデベロッパーNotificationへの登録が成功したかどうかを確認するには:
1. Google Play Consoleの設定で変更を保存します。
2. Google Play Consoleの **Topic name** の下にある **Send test notification** をクリックします。
3. AdaptyのメニューにあるトップメニューからAdaptyの [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) に移動します。テスト通知が送信されると、トピック名の上にそのステータスが表示されます。
## Enable Pub/Sub APIフィールドの形式を修正する \{#fixing-incorrect-format-in-enable-pubsub-api-field\}
**Enable Pub/Sub API** フィールドの内容が誤った形式の場合(正しい形式は `projects/...` で始まります)、以下の手順に従って問題を解決してください。
### 1. APIの有効化と権限を確認する \{#1-verify-api-enablement-and-permissions\}
必要なAPIがすべて有効になっており、サービスアカウントに正しく権限が付与されていることを慎重に確認してください。これらの手順をすでに完了している場合でも、サブステップが抜けていないことを確かめるために再度確認することが重要です。以下のセクションの手順を繰り返してください:
1. [Google Play ConsoleでデベロッパーAPIを有効にする](enabling-of-devepoler-api)
2. [Google Cloud Consoleでサービスアカウントを作成する](create-service-account)
3. [Google Play Consoleでサービスアカウントに権限を付与する](grant-permissions-to-service-account)
4. [Google Play Consoleでサービスアカウントのキーファイルを生成する](create-service-account-key-file)
5. [Google Play Storeインテグレーションを設定する](google-play-store-connection-configuration)
### 2. ドメインポリシーを調整する \{#2-adjust-domain-policies\}
**Domain restricted contacts** および **Domain restricted sharing** ポリシーを変更します:
1. [Google Cloud Console](https://console.cloud.google.com/) を開き、アプリを管理するためのサービスアカウントを作成したプロジェクトを選択します。
2. **Quick Access** セクションで、**IAM & Admin** を選択します。
3. 左ペインで **Organization Policies** を選択します。
4. **Domain restricted contacts** ポリシーを見つけます。
5. **Actions** 列の省略記号ボタンをクリックし、**Edit policy** を選択します。
6. ポリシー編集ウィンドウで:
1. **Policy source** の下で、**Override parent's policy** ラジオボタンを選択します。
2. **Policy enforcement** の下で、**Replace** ラジオボタンを選択します。
3. **Rules** の下で、**ADD A RULE** ボタンをクリックします。
4. **New rule** -> **Policy values** の下で、**Allow All** を選択します。
5. **SET POLICY** をクリックします。
7. **Domain restricted sharing** ポリシーについても、手順4〜6を繰り返します。
最後に、**Google Play RTDN topic name** タイトルの横にある **Enable Pub/Sub API** フィールドの内容を再作成します。フィールドは正しい形式になります。
リアルタイムデベロッパーNotification(RTDN)の有効化に成功したら、更新したポリシーの **Policy source** を **Inherit parent's policy** に戻すことを忘れずに行ってください。
## 生イベントの転送 \{#raw-events-forwarding\}
場合によっては、Googleからの生のS2Sイベントを引き続き受け取りたいこともあるでしょう。Adaptyを使用しながらそれらを受け取り続けるには、**URL for forwarding raw Google events** フィールドにエンドポイントを追加するだけで、Googleからの生イベントをそのまま送信します。
---
**次のステップ**
以下のプラットフォーム向けにAdapty SDKを設定します:
- [Android](sdk-installation-android)
- [React Native](sdk-installation-reactnative)
- [Flutter](sdk-installation-flutter)
- [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)
- [Unity](sdk-installation-unity)
---
# File: apple-search-ads
---
---
title: "Apple Ads"
description: "Adapty と Apple Ads を統合してサブスクリプションのコンバージョンを最適化しましょう。"
---
:::important
**App settings** の Apple Ads 統合は、基本的なアナリティクスおよび SplitMetrics Acquire と Asapty の統合にのみ使用されます。
[Adapty Ads Manager](adapty-ads-manager)は別の接続を使用します。Apple Ads アカウントを[Adapty Ads Manager](adapty-ads-manager-get-started)で接続してください。
:::
Adapty は Apple Ads からアトリビューションデータを取得し、キャンペーンおよびキーワードのセグメンテーションで指標を分析するのに役立ちます。Adapty は SDK と AdServices Framework を通じて、Apple Ads のアトリビューションデータを自動的に収集します。
Apple Ads インテグレーションを設定すると、Adapty は Apple Ads からアトリビューションデータの受信を開始します。このデータはプロファイルページで簡単に確認できます。
## 連携の設定 \{#set-up-integration\}
### AdServicesフレームワークをAdaptyに接続する \{#connect-adapty-to-the-adservices-framework\}
[AdServices](https://developer.apple.com/documentation/adservices)を使ったApple Adsは、Adapty ダッシュボードでの設定が必要です。また、アプリ側での有効化も必要です。AdServicesフレームワークを使ってAdapty経由でApple Adsを設定するには、以下の手順に従ってください。
#### ステップ1:公開鍵を取得する \{#step-1-obtain-public-key\}
Adapty ダッシュボードで[Settings -> Apple Ads](https://app.adapty.io/settings/apple-search-ads)に移動します。
あらかじめ生成された公開鍵(Adaptyがキーペアを提供します)を見つけてコピーします。
:::note
Apple Ads のアトリビューションに別のサービスや独自のソリューションを使用している場合は、独自のプライベートキーをアップロードできます。
:::
#### ステップ 2: Apple Ads でユーザー管理を設定する \{#step-2-configure-user-management-on-apple-ads\}
[Apple Ads アカウント](https://ads.apple.com/app-store)で **Settings > User Management** ページに移動します。Adapty がアトリビューションデータを取得するには、別の Apple ID アカウントを招待し、API Account Manager のアクセス権を付与する必要があります。既存のアカウントを使用することも、この目的専用に新しいアカウントを作成することもできます。重要なのは、その Apple ID で Apple Ads にログインできる必要があるという点です。
#### ステップ 3: API 認証情報を生成する \{#step-3-generate-api-credentials\}
次に、Apple Ads に新しく追加したアカウントでログインします。Apple Ads の画面で Settings -> API に移動し、先ほどコピーした公開鍵を所定のフィールドに貼り付けて、新しい API 認証情報を生成してください。
#### ステップ 4: Apple Ads の認証情報を Adapty に設定する \{#step-4-configure-adapty-with-apple-ads-credentials\}
Apple Ads の設定画面から Client ID、Team ID、Key ID の各フィールドをコピーし、Adapty ダッシュボードの対応するフィールドに貼り付けます。
### アプリを AdServices ネットワークに接続する \{#connect-your-app-to-the-adservices-network\}
[AdServices フレームワークの設定](#connect-the-adservices-framework)が完了すると、Adapty は Apple Search Ad のアトリビューションデータの収集を自動的に開始します。SDK コードを追加する必要はありません。
iOS アプリケーションでは、このアトリビューションデータは**常に**他のソースからのデータより優先されます。この動作が不要な場合は、以下の手順で ASA アトリビューションを*無効化*してください。
## インテグレーションを無効にする \{#disable-integration\}
Apple Search Ads のアトリビューションをオフにするには、[**App Settings** -> **Apple Search Ads** タブ](https://app.adapty.io/settings/apple-search-ads)を開き、**Receive Apple Search Ads attribution** スイッチをオフにしてください。
:::warning
この設定を無効にすると、ASA アナリティクスの受信が完全に停止します。その結果、ASA はアナリティクスで使用されなくなり、インテグレーションにも送信されなくなります。また、SplitMetrics Acquire と Asapty は ASA アトリビューションに依存して動作しているため、機能しなくなります。
この変更以前に受信済みのアトリビューションには影響しません。
:::
## 独自のキーをアップロードする \{#uploading-your-own-keys\}
:::note
オプション
これらの手順は Apple Ads アトリビューションには必要ありません。Asapty などの他のサービスや独自ソリューションと連携する場合にのみ必要です。
:::
ASA アトリビューションに他のサービスや独自ソリューションを使用している場合は、独自の公開鍵・秘密鍵ペアを使用できます。
### ステップ 1 \{#step-1\}
ターミナルで秘密鍵を生成する
```text showLineNumbers title="Text"
openssl ecparam -genkey -name prime256v1 -noout -out private-key.pem
```
Adapty の Settings -> Apple Ads でアップロードする(**Upload private key** ボタン)
### ステップ 2 \{#step-2\}
ターミナルで公開鍵を生成する
```text showLineNumbers title="Text"
openssl ec -in private-key.pem -pubout -out public-key.pem
```
この公開鍵は、API Account Manager ロールを持つアカウントの Apple Ads 設定で使用できます。これにより、生成された Client ID、Team ID、Key ID の値を Adapty や他のサービスで利用できます。
---
# File: account
---
---
title: "アカウント詳細と請求"
description: "Adapty アカウントを管理し、サブスクリプションのトラッキングに最適な設定を行いましょう。"
---
**Account** ページでは、プロファイル、チームメンバー、請求情報を管理できます。
このページには 3 つのタブがあります。
- [一般設定](#general-settings)
- [サブスクリプションと請求](#billing-info)
- [メンバー](#members)
アカウント設定にアクセスするには、右上の **Account** をクリックするか、[app.adapty.io/account](https://app.adapty.io/account) にアクセスしてください。
## 一般設定 \{#general-settings\}
「General」タブには、プロファイル、アカウント設定、表示設定、レポート設定が含まれています。
- **Profile**: 名前、姓、会社名を入力します。会社名は最大 256 文字まで入力できます。
- **Account settings**: 登録済みのメールアドレスを確認し、パスワードを変更できます。
- **Date & Time formats**: Adapty 全体での日付と時刻の表示形式を選択します。
- **American format**: January 31, 2022 および 12 時間表示 (AM/PM)
- **European format**: 31 January, 2022 および 24 時間表示 (16:00)
- **Email reports**: 1 つまたはすべてのアプリに対して、日次・週次・月次のレポートを設定します。すべてのアプリのレポートをまとめて受け取るか、選択した各アプリの詳細レポートを受け取るかを選べます。
## サブスクリプションと請求 \{#billing-info\}
**Subscription & Billing** タブでは、支払い情報と機能へのアクセスを管理できます。
- 支払い情報の追加または更新
- 請求情報の確認
- 追加の有料機能の購入
機能と料金の詳細については、[こちら](https://adapty.io/pricing)をご覧ください。
## メンバー \{#members\}
アカウント設定からチームメンバーを管理できます。チームメンバーを追加するには、メールアドレスで招待してロールを割り当ててください。
チームメンバーとアクセス権限の管理については、[こちら](members-settings)をご覧ください。
---
# File: members-settings
---
---
title: "メンバー"
description: "Adaptyダッシュボードでメンバーの設定と権限を管理します。"
---
:::note
このページはAdaptyダッシュボードのメンバーに関するものです
アプリのユーザーに異なるアクセスレベルを付与したい場合は、[アクセスレベル](access-level)を参照してください。
:::
Adaptyダッシュボードのメンバーシステムでは、Adaptyへのアクセスレベルを各メンバーごとに設定し、利用可能なアプリを指定することができます。
## ロール \{#roles\}
Adapty ダッシュボードのメンバーには、以下のロールが利用できます。
| ロール | 請求情報へのアクセス | メンバーの追加 | 変更の実行 | 全セクションへのアクセス |
|-------------|-------------------|-----------------|-----------------|------------------------|
| Owner | ✅ | ✅ | ✅ | ✅ |
| Admin | ❌ | ✅ | ✅ | ✅ |
| Developer | ❌ | ❌ | ✅ | ❌ |
| Viewer | ❌ | ❌ | ❌ | ✅ |
| Support | ❌ | ❌ | ❌ | ❌ |
| ASA manager | ❌ | ❌ | ❌ | ❌ |
- **Owner:** オーナーはAdaptyアカウントの最初の作成者であり、最高レベルのアクセス権と管理権を持ちます。Adaptyの請求に対して完全なアクセス権を持ち、支払い情報やサブスクリプションプランを管理できます。また、新しいメンバーのアプリケーションアクセスを指定できるのはオーナーと管理者のみです。各Adaptyアカウントにオーナーは1人だけです。
- **Admin:** 管理者ロールのメンバーは、選択したアプリケーションへの完全なアクセス権を持ちます。ペイウォールの作成・変更、A/B テストの実施、アナリティクスの分析、アプリケーション内のメンバー管理など、さまざまな管理タスクを実行できます。
- **Developer:** デベロッパーロールのメンバーは、アナリティクスとアカウントメンバーを除くすべてのエンティティへの完全なアクセス権を持ちます。請求設定へのアクセスはできません。このロールは、ペイウォール・A/B テスト・その他のエンティティのセットアップやAdaptyのアプリへの統合を担当するが、財務データを閲覧すべきでない人向けです。
- **Viewer:** ビューワーロールのメンバーは、選択したアプリケーションへの読み取り専用アクセス権を持ちます。情報の閲覧はできますが、ペイウォールやA/B テストなどの機能の作成・変更、新規ユーザーの招待、新規アプリの作成、アプリ設定の変更はできません。
- **Support:** サポートロールのメンバーは、選択したアプリケーションのユーザープロファイルにのみアクセスできます。ただし、新しいメンバーの追加やAdaptyの他のセクションへのアクセスなどの操作は行えません。このロールは、サブスクリプションに関する問い合わせやトラブルシューティングでお客様をサポートする必要があるサポートチームや個人に特に適しています。
- **ASA manager:** ASAマネージャーロールのメンバーは、[Adapty Ads Manager](adapty-ads-manager)のダッシュボードにのみアクセスできます。
## メンバーを追加する \{#add-a-member\}
Adaptyでは、最大256人のチームメンバーを招待できます。新しいメンバーの追加は無料です。
:::note
招待できるのは、Adaptyにまだ登録されていないメールアドレスのみです。同僚がすでに個人アカウントを持っている場合は、別のメールアドレスで招待するか、Adaptyサポートに既存アカウントの削除を依頼してください。
:::
チームメンバーを追加するには:
1. 右上の **Account** をクリックして、**Members** タブを開きます。
2. **Invite member** をクリックします。
3. メンバーのメールアドレスを入力します。
4. リストから[ロール](#roles)を選択します。
5. アクセスを許可するアプリを選択します。
6. (任意)**Always allow access to new apps** を有効にすると、今後追加されるアプリへのアクセスも自動的に付与されます。
7. **Save** をクリックします。
## アカウントのオーナーシップを移譲する \{#transfer-account-ownership\}
**アカウントのオーナーシップ**全体を移譲する必要がある場合は、[support@adapty.io](mailto:support@adapty.io)のサポートチームにお問い合わせください。
**アプリのオーナーシップ**を移譲する必要がある場合は、[専用ガイド](transfer-apps)を参照してください。
---
# File: set-up-app-store-connect
---
---
title: "App Store Connect のセットアップ"
description: "Apple Developer Program への登録とアプリ内課金のための App Store Connect セットアップを初めて行う開発者向けガイド。"
---
**初めて iOS アプリを開発する場合**、Adapty を統合する前に Apple Developer アカウントと App Store Connect のセットアップを行う必要があります。
:::note
すでに Apple Developer アカウントをお持ちで、App Store Connect にアプリを登録済みの場合は、このガイドをスキップして [App Store との初期連携](initial_ios) に直接進んでください。
:::
## ステップ 1. Apple Developer Program に登録する \{#step-1-enroll-in-apple-developer-program\}
App Store でアプリを配布してアプリ内課金を販売するには、[Apple Developer Program](https://developer.apple.com/programs/) に参加する必要があります。
### 登録タイプを選択する \{#choose-enrollment-type\}
Apple では 2 種類の登録タイプを用意しています。
| | 個人 | 組織 |
|-----------------------------|--------------------|------------------------------|
| **対象者** | 個人開発者 | 企業・チーム・非営利団体 |
| **D-U-N-S ナンバーの要否** | 不要 | 必要 |
| **アプリの公開名** | 個人名 | 組織名 |
| **チーム管理** | 利用不可 | 利用可能 |
:::tip
組織として登録する場合は、**D-U-N-S ナンバー**(Dun & Bradstreet が発行する 9 桁の企業識別番号)が必要です。[組織にすでに番号が割り当てられているか確認する](https://developer.apple.com/enroll/duns-lookup/) か、ページ下部のリンクから新規取得を申請できます。D-U-N-S ナンバーの発行には最大 5 営業日かかる場合があります。
:::
### 登録する \{#enroll\}
1. [Apple Developer Program の登録ページ](https://developer.apple.com/programs/enroll/) にアクセスします。
2. Apple ID でサインインします。Apple ID をお持ちでない場合は、先に作成してください。
3. 登録タイプ(個人または組織)に応じた手順に従います。
4. 年会費を支払います。
Apple が登録を処理すると、[App Store Connect](https://appstoreconnect.apple.com) へのアクセスが付与されます。登録には通常最大 48 時間かかります。組織の場合、D-U-N-S の確認が必要なときはさらに時間がかかることがあります。
## ステップ 2. App Store Connect でアプリをセットアップする \{#step-2-set-up-your-app-in-app-store-connect\}
アプリ内課金を販売する前に、App Store Connect で初期設定を完了する必要があります。この設定には、契約への署名、支払い情報の追加、アプリの登録が含まれます。
### 有料アプリケーション契約に署名する \{#sign-the-paid-applications-agreement\}
App Store で販売するには、Apple の Paid Applications Agreement(有料アプリケーション契約)への署名が必要です。これは有料アプリだけでなく、無料アプリ内のアプリ内課金にも適用されます。
1. [App Store Connect](https://appstoreconnect.apple.com/business) の **Business** ページに移動します。
2. **Paid Apps** の契約を見つけ、**Review and Agree** をクリックします。
3. 必要な情報を入力します。
- **Banking information**: Apple から収益が振り込まれる銀行口座を追加します。
- **Tax information**: 販売したい国の税務フォームに記入します。
- **Contact information**: 連絡先情報を入力します。
:::important
契約を有効にするには、3 つのセクション(銀行情報、税務情報、連絡先情報)をすべて入力する必要があります。契約が有効になるまで、アプリ内課金を販売することはできません。
:::
### Bundle ID を作成する \{#create-a-bundle-id\}
Bundle ID は、Apple のエコシステム全体でアプリを一意に識別します。App Store Connect へのアプリ登録と Adapty 連携の設定に必要です。
1. [Apple Developer ポータル](https://developer.apple.com/account) を開きます。
2. **Certificates, Identifiers & Profiles** → **Identifiers** に移動します。
3. **+** をクリックして新しい識別子を登録します。
4. **App IDs** を選択して **Continue** をクリックします。
5. タイプとして **App** を選択し、**Continue** をクリックします。
6. 以下の項目を入力します。
- **Description**: この Bundle ID を識別するための名前(例:「My Subscription App」)。
- **Bundle ID**: **Explicit** を選択し、逆ドメイン形式の一意の識別子を入力します(例:`com.yourcompany.yourapp`)。
7. **Capabilities** セクションで下にスクロールし、**In-App Purchase** にチェックを入れます。
8. **Continue** をクリックし、次に **Register** をクリックします。
### App Store Connect にアプリを登録する \{#register-your-app-in-app-store-connect\}
1. [App Store Connect](https://appstoreconnect.apple.com/apps) の **Apps** ページに移動します。
2. **+** → **New App** をクリックします。
3. 必要な項目を入力します。
- **Platforms**: **iOS** を選択します。
- **Name**: App Store に表示されるアプリ名。
- **Primary language**: アプリのメタデータのデフォルト言語。
- **Bundle ID**: 前の手順で作成した Bundle ID を選択します。
- **SKU**: アプリの一意の識別子(ユーザーには表示されません)。例:`my_subscription_app_2025`。
4. **Create** をクリックします。
これでアプリが App Store Connect に登録され、Adapty 連携の準備が整いました。
## 次のステップ \{#whats-next\}
- [App Store との初期連携](initial_ios): App Store アプリを Adapty に接続する
- [SDK の統合](quickstart-sdk): Adapty SDK をアプリのコードに統合する
- [サンドボックステスト](test-purchases-in-sandbox): リリース前にアプリ内課金をテストする
- [iOS アプリを App Store に提出する](submit-app-to-app-store): ビルドをアップロードして Apple の審査に提出する
- [App Store Small Business Program](app-store-small-business-program): App Store の手数料を 30% から 15% に引き下げる
---
# File: app-store-products
---
---
title: "App Store のプロダクト"
description: "Adapty のサブスクリプションツールを使って App Store のプロダクトを効率的に管理しましょう。"
---
このページでは、App Store Connect でプロダクトを作成する方法を説明します。Adapty の機能とは直接関係ない内容も含まれますが、App Store Connect アカウントでプロダクトを作成する際に困ったときに役立つ情報です。
Adapty に連携するプロダクトを作成するには、以下の手順に従ってください。
1. **App Store Connect** を開き、左側メニューの [**Monetization** → **Subscriptions**](https://appstoreconnect.apple.com/apps/6477523342/distribution/subscriptions) セクションに進みます。
2. サブスクリプショングループをまだ作成していない場合は、**Subscription Groups** タイトルの下にある **Create** ボタンをクリックして作成を開始します。App Store Connect の [Subscription Groups](https://developer.apple.com/help/app-store-connect/manage-subscriptions/offer-auto-renewable-subscriptions) は、プロダクトを分類・管理し、ユーザーがさまざまなプランをシームレスに切り替えられるようにするための機能です。なお、グループ外にサブスクリプションを作成することはできません。
3. 表示された **Create Subscription Group** ウィンドウで、**Reference Name** フィールドに新しいサブスクリプショングループ名を入力します。参照名は、アプリ内の異なるサブスクリプショングループを区別・管理するために自分で定義するラベルまたは識別子です。
参照名はユーザーには表示されず、主に内部での整理・管理に使用します。App Store Connect の管理画面で特定のサブスクリプショングループを識別・参照する際に役立ちます。複数のサブスクリプションプランがある場合や、アプリの構成に合った形でカテゴリ分けしたい場合に特に便利です。
4. **Create** ボタンをクリックして、サブスクリプショングループの作成を確定します。
5. サブスクリプショングループが作成され、開かれます。次に、グループ内にサブスクリプションを作成します。**Subscriptions** タイトルの下にある **Create** ボタンをクリックします。既存のグループに新しいサブスクリプションを追加する場合は、**Subscriptions** タイトルの隣にある **Plus** ボタンをクリックします。
6. 表示された **Create Subscription** ウィンドウで、**Reference Name** フィールドに名前を、**Product ID** フィールドにサブスクリプションの固有コードを入力します。
Reference Name は、App Store Connect 内でアプリ内サブスクリプションを識別するための専用識別子です。App Store のユーザーには表示されません。作成するサブスクリプションの内容が明確にわかる、人が読みやすい説明文を使用することをお勧めします。なお、この名前は 64 文字以内にする必要があります。
Product ID は、開発フェーズでプロダクトにアクセスし、アプリ内サブスクリプションを管理するサービスである Adapty と同期するために必要な、一意の英数字識別子です。Product ID には英数字、ピリオド、アンダースコアのみ使用できます。
7. **Create** ボタンをクリックして、サブスクリプションの作成を確定します。
8. サブスクリプションが作成され、開かれます。次に、**Subscription Duration** リストからサブスクリプションの期間を選択します。サブスクリプション名に期間が既に含まれている場合でも、**Subscription Duration** フィールドへの入力を忘れずに行ってください。
9. 次は、サブスクリプションの価格を設定します。**Subscription Prices** タイトルの下にある **Add Subscription Price** ボタンをクリックしてください。見つからない場合は、下にスクロールしてみてください。
10. 表示された **Subscription Price** ウィンドウで、**Country or Region** リストから基準となる国を、**Price** リストから基準となる通貨を選択します。Appleがこの基本価格と最新の為替レートをもとに、175 か国・地域すべての価格を自動計算します。
11. **Next** ボタンをクリックします。表示された **Price by Country or Region** ウィンドウには、すべての国の価格が自動計算された状態で表示されます。必要に応じて変更することもできます。
12. 地域別の価格を更新したら、ウィンドウ下部の **Next** ボタンをクリックして進みます。
13. 表示された **Confirm Subscription Price?** ウィンドウで、最終的な価格を慎重に確認します。価格を修正する場合は、**Back** ボタンをクリックして **Price by Country or Region** ウィンドウに戻り、更新できます。価格に問題がなければ、**Confirm** ボタンをクリックします。
14. **Confirm Subscription Price?** ウィンドウを閉じた後、サブスクリプションウィンドウで **Save** ボタンをクリックするのを忘れないでください。クリックしないと、サブスクリプションが作成されず、入力したデータがすべて失われます。
なお、ここまでの手順は自動更新サブスクリプション(Auto-Renewable Subscription)の設定を対象としています。その他の種類のアプリ内課金を設定する場合は、サイドバーの「Subscriptions」ではなく **In-App Purchases** タブをクリックしてください。そこから、さまざまな種類のアプリ内課金を管理・作成できるセクションにアクセスできます。
### Adapty にプロダクトを追加する \{#add-products-to-adapty\}
App Store Connect でのアプリ内課金、サブスクリプション、オファーの追加が完了したら、次は [これらのプロダクトを Adapty に追加](create-product) します。
---
# File: apple-app-privacy
---
---
title: "Apple App Privacy"
description: "Appleアプリのプライバシーポリシーとサブスクリプションアプリへの影響を理解する。"
---
Appleは、App Store Connectの **App Privacy** セクションおよびアプリのマニフェストファイルとして、すべての新しいアプリおよびアップデートに対してプライバシーの開示を義務付けています。AdaptyはアプリのサードパーティSDKであるため、ユーザーデータに関してAdaptyをどのように使用しているかを開示する必要があります。
## Apple アプリプライバシーマニフェスト \{#apple-app-privacy-manifest\}
`PrivacyInfo.xcprivacy` という名前の[プライバシーマニフェストファイル](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests)は、アプリが使用するプライベートデータとその理由を記述します。アプリオーナーはすべて、自分のアプリ用のマニフェストファイルを作成する必要があります。さらに、追加のSDKを統合している場合は、[プライバシーマニフェストと署名が必要なSDK](https://developer.apple.com/support/third-party-SDK-requirements/)リストに含まれるSDKのマニフェストファイルが含まれていることを確認してください。アプリをビルドする際、Xcodeはこれらすべてのマニフェストファイルを1つにまとめます。
Adaptyは[プライバシーマニフェストと署名が必要なSDK](https://developer.apple.com/support/third-party-SDK-requirements/)のリストには含まれていませんが、Adapty SDK バージョン2.10.2以降では便宜のためにマニフェストが含まれています。マニフェストを取得するためにSDKを更新してください。
Adaptyはアプリプライバシーレポートとも呼ばれるマニフェストファイルにデータを含める必要はありませんが、トラッキングのためにAdaptyの `customerUserId` を使用している場合は、次のようにマニフェストファイルに指定する必要があります:
1. プライバシー情報ファイルの `NSPrivacyCollectedDataTypes` 配列にディクショナリを追加します。
2. ディクショナリに `NSPrivacyCollectedDataType`、`NSPrivacyCollectedDataTypeLinked`、`NSPrivacyCollectedDataTypeTracking` キーを追加します。
3. `NSPrivacyCollectedDataTypes` ディクショナリの `NSPrivacyCollectedDataType` キーに、文字列 `NSPrivacyCollectedDataTypeUserID`([マニフェストファイルで報告するデータカテゴリとタイプの一覧](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests#Describe-the-data-your-app-or-third-party-SDK-collects)における `UserID` データタイプの識別子)を追加します。
4. `NSPrivacyCollectedDataTypes` ディクショナリの `NSPrivacyCollectedDataTypeTracking` および `NSPrivacyCollectedDataTypeLinked` キーに `true` を追加します。
5. `NSPrivacyCollectedDataTypes` ディクショナリの `NSPrivacyCollectedDataTypePurposes` キーの値として、文字列 `NSPrivacyCollectedDataTypePurposeProductPersonalization` を使用します。
カスタム属性を使用してオーディエンスにペイウォールをターゲティングしている場合は、使用しているカスタム属性が[マニフェストファイルで報告するデータカテゴリとタイプ](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests)に該当するかどうかを慎重に確認してください。該当する場合は、データタイプごとに上記の手順を繰り返してください。
収集するすべてのデータタイプとカテゴリを報告したら、[Appleのドキュメント](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests#Create-your-apps-privacy-report)に従ってアプリのプライバシーレポートを作成してください。
## App Store Connectでのプライバシー開示 \{#apple-app-privacy-disclosure-in-app-store-connect\}
1. [App Store Connect](https://appstoreconnect.apple.com/)でアプリを開き、**App Privacy** に移動します。**Get Started** をクリックします。
2. **Yes, we collect data from this app** を選択し、**Next** をクリックします。
### データタイプ \{#data-types\}
以下の表は、Appleが開示を求めるデータタイプと、Adaptyが必要とするものを示しています。**これはAdaptyのみを対象としています。** アプリが他のSDKや独自のコードを通じて追加データを収集する場合は、それらのデータタイプも選択してください。
✅ = Adaptyが必要とする
👀 = 必要な場合あり(詳細は下記参照)
❌ = Adaptyでは不要 — アプリが他の手段でこのデータを収集する場合に選択
| データタイプ | 必要 | 備考 |
|--------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------|
| 識別子 | ✅ | customerUserIdでユーザーを識別している場合は、「User ID」を選択します。
AdaptyはIDFAを収集するため、「Device ID」を選択する必要があります。
| | 購入 | ✅ | Adaptyはユーザーの購入履歴を収集します。 | | 名前、電話番号、メールアドレスなどの連絡先情報 | 👀 | **`updateProfile`** メソッドを使用して名前、電話番号、メールアドレスなどの個人データを渡す場合に必要です。 | | 使用状況データ | 👀 | Amplitude、Mixpanel、AppMetrica、Firebaseなどのアナリティクスを使用している場合に必要な場合があります。 | | 位置情報 | ❌ | Adaptyは正確な位置情報を収集しません。アプリが収集する場合は選択してください。 | | ヘルス&フィットネス | ❌ | Adaptyはヘルスやフィットネスデータを収集しません。アプリが収集する場合は選択してください。 | | 機密情報 | ❌ | Adaptyは機密情報を収集しません。アプリが収集する場合は選択してください。 | | ユーザーコンテンツ | ❌ | Adaptyはユーザーコンテンツを収集しません。アプリが収集する場合は選択してください。 | | 診断情報 | ❌ | Adaptyは診断データを収集しません。アプリが収集する場合は選択してください。 | | 閲覧履歴 | ❌ | Adaptyは閲覧履歴を収集しません。アプリが収集する場合は選択してください。 | | 検索履歴 | ❌ | Adaptyは検索履歴を収集しません。アプリが収集する場合は選択してください。 | | 連絡先 | ❌ | Adaptyは連絡先リストを収集しません。アプリが収集する場合は選択してください。 | | 財務情報 | ❌ | Adaptyは財務情報を収集しません。アプリが収集する場合は選択してください。 | ### 必須データタイプ \{#required-data-types\} #### 購入 \{#purchases\} Adaptyを使用する場合、アプリが**購入履歴**を収集することを開示する必要があります。
#### 識別子 \{#identifiers\}
Adaptyを使用する場合、次の識別子を開示する必要があります:
- **Device ID** — AdaptyはIDFAを収集します。
- **User ID** — **`customerUserId`** でユーザーを識別する場合に必要です。
### データの使用目的 \{#data-usage\}
**データタイプ**を保存した後、データの使用目的を示す必要があります:
1. **Purchases** ブロック内の **Set up purchase history** をクリックします。
2. Appleが購入履歴データの使用目的を尋ねてきたら、Adaptyに関して以下を選択します:
- **Analytics** — Adaptyは収益アナリティクス、コホート、および指標のために購入履歴を使用します。
- **Product Personalization** — Adaptyはオーディエンスのセグメンテーションとペイウォールのターゲティングのために購入データを使用します。
- **App Functionality** — Adaptyは購入を検証し、アクセスレベルを管理し、サブスクリプションの状態を追跡します。
アプリが他の方法で購入データを使用する場合(例:Adaptyインテグレーション経由で広告プラットフォームに購入イベントを送信する場合)は、追加の目的を選択してください。
3. **Next** をクリックします。
4. **Device ID** および **User ID**(使用している場合)のいずれについても:
1. **User/Device ID** ブロック内の **Set up user/device ID** をクリックします。
2. Appleが識別子データの使用目的を尋ねてきたら、Adaptyに関して以下を選択します:
- **App Functionality** — Adaptyはユーザープロファイルの管理、購入の紐付け、アクセスレベルの追跡のために識別子を使用します。
Adaptyインテグレーション(AppsFlyerやAdjustなど)経由でサードパーティプラットフォームにアトリビューションデータを送信する場合は、**Third-Party Advertising** も選択してください。アプリが他の方法で識別子を使用する場合は、追加の目的を選択してください。
5. **Next** をクリックします。
---
# File: apple-family-sharing
---
---
title: "Appleファミリー共有"
description: "AdaptyでAppleファミリー共有を有効にして、共有サブスクリプションをサポートします。"
---
Appleのファミリー共有を使うと、アプリ内課金を家族メンバー間で共有できます。ビデオストリーミングサービスや子ども向けアプリなど、グループ向けアプリのユーザーが、Apple IDを共有せずにサブスクリプションを分け合える便利な仕組みです。最大5人の家族メンバーがサブスクリプションを利用できるようになるため、[ファミリー共有](https://developer.apple.com/documentation/storekit/supporting-family-sharing-in-your-app)はアプリのユーザーエンゲージメントや継続率の向上に役立ちます。
このガイドでは、ファミリー共有にサブスクリプションをオプトインする方法と、Adaptyがファミリー内で共有された購入をどのように管理するかについて説明します。
特定のプロダクトのファミリー共有を有効にするには、まず[App Store Connect](https://appstoreconnect.apple.com/)にアクセスしてください。ファミリー共有は、新規・既存のアプリ内課金いずれもデフォルトでオフになっているため、各アプリ内課金ごとに個別に有効化する必要があります。**アプリのページ**にアクセスし、対象のアプリ内課金ページに移動して、ファミリー共有セクションの**Turn On**オプションを選択するだけで簡単に設定できます。
一度プロダクトのファミリー共有を有効にすると、**再び無効にすることはできません**。すでに家族とサブスクリプションを共有しているユーザーのエクスペリエンスが損なわれるためです。
また、共有できるのは非消耗型アイテムとサブスクリプションのみである点にもご注意ください。
表示されたモーダルで**Confirm**ボタンをクリックすると、設定が完了します。完了すると、ファミリー共有セクションに「このサブスクリプションはファミリーグループの全員で共有できます」というメッセージが表示されます。これにより、サブスクリプションがファミリー共有に対応し、最大5人の家族メンバーと共有できるようになったことが確認できます。
Adaptyでは、追加の作業なしでファミリー共有をサポートできます。[App Storeのプロダクトを設定](app-store-products)するだけで、App Store Connectで**ファミリー共有**を**有効化**すると、**Adapty**に自動的に反映され、Webhookでイベントとして受信されます。
:::note
ファミリー共有はサンドボックス環境ではサポートされていません。
:::
ユーザーがサブスクリプションを購入して家族メンバーと共有した場合、家族メンバーが利用できるようになるまで**最大1時間の遅延**が発生することがあります。これはAppleが意図的に設けたもので、ユーザーが気が変わった際に共有を取り消せるようにするためです。ただし、サブスクリプションが更新された場合、家族メンバーへの反映に遅延はありません。
ユーザーがファミリー共有対応のアプリ内プロダクトを購入すると、通常通りレシートにトランザクションが記録されますが、`in_app_ownership_type`というフィールドが追加され、値は`PURCHASED`となります。さらに、すべての家族メンバーに対して新しいトランザクションが作成され、元の購入とは異なる`web_order_line_item_id`および`original_transaction_id`が付与されます。この場合、`in_app_ownership_type`フィールドの値は`FAMILY_SHARED`となります。
正確な収益計算を行うため、Adaptyアナリティクスでは`in_app_ownership_type`が`PURCHASED`のトランザクションのみを集計します。`FAMILY_SHARED`トランザクションは収益およびコンバージョン指標から除外されます。
**ファミリー共有トランザクションに送信されるイベント**
`FAMILY_SHARED`トランザクションは**アクセスレベル更新**イベントのみを発火します。プロダクト単位のサブスクリプションイベントは家族メンバーには発火しません。
| イベント | `FAMILY_SHARED` | `PURCHASED` |
| --- | --- | --- |
| **アクセスレベル更新** | あり | あり |
| **サブスクリプション開始** | なし | あり |
| **トライアル開始** | なし | あり |
| **サブスクリプション更新** | なし | あり |
| **サブスクリプション終了** | なし | あり |
| **サブスクリプション返金** | なし | あり |
| **請求エラー検出** | なし | あり |
ダウンストリームのアナリティクスが**サブスクリプション開始**を基準にしている場合、家族メンバーはそこに表示されません。アクティブな家族メンバーを検出するには、**アクセスレベル更新**を使用してください。
Adaptyで他の家族メンバーを特定するには、イベントの詳細を確認します。まず、元のファミリー購入トランザクションを見つけます。次に、そのトランザクションのイベント詳細で、同じプロダクト、購入日、有効期限のものを探してください。イベント詳細を分析することで、元の購入に関連する他のファミリーメンバーシップトランザクションを特定できます。
---
# File: app-store-small-business-program
---
---
title: "App Store Small Business Program"
description: "Apple の Small Business Program の内容と、収益および Adapty のアナリティクスへの影響について説明します"
---
:::link
対応する Play Store プログラムについては、[Google 手数料減額サービス](google-reduced-service-fee)をご覧ください。
:::
年間の App Store 収益が 100 万ドル以下の組織は、Apple の [Small Business Program](https://developer.apple.com/app-store/small-business-program/) に参加できます。登録すると、標準の 30% ストア手数料が **15%** に引き下げられます。
プログラムに参加する場合は、収益計算とインテグレーションイベントの処理を正確に行うために、**Adapty の設定を変更する**必要があります。
この記事では以下について説明します:
* [アプリが Small Business Program に登録されている場合の Adapty 設定方法](#configure-adapty)
* [ストア手数料を削減するためのプログラム登録方法](#apply-for-the-program)
## Adapty の設定 \{#configure-adapty\}
Adapty では、[アナリティクス](analytics)および[インテグレーションイベント](analytics-integration)に対して引き下げられた手数料率を適用できます。有効にするには、アプリごとに Small Business Program のステータスを指定してください。
:::warning
承認を受けたら**すぐに** Adapty で SBP ステータスを設定してください。遅れて変更しても、配信済みの Webhook イベントは書き換えられません([詳細](#retroactive-setting-changes))。
:::
1. [**App Settings** → **General**](https://app.adapty.io/account) を開きます。
2. **Small Business Program** セクションを見つけます。
3. **Add period** をクリックします。
4. メンバーシップの開始日を選択します。
5. 終了日を選択するか、**At the current moment** チェックマークを有効にしてステータスを無期限に延長します。将来[資格を失った](#losing-eligibility)場合は、終了日を変更できます。
6. **Apply** をクリックします。
組織がプログラムの資格を維持している場合、メンバーシップは翌暦年に引き継がれます。ただし、メンバーシップステータスは**指定した期間のみ**に適用されます。
* **Add period** をクリックして新しいメンバーシップ期間を追加します。
* ステータスを無期限に延長するには、**At the current moment** チェックマークを有効にします。
設定を確認するには、[収益チャート](revenue)を開き、**Proceeds after store commission** を選択します。表示される収益が引き下げ後の手数料率を反映していることを確認してください。
## プログラムへの申請 \{#apply-for-the-program\}
### 資格要件 \{#eligibility-requirements\}
Apple は**年間収益**(前暦年の売上からストア手数料と税金を差し引いた金額)に基づいて SBP の資格を判定します。
資格を得るには、あなたの組織とその
2. **Create subscription** ボタンをクリックします。
3. 表示された **Create subscription** ウィンドウで、**Product ID** フィールドにサブスクリプションIDを、**Name** フィールドにサブスクリプション名を入力します。
Product IDはユニークである必要があり、数字または小文字で始まり、アンダースコア(\_)やピリオド(.)を含めることができます。開発中にプロダクトにアクセスしたり、Adaptyと同期したりするために使用されます。一度Google PlayコンソールでProduct IDがプロダクトに割り当てられると、そのプロダクトが削除されても、他のアプリで再利用することはできません。
Product IDの命名には、標準化されたフォーマットに従うことをお勧めします。より簡潔なアプローチとして、`<サブスクリプション名>.<アクセスレベル>` という形式でプロダクトに名前を付けることを推奨します。そうすることで、weekly、monthlyなどのベースプランを使って期間や請求頻度を管理できます。
Nameはあくまで内部参照用ですが、Google Playストアの掲載ページにも表示されるため、分かりやすい名前を自由に付けてください。最大55文字まで使用できます。
4. **Create** ボタンをクリックしてサブスクリプションの作成を確定します。
:::note
AdaptyにおけるGoogle Playサブスクリプションプロダクト
Adaptyのプロダクトは、Google Playサブスクリプションのベースプランに対応します。これは、ベースプランがユーザーが実際に購入できるプロダクトだからです。Adaptyは既存のGoogle Playサブスクリプションとそれに対応するベースプランの移行をシームレスに処理するため、追加の作業は不要です。ただし、Adaptyで新しいプロダクトを追加する際は、ベースプランIDとProduct IDの両方を指定する必要があります。
:::
### ベースプランを作成する \{#create-a-base-plan\}
サブスクリプションプロダクトには、ベースプランを追加する必要があります。ベースプランは、ユーザーがサブスクリプションを購入する際の請求期間、価格、更新タイプを決定します。なお、ユーザーはサブスクリプションプロダクトを直接購入するのではなく、常にサブスクリプション内のベースプランを購入する形になります。
ベースプランを作成するには:
1. Google PlayコンソールのLeft menuから [**Monetize** -> **Subscriptions**](https://console.cloud.google.com/iam-admin/serviceaccounts) セクションを開きます。そこで、ベースプランを追加したいサブスクリプションを見つけます。
2. サブスクリプションの横にある **View subscription** ボタンをクリックします。
3. サブスクリプションの詳細が表示されたら、**Base plans and offers** タイトルの下にある **Add base plan** ボタンをクリックします。スクロールダウンしないと表示されない場合があります。
4. 表示された **Add base plan** ウィンドウで、**Plan ID** フィールドにベースプランのユニークな識別子を入力し、必須項目を入力します。IDは数字または小文字で始まり、数字(0-9)、小文字(a-z)、ハイフン(-)を含めることができます。
5. 地域ごとの価格を設定します。
6. **Save** ボタンをクリックして設定を確定します。
7. **Activate** ボタンをクリックしてベースプランを有効化します。
Adaptyでは、サブスクリプションプロダクトには期間と更新タイプが一致する単一のベースプランのみ設定できる点にご注意ください。
### フォールバックプロダクト \{#fallback-products\}
:::warning
後方互換性のないベースプランのサポートについて
古いバージョンのAdapty SDKは、Google Billing Library v5+の機能(サブスクリプションプロダクトごとの複数ベースプランおよびオファー)をサポートしていません。これらのSDKバージョンでは、Google PlayコンソールでGame **[後方互換](https://support.google.com/googleplay/android-developer/answer/12124625?hl=en#backwards_compatible)** とマークされたベースプランのみにアクセスできます。なお、後方互換としてマークできるベースプランはサブスクリプションごとに1つだけです。
:::
Adaptyで強化されたGoogleサブスクリプションの設定と機能を最大限に活用するために、後方互換のフォールバックプロダクトを設定する機能を提供しています。このフォールバックプロダクトは、古いバージョンのAdapty SDKを使用するアプリ専用に使用されます。Google Playプロダクトを作成する際に、そのプロダクトをPlayコンソールで後方互換としてマークするかどうかを指定できます。Adaptyはこの情報を使って、そのプロダクトが古いバージョンのSDK(バージョン2.5以下)で購入可能かどうかを判断します。
例えば、`subscription.premium` というサブスクリプションに「週次(後方互換)」と「月次」の2つのベースプランがあるとします。`subscription.premium:weekly` プロダクトをAdaptyに追加する場合、後方互換プロダクトを指定する必要はありません。しかし、`subscription.premium:monthly` プロダクトの場合は、後方互換プロダクトを指定する必要があります。指定しないと、Google Billing Library v4で意図せず `subscription.premium:weekly` プロダクトが購入されてしまう可能性があります。このシナリオに対応するために、月次でかつ後方互換としてマークされたベースプランを持つ別のプロダクトを作成する必要があります。これにより、`subscription.premium:monthly` を選択したユーザーが正しい頻度で請求されることが保証されます。
## Adaptyにプロダクトを追加する \{#add-products-to-adapty\}
App Store Connectでアプリ内課金、サブスクリプション、オファーの追加が完了したら、次のステップとして[これらのプロダクトをAdaptyに追加](create-product)します。
---
# File: google-play-data-safety
---
---
title: "Google Play データセーフティ"
description: "AdaptyでGoogle Playデータセーフティポリシーへの準拠を確認します。"
---
Google Playのデータセーフティセクションは、アプリ開発者がユーザーに対して、アプリが収集または共有するデータについて簡単に説明し、アプリの重要なプライバシーおよびセキュリティ対策を強調するための方法を提供しています。この情報により、ユーザーはダウンロードして使用するアプリを選ぶ際に、より十分な情報に基づいた判断ができるようになります。
以下は、Adaptyが収集するデータについての簡単なガイドです。Google Playに必要な情報を提供する際にご活用ください。
## データ収集とセキュリティ \{#data-collection-and-security\}
**アプリは必要なユーザーデータタイプを収集または共有していますか?**
Adaptyはユーザーの購入履歴を収集するため、「はい」を選択してください。
**アプリが収集するすべてのユーザーデータは転送中に暗号化されますか?**
Adaptyは転送中のデータを暗号化するため、「はい」を選択してください。
**ユーザーがデータの削除をリクエストできる方法を提供していますか?**
「はい」を選択する場合は、ユーザーがサポートチームにデータ削除をリクエストできる手段を確保してください。Adapty ダッシュボードまたはREST APIから直接ユーザーを削除できます。
## データタイプ \{#data-types\}
以下は、Googleが申告を求めるデータタイプの一覧です。Adaptyが各タイプのデータを収集するかどうかを示しています。
| データタイプ | 詳細 |
| :---------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 位置情報 | Adaptyは収集しません |
| 健康とフィットネス | Adaptyは収集しません |
| 写真と動画 | Adaptyは収集しません |
| ファイルとドキュメント | Adaptyは収集しません |
| カレンダー | Adaptyは収集しません |
| 連絡先 | Adaptyは収集しません |
| ユーザーコンテンツ | Adaptyは収集しません |
| 閲覧履歴 | Adaptyは収集しません |
| 検索履歴 | Adaptyは収集しません |
| アプリ情報とパフォーマンス | Adaptyは収集しません |
| Webブラウジング | Adaptyは収集しません |
| 連絡先情報 | Adaptyは収集しません |
| 財務情報 | Adaptyはユーザーの購入履歴を収集します |
| 個人情報と識別子 | Adaptyは、ユーザーIDと、氏名・メールアドレス・電話番号などの識別可能な連絡先情報を、Adapty SDKに明示的に渡した場合に収集します。 |
| デバイスおよびその他の識別子 | AdaptyはデバイスIDのデータを収集します。 |
## データの利用と取り扱い \{#data-usage-and-handling\}
### ユーザーID \{#user-ids\}
**1. このデータは収集されますか、共有されますか、それとも両方ですか?**
このデータはAdaptyによって収集されます。Adaptyとサービスプロバイダーとみなされないサードパーティとの連携を使用している場合は、「共有」も開示する必要がある場合があります。
**2. このデータは一時的に処理されますか?**
「いいえ」を選択してください。
**3. このデータの収集はアプリに必須ですか、それともユーザーが選択できますか?**
このデータ収集は必須であり、オフにすることはできません。
**4. このユーザーデータはなぜ収集されますか? / なぜ共有されますか?**
「アプリの機能」と「分析」のチェックボックスを選択してください。
### 財務情報 \{#financial-info\}
Adaptyを使用している場合は、Google Play Consoleのデータタイプセクションで、アプリが「購入履歴」情報を収集することを開示する必要があります。
### デバイスまたはその他のID \{#device-or-other-ids\}
## 次のステップ \{#next-steps\}
データセーフティの選択が完了すると、Googleはアプリのプライバシーセクションのプレビューを表示します。前述のとおり「財務情報」と「デバイスまたはその他のID」を選択した場合、プライバシー情報は次の例のように表示されます。
アプリのレビュー申請の準備ができている場合は、[リリースチェックリスト](release-checklist)ドキュメントを参照し、申請の準備について詳しくご確認ください。
---
# File: google-reduced-service-fee
---
---
title: "Googleの手数料減額プログラム"
description: "Googleの手数料減額プログラムの内容と、収益やAdaptyのアナリティクスへの影響について理解しましょう"
---
:::link
App Storeの対応プログラムについては、[App Store中小企業プログラム](app-store-small-business-program)をご覧ください。
:::
Google Playの[手数料減額プログラム](https://support.google.com/googleplay/android-developer/answer/112622?hl=en)は、年間収益の最初の100万ドルに対する手数料を30%から**15%**に引き下げます。同一カレンダーイヤーの100万ドルを超える収益には、通常の30%の手数料が適用されます。
:::note
2022年1月1日以降、Googleはこのプログラムに関係なく、すべての自動更新サブスクリプションに対して15%の手数料を課しています。手数料減額プログラムは主に、非サブスクリプションのアプリ内課金と有料アプリに恩恵をもたらします。
:::
プログラムのメンバーは、正確な収益計算とインテグレーションイベントの処理を確保するために、**Adaptyの設定を変更する必要があります**。
この記事では以下について説明します:
* [アプリが手数料減額プログラムに登録されている場合のAdaptyの設定方法](#configure-adapty)
* [ストア手数料を削減したい場合のプログラム登録方法](#enroll-in-the-program)
## Adaptyの設定 \{#configure-adapty\}
Adaptyは、[アナリティクス](analytics)と[インテグレーションイベント](analytics-integration)に減額された手数料率を適用できます。これを有効にするには、アプリごとに手数料減額プログラムのステータスを指定してください。
:::warning
**登録したらすぐに**AdaptyでReducedService Feeのステータスを設定してください。設定を後から変更しても、配信済みのWebhookイベントを書き換えることはできません([詳細](#retroactive-setting-changes))。
:::
1. [**App Settings** → **General**](https://app.adapty.io/account)を開きます。
2. **Reduced Service Fee**セクションを見つけます。
3. **Add period**をクリックします。
4. メンバーシップの開始日を選択します。
5. 終了日を選択するか、**At the current moment**チェックマークを有効にして、このステータスを無期限に延長します。[年間収益が100万ドルを超えた場合](#exceeding-the-threshold)、終了日を変更できます。
6. **Apply**をクリックします。
メンバーシップのステータスは、**指定した日付範囲にのみ**適用されます。プログラムはカレンダーイヤーごとにリセットされます。
* **Add period**をクリックして、新しいメンバーシップ期間を追加します。
* このステータスを無期限に延長するには、**At the current moment**チェックマークを有効にします。
設定を確認するには、[Revenueチャート](revenue)を開いて**Proceeds after store commission**を選択します。表示された収益が減額された手数料率を反映しているか確認してください。
## プログラムへの登録 \{#enroll-in-the-program\}
### 資格要件 \{#eligibility-requirements\}
Googleは、| オプション | 説明 | | ------- | ------------------------------------------------------------ | | Opt-out | (デフォルト)Adaptyがユーザーの同意状態を把握していない場合、同意が**与えられた**と見なし、Refund Saverは払い戻し関連データをAppleと**共有します**。 | | Opt-in | Adaptyがユーザーの同意状態を把握していない場合、同意が**与えられていない**と見なし、Refund Saverはデータを**共有しません**。これはAppleが推奨するアプローチです。 | ## SDKでユーザーの同意を更新する \{#update-user-consent-in-the-sdk\} 特定のユーザーが同意を与えたかどうかをAdaptyに伝えるには、`updateCollectingRefundDataConsent`メソッドを使用します。この値はプロファイルごとにサーバーサイドで保持されるため、同意が変更された場合のみ呼び出す必要があります。
:::note サブスクリプションイベントを追跡するには、Adapty の [Webhook](webhook) 連携を利用するか、既存のサービスと直接連携してください。 ::: ## ウェブとモバイル間でサブスクライバーを同期する場合 \{#case-1-sync-subscribers-between-web-and-mobile\} StripeやChargeBeeなどのWeb決済プロバイダーを使用している場合、サブスクリプションユーザーを簡単に同期できます。手順は以下のとおりです: 1.
2. オンボーディングのわかりやすい名前を入力し、**Proceed to build onboarding** をクリックします。
3. オンボーディングビルダーにリダイレクトされます。
デフォルトのデモテンプレートが用意されており、オンボーディングがどのようにデータを収集するか、変数やクイズを使ってどのようにパーソナライズできるかを確認できます。不要な画面は自由に削除し、[独自のオンボーディング体験をデザイン](design-onboarding)してください。
4. 準備ができたら、右上の **Preview** ボタンをクリックします。すべてが期待どおりに動作することを確認するために、実際にオンボーディングフローを最後まで体験してください。
5. 問題がなければ、右上の **Publish** をクリックします。Adapty に戻る前に、公開が完了するまで待ってください。そうしないと、作業内容が失われます。
:::danger
**Publish** をクリックしないと、SDK は作成したオンボーディングを取得できません。
:::
オンボーディングが公開されたら、**Back to Adapty** をクリックします。オンボーディングが作成されました。プレースメントに追加して使い始めることができます。
## ステップ 2. オンボーディング用のプレースメントを作成する \{#step-2-create-a-placement-for-your-onboarding\}
1. メインメニューから **Placements** に移動し、**Onboardings** タブに切り替えます。**Create placement** をクリックします。
2. プレースメントの名前と ID を入力します。次に、**Run onboarding** をクリックし、すべてのユーザーに表示するオンボーディングを選択します。
3. 特定のユーザーグループ向けに別のオンボーディングを用意している場合は、[オーディエンスを追加](audience)して、そのグループに別のオンボーディングを選択してください。
## ステップ 3. オンボーディングをアプリに組み込む \{#step-3-integrate-the-onboarding-into-your-app\}
:::important
オンボーディングは、Adapty SDK v3.8.0 以降(iOS、Android、React Native、Flutter)、v3.14.0 以降(Unity)、または v3.15.0 以降(Kotlin Multiplatform、Capacitor)を使用するアプリで利用できます。
:::
アプリでオンボーディングの表示を開始するには、Adapty SDK を使用して組み込んでください:
- [iOS](ios-onboardings)
- [Android](android-onboardings)
- [React Native](react-native-onboardings)
- [Flutter](flutter-onboardings)
- [Unity](unity-onboardings)
- [Kotlin Multiplatform](kmp-onboardings)
- [Capacitor](capacitor-onboardings)
どのオンボーディングがより効果的かを把握するために、[A/B テスト](ab-tests)を実施することもできます。
---
# File: design-onboarding
---
---
title: "オンボーディングをデザインする"
description: "効果的なオンボーディングを作成しましょう。"
---
ノーコードのモバイルアプリ向けオンボーディングビルダーは、ユーザーに最高のオンボーディング体験を提供するための強力でカスタマイズ性の高いツールです。開発者やデザイナーでなくても、優れた結果を得ることができます。
## オンボーディングの画面 \{#onboarding-screens\}
オンボーディングのフローは、追加してデザインする複数の画面で構成されます。
ユーザーはボタンをタップして画面間を移動します。
:::tip
一部のユーザーに少し異なるフローが必要な場合(たとえば、フィットネスアプリでユーザーの性別に応じて異なる「目標」画像を表示したい場合)、別のオンボーディングを作成する必要はありません。
代わりに、一部の画面をデフォルトで非表示にし、特定の条件のときだけ表示されるよう設定できます。
:::
## オンボーディングの要素 \{#onboarding-elements\}
オンボーディングの要素は、左側に表示順で表示されます。右上の **Add** をクリックして新しい要素を追加します。
追加できる要素のグループは以下のとおりです:
- **Containers**:コンテナを使うと、柔軟なレイアウトを設定できます。たとえば、2カラムのテキストを追加したい場合は、**Columns** を追加してから、左ペインの **Columns** に2つのテキストブロックをドラッグします。カルーセルを追加する場合は、内部の **Media** 要素に画像を追加する必要があります。
- **Typography**:事前にフォーマットされたテキストブロックを追加し、見た目を自由に設定できます。
- **Media & Display**:画像や動画のほか、アプリの価値をアピールしてユーザーの意欲を高めるアニメーションチャートも追加できます。
**対応している動画フォーマット**はMP4とWebMです。**メディアファイルの最大サイズ**は15MBです。
Lottieのような非対応のアニメーション要素を追加したい場合は、動画に変換して(例:[このツール](https://www.lottielab.com/lottie/lottie-to-video)を使用)、動画として埋め込むことができます。
- **Quiz**:テキストや画像の選択肢を使った短いアンケートを作成し、オンボーディング体験をカスタマイズしながらユーザーのことをより深く知ることができます。
- **Inputs**:ユーザーのデータを収集します。
- **Buttons**:ボタンを使うと、画面間の移動、オンボーディングの終了、ペイウォールへの移動をユーザーが行えます。光沢のあるボタンや動くボタンを追加して、ユーザーの注意を引き、インストールを購入につなげることもできます。
- **Loaders**:アニメーションローダーで、処理中もユーザーを飽きさせません。
- **User engagement**:テスティモニアル、ユーザーメールリスト、カウントダウンを追加できます。
:::note
**Media & Display** グループの一部として、提供されているカスタマイズオプションでは不十分な場合にカスタムHTMLコードも追加できます。
ただし、カスタムHTML要素はプリロードもキャッシュもされないため、**Raw HTML** は小さく軽量な要素にのみ使用することを推奨します。
:::
### 要素IDとアクションID \{#element-id-and-action-id\}
ボタンをカスタムアクションに使用したい場合は、**アクションID** を割り当て、ソースコード内で使用します。アクションIDを使うと、同じアクションIDを持つ複数のボタンを同じ方法で処理できます。
特定のフィールドでユーザーの入力を処理したい場合(例:年齢やメールアドレスを保存する)は、**要素ID** を割り当て、ソースコード内で質問と回答を紐付けるために使用します。要素IDはオンボーディング内で1回だけ使用できます。
## カスタマイズオプション \{#customization-options\}
ビルダーでは以下のカスタマイズオプションを利用できます:
- **Styles** タブ:要素の見た目を調整します。
- **Element** タブ:表示/非表示、ボタン押下時のアクションなど、要素の見た目以外の属性を設定します。
- **Screen** タブ:ヘッダーや画面カウンターの表示など、画面全体の設定を行います。
## 画面と要素のコピー \{#copy-screens-and-elements\}
オンボーディングを作成済みで、その一部を再利用したい場合や、少し変更を加えてA/Bテストを行いたい場合は、1つまたは複数の画面を別のオンボーディングにコピーできます。
画面をコピーするには、オンボーディングビルダーを開き、次のいずれかを行います:
- 単一の画面を右クリックして **Copy** を選択する
- 目的の画面を選択して `Ctrl+C`(Windows)または `⌘+C`(Mac)を押す
個々の要素やテキストブロックも、同じオンボーディング内でも別のオンボーディング間でもコピーできます。
## ウェブ to アプリファネルからの画面のコピー \{#copy-screens-from-web-to-app-funnels\}
[FunnelFox](https://funnelfox.com/) で作成したウェブ to アプリファネルを使用していて、ファネルの画面をオンボーディングで使いたい場合は、ファネルビルダーで画面をコピーしてオンボーディングビルダーに貼り付けることで素早く実現できます:
1. FunnelFoxのファネルビルダーで画面を右クリックして **Copy** を選択するか、画面を選択して `Ctrl+C`/`⌘+C` を押します。
2. オンボーディングビルダーを開きます。
3. コピーした画面を挿入したい画面を右クリックして **Paste** を選択するか、その画面を選択して `Ctrl+V`/`⌘+V` を押します。コピーされた画面は選択した画面の下に挿入されます。
---
# File: adapty-paywall-builder
---
---
title: "Adapty Paywall Builder (Legacy)"
description: "ビジュアルなノーコードビルダーでペイウォールとオンボーディングフローを作成します。"
---
:::warning
ペイウォールビルダーは引き続き完全に動作しますが、Adapty は今後このビルダーへの機能追加やアップデートの提供を終了しています。新規プロジェクトには、[Adapty フロービルダー](adapty-flow-builder) の利用をご検討ください。これは、デバイス上でネイティブにレンダリングされる単一画面のペイウォールおよびマルチ画面オンボーディングフロー向けのビジュアルノーコードエディターです。
- **あらゆるフロータイプに対応**: 単一画面のペイウォール、ペイウォールを含むマルチステップのオンボーディング、そしてその中間にあたるあらゆる構成を構築できます。
- **ネイティブレンダリング**: フローは Adapty SDK を通じてレンダリングされ、Web ビューは使用しません。
- **再デプロイ不要で更新可能**: コピー、デザイン、ロジックをいつでも変更でき、アプリのリリースなしにユーザーへ更新が反映されます。
:::
Adapty の**ペイウォールビルダー**は、カスタムペイウォールをデザインするためのビジュアルノーコードツールです。テンプレートから始めてレイアウトをカスタマイズし、カルーセル、カード、プロダクトリスト、フッターなどの要素を追加できます。カスタムフォント、プロダクトタグ、ローカライズにも対応しています。
ペイウォールビルダーを使用するには Adapty SDK v3.0 以降が必要です。ペイウォールを作成したら、[プレースメントに追加](add-audience-paywall-ab-test)してアプリ内で表示しましょう。
- [iOS](ios-quickstart-paywalls)
- [Android](android-quickstart-paywalls)
- [React Native](react-native-quickstart-paywalls)
- [Flutter](flutter-quickstart-paywalls)
- [Unity](unity-quickstart-paywalls)
- [Capacitor](capacitor-quickstart-paywalls)
- [Kotlin Multiplatform](kmp-quickstart-paywalls)
---
# File: flutterflow
---
---
title: "Adapty Plugin for FlutterFlow"
description: "サブスクリプション管理を強化するために FlutterFlow と Adapty を連携する方法を紹介します。"
---
Adapty はモバイルアプリの成長を支援するために設計された多機能プラットフォームです。立ち上げたばかりのアプリでも、すでに数千人のユーザーを抱えているアプリでも、Adapty を使えばアプリ内課金の組み込みにかかる時間を大幅に短縮し、ペイウォール管理でサブスクリプション収益を倍増させることができます。
FlutterFlow 向け Adapty プラグインを使えば、コードを一切書かずに Adapty のすべての機能を活用できます。FlutterFlow でペイウォールページをデザインし、購入機能を有効化した上で、表示するプロダクトをリモートで管理できます。特定のユーザーグループへのターゲティングや A/B テストも利用可能です。アプリをリリースした後は、ダッシュボード上でユーザーの購入に関する詳細な分析データに即座にアクセスできます。
ペイウォールに表示するプロダクトを変更したいときも簡単です! Adapty ダッシュボード内で数クリックするだけで変更が反映され、ユーザーはすぐに新しいプロダクトを確認できます。新バージョンのアプリをリリースする必要はありません!
Adapty が提供するその他の機能:
- **サブスクリプションとアプリ内課金**: Adapty がサーバーサイドのレシート検証を代わりに行い、ウェブを含むすべてのプラットフォーム間でユーザー情報を同期します。
- **ペイウォールの A/B テスト**: 価格、期間、トライアル期間、ビジュアル要素をテストして、サブスクリプションや買い切り購入を最適化します。
- **強力な分析機能**: 詳細な指標にアクセスして、アプリのマネタイズをより深く理解し改善できます。
- **インテグレーション**: Adapty は Amplitude、AppsFlyer、Adjust、Branch、Mixpanel、Facebook Ads、AppMetrica、カスタム Webhook など、サードパーティの分析ツールとシームレスに連携します。
---
# File: ff-getting-started
---
---
title: "はじめに"
description: "Adapty フィーチャーフラグを使って、サブスクリプションフローをパーソナライズしましょう。"
---
Adapty を使うと、モバイルアプリのユーザーの旅のさまざまな時点(オンボーディング、設定画面など)でペイウォールや A/B テストを作成・実行できます。これらの時点を[プレースメント](placements)と呼びます。アプリ内のプレースメントは、複数のペイウォールや [A/B テスト](ab-tests)を同時に管理でき、それぞれ特定のユーザーグループ([オーディエンス](audience)と呼びます)向けに作成されます。さらに、新しいアプリバージョンをリリースせずに、ペイウォールを別のものと入れ替えながら実験することも可能です。モバイルアプリにハードコードするのはプレースメント ID だけです。
Adapty ライブラリは、Adapty ダッシュボードから最新のプロダクトを取得し、ペイウォールを常に最新の状態に保ちます。[プロダクトデータを取得](ff-action-flow)して[ペイウォールに表示](ff-add-variables-to-paywalls)し、[購入を処理](ff-make-purchase)し、[ユーザーのアクセスレベルを確認](ff-check-subscription-status)して有料コンテンツを表示すべきかどうかを判断します。
始めるには、以下の手順に従って FlutterFlow プロジェクトに [Adapty ライブラリを追加](ff-getting-started#add-the-adapty-library-as-a-dependency)し、[初期化](ff-getting-started#initiate-adapty-plugin)してください。
:::warning
始める前に、以下の制限事項を確認してください:
- FlutterFlow 用 Adapty ライブラリは Web アプリをサポートしていません。Web アプリへのコンパイルは避けてください。
- FlutterFlow 用 Adapty ライブラリは、Adapty のペイウォールビルダーで作成されたペイウォールをサポートしていません。Adapty で購入を有効にする前に、FlutterFlow で独自のペイウォールをデザインする必要があります。
:::
## Adapty ライブラリを依存関係として追加する \{#add-the-adapty-library-as-a-dependency\}
1. [FlutterFlow ダッシュボード](https://app.flutterflow.io/dashboard)でプロジェクトを開き、左メニューから **Settings and Integrations** をクリックします。左側の **Project setup** セクションで **Project dependencies** を選択します。
2. **FlutterFlow Libraries** セクションで **Add Library** をクリックし、`adapty-xtuel0` と入力します。**Add** をクリックします。
3. 次に、SDK キーをライブラリに関連付けます。ライブラリの横にある **View details** をクリックします。
4. Adapty ダッシュボードの [**App Settings** -> **General** タブ](https://app.adapty.io/settings/general)から **Public SDK key** をコピーします。
5. FlutterFlow の **AdaptyApiKey** にキーを貼り付けます。
Adapty FF ライブラリがプロジェクトの依存関係として追加されます。**Adapty** FF ライブラリウィンドウには、プロジェクトにインポートされたすべての Adapty リソースが表示されます。
## アプリ起動時に新しいアクティベーションアクションを呼び出す \{#call-the-new-activation-action-at-application-launch\}
1. 左メニューから **Custom Code** セクションに移動し、`main.dart` を開きます。
2. **+** をクリックして `activate (Adapty)` を選択します。
3. **Save** をクリックします。
## Adapty プラグインを初期化する \{#initiate-adapty-plugin\}
Adapty ダッシュボードにアプリを認識させるには、FlutterFlow で特別なキーを設定する必要があります。
1. FlutterFlow プロジェクトで、左メニューから **Settings and Integrations > Permissions** に移動します。
2. 開いた **Permissions** ウィンドウで、**Add Permission** ボタンをクリックします。
3. **iOS Permission Key** と **Android Permission Key** の両方のフィールドに `AdaptyPublicSdkKey` を貼り付けます。
4. **Permission Message** には、Adapty ダッシュボードの [**App Settings** -> **General** タブ](https://app.adapty.io/settings/general)から **Public SDK key** をコピーして貼り付けます。各アプリには固有の SDK キーがあるため、複数のアプリがある場合は正しいキーを使用してください。
これらの手順が完了すると、FlutterFlow アプリでペイウォールを呼び出し、そこから購入を有効にできるようになります。
## 次のステップ \{#whats-next\}
1. FlutterFlow で Adapty ペイウォールのプロダクトとそのデータを処理するための[アクションフローを作成](ff-action-flow)します。
2. 受け取ったデータを FlutterFlow でデザインした[ペイウォールにマッピング](ff-add-variables-to-paywalls)します。
3. ペイウォールの[購入ボタンを設定](ff-make-purchase)して、クリック時に Adapty 経由でトランザクションを処理できるようにします。
4. 最後に、[サブスクリプションステータスの確認を追加](ff-check-subscription-status)して、ユーザーに有料コンテンツを表示するかどうかを判断します。
---
# File: ff-action-flow
---
---
title: "ステップ1. ペイウォールデータを表示するフローを作成する"
description: "Adaptyでフィーチャーフラグのアクションフローを設定し、ユーザーのサブスクリプション体験をパーソナライズする方法を解説します。"
---
:::important
FlutterFlowプラグインを使用する場合、Adaptyのペイウォールビルダーで作成したペイウォールは使用できません。FlutterFlowで独自のペイウォールページを実装し、Adaptyと連携させる必要があります。
:::
AdaptyライブラリをFlutterFlowプロジェクトの依存関係として追加したら、次は**AdaptyのペイウォールとプロダクトデータをFlutterFlowで設計したペイウォールに取得して表示する**フローを構築します。
まずAdaptyからペイウォールデータを受け取る必要があります。最初にAdaptyのペイウォールをリクエストし、次にそれに関連するプロダクトをリクエストし、最後にデータが正常に受信されたかどうかを確認します。成功した場合はペイウォールページにプロダクトのタイトルと価格を表示し、失敗した場合はエラーメッセージを表示します。
先に進む前に、以下の作業が完了していることを確認してください。
1. Adapty ダッシュボードで[ペイウォールを少なくとも1つ作成し、プロダクトを少なくとも1つ追加している](create-paywall)こと。
2. Adapty ダッシュボードで[プレースメントを少なくとも1つ作成](create-placement)し、[そのペイウォールを追加している](add-audience-paywall-ab-test)こと。
それでは始めましょう!
## ステップ1.1. Adaptyペイウォールをリクエストする \{#step-11-request-adapty-paywall\}
前述の通り、FlutterFlowのペイウォールにデータを表示するには、まずAdaptyからデータを取得する必要があります。最初のステップはAdaptyのペイウォール自体を取得することです。手順は以下の通りです。
1. ペイウォール画面を開き、右ペインの **Actions** セクションに切り替えます。そこから **Action Flow Editor** を開きます。
2. **Select Action Trigger** ウィンドウで **On Page Load** を選択します。
3. **Add Action** をクリックします。次に、`getPaywall` カスタムアクションを検索して選択します。
4. **Set Actions Arguments** セクションで、ペイウォールを含むAdapity ダッシュボードで[作成したプレースメント](create-placement)の実際のIDを入力します。この例では `monthly` です。必ず実際のプレースメントIDを使用してください!
5. Adapty ダッシュボードでペイウォールを[ローカライズ](localizations-and-locale-codes)している場合は、**locale** 引数も設定できます。
6. **Action Output Variable Name** で新しい変数を作成し、`getPaywallResult` という名前を付けます。次のステップでAdaptyのペイウォールを参照してプロダクトをリクエストする際に使用します。
## ステップ1.2. Adaptyペイウォールプロダクトをリクエストする \{#step-12-request-adapty-paywall-products\}
Adaptyのペイウォールを取得しました。次は、このペイウォールに関連するプロダクトを取得しましょう。
1. 作成したアクションの下にある **+** をクリックし、**Add Action** を選択します。このアクションでAdaptyペイウォールのプロダクトを受け取ります。`getPaywallProducts` を検索して選択します。
2. **Set Actions Arguments** セクションで、先ほど作成した `getPaywallResult` 変数を選択します。
3. 残りのフィールドを以下のように入力します。
- **Available Options**: Data Structured Field
- **Select Field**: value
- **Available Options**: No further changes
4. **Confirm** をクリックします。
5. **Action Output Variable Name** で新しい変数を作成し、`getPaywallProductsResult` という名前を付けます。FlutterFlowで設計したペイウォールとAdaptyのペイウォールデータをマッピングする際に使用します。
## ステップ1.3. ペイウォールが正常にアップロードされたか確認する \{#step-13-add-check-if-the-paywall-uploaded-successfully\}
次に進む前に、Adaptyのペイウォールが正常に受信されたかどうかを確認しましょう。成功した場合はプロダクトデータでペイウォールを更新し、失敗した場合はエラーを処理します。確認を追加する手順は以下の通りです。
1. **+** をクリックし、**Add Conditional** をクリックします。
2. **Action Output** セクションで、先ほど作成したアクション出力変数(この例では `getPaywallResult`)を選択します。
3. Adaptyのペイウォールが受信されたことを確認するため、値を持つフィールドの存在を確認します。フィールドを以下のように入力します。
- **Available Options**: Has Field
- **Field (AdaptyGetPaywallResult)**: value
4. **Confirm** をクリックして条件を確定します。
## ステップ1.4. ペイウォールの表示をログに記録する \{#step-14-log-the-paywall-review\}
Adaptyのアナリティクスがペイウォールの表示を追跡できるよう、このイベントをログに記録する必要があります。この手順を省略すると、表示がアナリティクスでカウントされません。手順は以下の通りです。
1. **TRUE** ラベルの下にある **+** をクリックし、**Add Action** をクリックします。
2. **Select Action** フィールドで **logShowPaywall** を検索して選択します。
3. **Set Action Arguments** エリアで **Value** をクリックし、作成した `getPaywallResult` 変数を選択します。この変数にはペイウォールデータが含まれています。
4. フィールドを以下のように入力します。
- **Available Options**: Data Structured Field
- **Select Field**: value
5. **Confirm** をクリックします。
## ステップ1.5. ペイウォールが受信されなかった場合にエラーを表示する \{#step-15-show-error-if-paywall-not-received\}
Adaptyのペイウォールが受信されなかった場合は、[エラーを処理する](error-handling-on-flutter-react-native-unity#system-storekit-codes)必要があります。この例では、アラートメッセージを表示するだけにします。
1. **FALSE** ラベルに **Informational Dialog** アクションを追加します。
2. **Title** フィールドに、ダイアログのタイトルとして表示したいテキストを入力します。この例では **Error** です。
3. **Message** ボックスで **Value** をクリックします。
4. フィールドを以下のように入力します。
- **Set Variable**: 作成した `getPaywallProductResult` 変数
- **Available Options**: Data Structure Field
- **Select Field**: error
- **Available Options**: Data Structure Field
- **Select Field**: errorMessage
5. **Confirm** をクリックします。
6. **FALSE** フローに **Terminate action** を追加します。
7. 右上隅の **Close** をクリックします。
おめでとうございます!プロダクトデータの取得に成功しました。次は[FlutterFlowで設計したペイウォールにデータをマッピング](ff-add-variables-to-paywalls)しましょう。
---
# File: ff-add-variables-to-paywalls
---
---
title: "ステップ 2. ペイウォールページにデータを追加する"
description: "Adapty のペイウォールに Feature Flag 変数を追加する。"
---
[必要なプロダクトデータをすべて取得](ff-action-flow)したら、FlutterFlow でデザインした美しいペイウォールにそのデータをマッピングしましょう。この例では、プロダクトのタイトルと価格をマッピングします。
## ステップ 2.1. ペイウォールページにプロダクトタイトルを追加する \{#step-21-add-product-title-to-paywall-page\}
1. ペイウォールページのプロダクトテキストをダブルクリックします。**Set from Variable** ウィンドウで `getPaywallProductResult` 変数を検索して選択します。
2. 各フィールドを以下のように入力します:
- **Available Options**: Data Structured Field
- **Select Field**: value
- **Available Options**: Item at Index
- **List Index Options**: First
- **Available Options**: Data Structured Field
- **Select Field**: localizedTitle
- **Default Variable Value**: null
- **UI Builder Display Value**: 任意の値。この例では `product.title`
3. **Confirm** をクリックして変更を保存します。
## ステップ 2.2. ペイウォールページに価格テキストを追加する \{#step-22-add-price-text-to-paywall-page\}
ステップ 2.1 と同じ手順を、以下のように価格テキストに対しても繰り返します:
1. ペイウォールページの価格テキストをダブルクリックします。**Set from Variable** ウィンドウで `getPaywallProductResult` 変数を検索して選択します。
2. 各フィールドを以下のように入力します:
- **Available Options**: Data Structured Field
- **Select Field**: value
- **Available Options**: Item at Index
- **List Index Options**: First
- **Available Options**: Data Structured Field
- **Select Field**: price
- **Default Variable Value**: null
- **UI Builder Display Value**: 任意の値。この例では `product.price`
3. **Confirm** ボタンをクリックして変更を保存します。
### ペイウォールページに現地通貨の価格を追加する \{#add-price-in-local-currency-to-paywall-page\}
1. ペイウォールページの価格をダブルクリックします。**Set from Variable** ウィンドウで `getPaywallProductResult` 変数を検索して選択します。
2. 各フィールドを以下のように入力します:
- **Available Options**: Data Structured Field
- **Select Field**: value
- **Available Options**: Item at Index
- **List Index Options**: First
- **Available Options**: Data Structured Field
- **Select Field**: price
- **Available Options**: Data Structured Field
- **Select Field**: amount
- **Available Options**: Decimal
- **Decimal Type**: Automatic
- **Default Variable Value**: null
- **UI Builder Display Value**: 任意の値。この例では `price.amount`
3. **Confirm** をクリックして変更を保存します。
これで完了です!アプリを起動すると、Adapty ペイウォールのプロダクトデータがペイウォールページに表示されるようになります!
次は[ユーザーがプロダクトを購入できるようにする](ff-make-purchase)ステップに進みましょう。
---
# File: ff-make-purchase
---
---
title: "ステップ 3. 購入を有効にする"
description: "AdaptyのFeature Flagsシステムを使って購入を行う方法を学びましょう。"
---
おめでとうございます(プロダクト名や価格を含む)が完了しました。
次は最終ステップとして、ユーザーがペイウォールを通じて購入できるようにしましょう。
## ステップ 3.1. ユーザーが購入できるようにする \{#step-31-enable-users-to-make-purchases\}
1. ペイウォールページの購入ボタンをダブルクリックします。右パネルで **Actions** セクションがまだ開いていなければ開きます。
2. **Action Flow Editor** を開きます。
3. **Select Action Trigger** ウィンドウで **On Tap** を選択します。
4. **No Actions Created** ウィンドウで **Add Action** をクリックします。`makePurchase` アクションを検索して選択します。
5. **Set Actions Arguments** セクションで、以前作成した `getPaywallProductsResult` 変数を選択します。
6. 各フィールドを次のように入力します:
- **Available Options**: Data Structure Field
- **Select Field**: value
- **Available Options**: Item at Index
- **List Index Options**: First
7. `subscriptionUpdateParameters` をクリックし、`AdaptySubscriptionUpdateParameters` を検索して選択します。**Confirm** をクリックします。
:::info
デフォルトでは、オブジェクトのフィールドはすべて空のままにしておけます。Android アプリで一つのサブスクリプションを別のものに置き換える場合にのみ入力が必要です。詳細は[こちら](https://android.adapty.io/adapty/com.adapty.models/-adapty-subscription-update-parameters/)をご覧ください。
:::
8. **Confirm** をクリックします。
9. **Action Output Variable Name** で新しい変数を作成し、`makePurchaseResult` という名前を付けます。これは後で購入が成功したことを確認するために使用します。
## ステップ 3.2. 購入が成功したか確認する \{#step-32-check-if-the-purchase-was-successful\}
購入が正常に完了したか確認する処理を設定しましょう。
1. **+** をクリックして **Add Conditional** をクリックします。
2. **Set Condition for Action** で `makePurchaseResult` 変数を選択します。
3. **Set Variable** ウィンドウで各フィールドを次のように入力します:
- **Available Options**: Has Field
- **Select Field**: profile
4. **Confirm** をクリックします。
## ステップ 3.3. 有料コンテンツを開く \{#step-33-open-paid-content\}
購入が成功したら、有料コンテンツのロックを解除できます。設定方法は次のとおりです:
1. **TRUE** ラベルの下の **+** をクリックして **Add Action** をクリックします。
2. **Define Action** フィールドで、**Navigate To** リストから開きたいページを検索して選択します。この例では **Questions** ページです。
## ステップ 3.4. 購入失敗時にエラーメッセージを表示する \{#step-34-show-error-message-if-purchase-failed\}
購入が失敗した場合は、ユーザーにアラートを表示しましょう。
1. **FALSE** ラベルに **Informational Dialog** アクションを追加します。
2. **Title** フィールドに、ダイアログのタイトルとして表示するテキストを入力します(例:**Purchase Failed**)。
3. **Message** ボックスの **Value** をクリックします。**Set from Variable** ウィンドウで `makePurchaseResult` を検索して選択します。各フィールドを次のように入力します:
- **Available Options**: Data Structure Field
- **Select Field**: error
- **Available Options**: Data Structure Field
- **Select Field**: errorMessage
4. **Confirm** をクリックします。
5. **FALSE** フローに **Terminate** アクションを追加します。
6. 最後に、右上隅の **Close** をクリックします。
おめでとうございます!これでユーザーがプロダクトを購入できるようになりました。追加のステップとして、[有料コンテンツへのユーザーアクセスを確認する設定](ff-check-subscription-status)を行い、有料コンテンツまたはペイウォールのどちらを表示するかを判断できるようにしましょう。
---
# File: ff-check-subscription-status
---
---
title: "ステップ 4. 有料コンテンツへのアクセスを確認する"
description: "Adaptyのフィーチャーフラグを使用してサブスクリプションステータスを確認し、ユーザーセグメンテーションを改善する方法を学びましょう。"
---
ユーザーが特定の有料コンテンツにアクセスできるかどうかを確認するには、そのユーザーのアクセスレベルを検証する必要があります。具体的には、ユーザーが少なくとも1つのアクセスレベルを持っているか、またそのレベルが必要なものであるかをチェックします。
これは、利用可能なすべてのアクセスレベルを含むユーザーのプロファイルを確認することで行えます。
それでは、ユーザーがプロダクトを購入できるようにしましょう:
1. 有料コンテンツを表示するボタンをダブルクリックし、右ペインの **Actions** セクションがまだ開いていない場合は開きます。
2. **Action Flow Editor** を開きます。
3. **Select Action Trigger** ウィンドウで、**On Tap** を選択します。
4. **No Actions Created** ウィンドウで、**Add Conditional Action** ボタンをクリックします。
5. **UNSET** をクリックしてアクション引数を設定し、`currentProfile` 変数を選択します。これは現在のユーザーのプロファイルに関するデータを保持するAdaptyの変数です。
6. 以下のようにフィールドを入力します:
- **Available Options**: Data Structure Field
- **Select Field**: accessLevels
- **Available Options**: Filter List Items
- **Filter Conditions**:
1. **Conditions -> Single Condition** を選択し、**UNSET** をクリックします。
2. **First value** フィールドで、**Source** として **Item in list** を選択し、以下のようにフィールドを入力します:
- **Available Options**: Data Structure Field
- **Select Field**: accessLevelIdentifier
3. フィルター演算子を **Equal to** に設定します。
4. **Second value** の隣にある **UNSET** をクリックし、**Value** フィールドにアクセスレベルのIDを入力します。この例では `premium` を使用します。
5. **Confirm** をクリックし、以下の他のフィールドへの入力を続けます。
- **Available Options**: Item at Index
- **List Index Options**: First
- **Available Options**: Data Structure Field
- **Select Field**: accessLevel
- **Available Options**: Data Structure Field
- **Select Field**: isActive
7. **Confirm** をクリックします。
次に、ユーザーが適切なサブスクリプションを持っているかどうかに応じて、次に何が起こるかのアクションを追加します。プレミアムサブスクライバーが利用できるページに移動させるか、アクセスを購入できるようにペイウォールページを開きます。
---
# File: ff-resources
---
---
title: "Adapty FlutterFlow プラグインのアクションとデータ型"
description: "Adaptyの機能フラグリソースにアクセスして、サブスクリプションベースの機能を効率化しましょう。"
---
## カスタムアクション \{#custom-actions\}
以下は、Adapty プラグインを通じて FlutterFlow に提供される Adapty メソッドです。FlutterFlow のカスタムアクションとして使用できます。
| カスタムアクション | 説明 | アクション引数 | Adapty データ型 - アクション出力変数 |
|---|----|--------|----|
| activate | Adapty SDK を初期化します | なし ||
| getPaywall
| ペイウォールを取得します。ペイウォールのプロダクトは返しません。実際のプロダクトを取得するには `getPaywallProducts` アクションを使用してください |getPaywallProducts
| 実際のペイウォールプロダクトのリストを返します | [AdaptyPaywall](ff-resources#adaptypaywall) | [AdaptyGetProductsResult](ff-resources#adaptygetproductsresult) | |getProductsIntroductoryOfferEligibility
| ユーザーが iOS サブスクリプションの初回オファーを利用できるか確認します | [AdaptyPaywallProduct](product) | [AdaptyGetIntroEligibilitiesResult](ff-resources#adaptygetintroeligibilitiesresult) | |makePurchase
| 購入を完了してコンテンツを解放します。ペイウォールにプロモーションオファーがある場合、Adapty は自動的にチェックアウト時に適用します |getProfile
|現在のアプリユーザーのプロファイルを取得します。これによりアクセスレベルやその他のパラメーターを設定できます。
失敗した場合(例: インターネット接続なし)、キャッシュされたデータが返されます。Adapty はプロファイルのキャッシュを定期的に更新し、情報をできる限り最新の状態に保ちます。
| なし | [AdaptyGetProfileResult](ff-resources#adaptygetprofileresult) | | updateProfile | メールアドレスや電話番号などの現在のユーザープロファイルのオプション属性を変更します。属性を使ってユーザーの[セグメント](segments)を作成したり、CRM で閲覧したりすることができます | [AdaptyProfile](ff-resources#adaptyprofile) の ID および更新が必要なパラメーター | [AdaptyError](ff-resources#adaptyerror)(オプション) | | restorePurchases | ユーザーが行った購入を復元します | なし | [AdaptyGetProfileResult](ff-resources#adaptygetprofileresult) | | logShowPaywall | 特定のペイウォールがユーザーに表示されたときにログを記録します | [AdaptyPaywall](ff-resources#adaptypaywall) | [AdaptyError](ff-resources#adaptyerror)(オプション) | | identify | システムの `customerUserId` を使用してユーザーを識別します | customerUserId | [AdaptyError](ff-resources#adaptyerror)(オプション) | | logout | 現在のユーザーをアプリからログアウトします | なし | [AdaptyError](ff-resources#adaptyerror)(オプション)| | presentCodeRedemptionSheet | ユーザーがコードを引き換えるためのシートを表示します(iOS のみ) | なし | なし | ## データ型 \{#data-types\} Adapty プラグインを通じて FlutterFlow に届く Adapty のデータ型(データ値のコレクション)です。 ### AdaptyAccessLevel ユーザーの[アクセスレベル](access-level)に関する情報。 | フィールド名 | 型 | 説明 | |--------------------------|----------|-------------| | activatedAt | DateTime | このアクセスレベルが有効化された日時 | | activeIntroductoryOfferType | String | 有効な初回オファーのタイプ。設定されている場合、このサブスクリプション期間中にオファーが適用されたことを意味します | | activePromotionalOfferId | String | 有効なプロモーションオファーのID(iOSから購入) | | activePromotionalOfferType | String | 有効なプロモーションオファーのタイプ(iOSから購入)。設定されている場合、このサブスクリプション期間中にオファーが適用されたことを意味します | | billingIssueDetectedAt | DateTime | 請求の問題が検出された日時。サブスクリプションは引き続き有効な場合があります。支払いが正常に処理された場合はnullに設定されます | | cancellationReason | String | サブスクリプションがキャンセルされた理由 | | expiresAt | DateTime | アクセスレベルの有効期限(過去の日時になる場合や、永続アクセスの場合は未設定になる場合があります) | | id | String | アクセスレベルの識別子 | | isActive | Boolean | このアクセスレベルが有効な場合はtrue。一般的に、ユーザーがプレミアム機能にアクセスできるかどうかの判定にこのプロパティを使用できます | | isInGracePeriod | Boolean | この自動更新サブスクリプションが[グレース期間](https://developer.apple.com/help/app-store-connect/manage-subscriptions/enable-billing-grace-period-for-auto-renewable-subscriptions)中の場合はtrue | | isLifetime | Boolean | このアクセスレベルが永続的に有効(有効期限なし)な場合はtrue | | isRefund | Boolean | この購入が返金された場合はtrue | | offerId | String | 有効なプロモーションオファーのID(Androidから購入) | | renewedAt | DateTime | アクセスレベルが最後に更新された日時 | | startsAt | DateTime | このアクセスレベルの開始日時(将来の日時になる場合があります) | | store | String | 購入が行われたストア | | unsubscribedAt | DateTime | サブスクリプションの自動更新がオフになった日時。サブスクリプションは引き続き有効な場合があります。未設定の場合、ユーザーはサブスクリプションを再有効化しています | | vendorProductId | String | このアクセスレベルを解放したストアのプロダクトID | | willRenew | Boolean | この自動更新サブスクリプションが更新設定になっている場合はtrue | ### AdaptyAccessLevelIdentifiers この構造体は、`Map
Adapty は `AdaptySDK` 名前空間を使用します。Adapty SDK を使用するスクリプトファイルの先頭に以下を追加できます:
```csharp showLineNumbers title="C#"
using AdaptySDK;
```
Adapty のイベントを購読します:
```csharp showLineNumbers title="C#"
using UnityEngine;
using AdaptySDK;
public class AdaptyListener : MonoBehaviour, AdaptyEventListener {
public void OnLoadLatestProfile(AdaptyProfile profile) {
// handle updated profile data
}
public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { }
public void OnInstallationDetailsFail(AdaptyError error) { }
}
```
AdaptyListenerをDefault Timeより前に配置するよう、Script Execution Orderを調整することをおすすめします。これにより、Adaptyをできるだけ早く初期化できます。
次に、アプリにペイウォールを設定します:
- [Adapty ペイウォールビルダー](adapty-paywall-builder)を使用する場合は、まず以下の[AdaptyUI モジュールを有効化](#activate-adaptyui-module-of-adapty-sdk)してから、[ペイウォールビルダーのクイックスタート](unity-quickstart-paywalls)をご覧ください。
- 独自のペイウォール UI を作成する場合は、[カスタムペイウォールのクイックスタート](unity-quickstart-manual)をご覧ください。
## Adapty SDKのAdaptyUIモジュールを有効化する \{#activate-adaptyui-module-of-adapty-sdk\}
[ペイウォールビルダー](adapty-paywall-builder)を使用する予定があり、AdaptyUIモジュールをインストール済みの場合は、AdaptyUIを有効化する必要があります。設定時に有効化できます:
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetActivateUI(true);
```
## オプション設定 \{#optional-setup\}
### ログ設定 \{#logging\}
#### ログシステムの設定 \{#set-up-the-logging-system\}
Adapty はエラーやその他の重要な情報をログに記録し、状況を把握しやすくします。以下のログレベルが利用できます。
| レベル | 説明 |
| ---------- | ------------------------------------------------------------ |
| `error` | エラーのみがログに記録されます |
| `warn` | エラーと、致命的なエラーではないものの注意が必要なSDKからのメッセージがログに記録されます |
| `info` | エラー、警告、および各種情報メッセージがログに記録されます |
| `verbose` | 関数呼び出しやAPIクエリなど、デバッグ時に役立つ追加情報がすべてログに記録されます |
Adapty の設定時にログレベルを指定できます:
```csharp showLineNumbers title="C#"
// 'verbose' is recommended for development and the first production release
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY");
builder.LogLevel = AdaptyLogLevel.Verbose;
```
実行時にログレベルを変更することも可能です:
```csharp showLineNumbers title="C#"
Adapty.SetLogLevel(AdaptyLogLevel.Verbose, (error) => {
// handle result
});
```
### データポリシー \{#data-policies\}
Adapty はユーザーの個人データを保存しませんが(明示的に送信した場合を除く)、ストアや国のガイドラインに準拠するために追加のデータセキュリティポリシーを設定できます。
#### IPアドレスの収集と共有を無効化する \{#disable-ip-address-collection-and-sharing\}
Adapty モジュールを有効化する際に、`SetIPAddressCollectionDisabled` を `true` に設定すると、ユーザーの IP アドレスの収集と共有を無効化できます。デフォルト値は `false` です。
このパラメータを使用して、ユーザープライバシーを強化し、地域のデータ保護規制(GDPRやCCPAなど)に準拠し、IPベースの機能がアプリに不要な場合の不必要なデータ収集を削減できます。
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetIPAddressCollectionDisabled(true);
```
#### 広告IDの収集と共有を無効にする \{#disable-advertising-id-collection-and-sharing\}
Adapty モジュールを有効化する際に、広告識別子の収集を無効にするには `SetAppleIDFACollectionDisabled` および/または `SetGoogleAdvertisingIdCollectionDisabled` を `true` に設定します。デフォルト値は `false` です。
App Store / Google Play のポリシーへの準拠、App Tracking Transparency プロンプトの表示回避、または広告 ID に基づくアトリビューションや分析が不要な場合に、このパラメーターを使用してください。
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAppleIDFACollectionDisabled(true)
.SetGoogleAdvertisingIdCollectionDisabled(true);
```
#### AdaptyUI のメディアキャッシュ設定 \{#set-up-media-cache-configuration-for-adaptyui\}
デフォルトでは、AdaptyUI はパフォーマンス向上とネットワーク使用量の削減のために、画像や動画などのメディアをキャッシュします。カスタム設定を指定することで、キャッシュの設定を変更できます。
デフォルトのキャッシュ設定を上書きするには、`SetAdaptyUIMediaCache` を使用します:
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAdaptyUIMediaCache(
100 * 1024 * 1024, // MemoryStorageTotalCostLimit 100MB
null, // MemoryStorageCountLimit
100 * 1024 * 1024 // DiskStorageSizeLimit 100MB
);
```
パラメーター:
| Parameter | Required | Description |
|-----------------------------|----------|----------------------------------------------------------------------------------|
| memoryStorageTotalCostLimit | optional | メモリ内のキャッシュ合計サイズ(バイト単位)。デフォルト値はプラットフォームによって異なります。 |
| memoryStorageCountLimit | optional | メモリストレージのアイテム数の上限。デフォルト値はプラットフォームによって異なります。 |
| diskStorageSizeLimit | optional | ディスク上のファイルサイズの上限(バイト単位)。デフォルト値はプラットフォームによって異なります。 |
### Android でローカルアクセスレベルを有効にする \{#enable-local-access-levels-android\}
デフォルトでは、[ローカルアクセスレベル](local-access-levels)は iOS で有効、Android で無効になっています。Android でも有効にするには、`SetGoogleLocalAccessLevelAllowed` を `true` に設定してください。
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetGoogleLocalAccessLevelAllowed(true);
```
### バックアップリストア時のデータクリア \{#clear-data-on-backup-restore\}
`SetAppleClearDataOnBackup` を `true` に設定すると、SDKはアプリがiCloudバックアップから復元されたことを検出し、キャッシュされたプロファイル情報、プロダクト詳細、ペイウォールなど、ローカルに保存されているすべてのSDKデータを削除します。その後、SDKはクリーンな状態で初期化されます。デフォルト値は `false` です。
:::note
削除されるのはローカルのSDKキャッシュのみです。Appleとのトランザクション履歴およびAdaptyサーバー上のユーザーデータは変更されません。
:::
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAppleClearDataOnBackup(true);
```
## トラブルシューティング \{#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` ファイルのルートの `
2. `/Assets/Plugins/Android/launcherTemplate.gradle` に以下の行を追加します。
```groovy showLineNumbers
apply plugin: 'com.android.application'
// highlight-next-line
apply plugin: 'kotlin-android'
apply from: 'setupSymbols.gradle'
apply from: '../shared/keepUnitySymbols.gradle'
```
3. `/Assets/Plugins/Android/baseProjectTemplate.gradle` に以下の行を追加します:
```groovy showLineNumbers
plugins {
// If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
// See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
// See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
// To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
id 'com.android.application' version '8.3.0' apply false
id 'com.android.library' version '8.3.0' apply false
// highlight-next-line
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
**BUILD_SCRIPT_DEPS**
}
```
---
# File: unity-quickstart-paywalls
---
---
title: "Unity SDK のペイウォールを使って購入を有効にする"
description: "Adapty SDK を使って Unity アプリでペイウォールを表示する方法を学ぶ"
---
アプリ内課金を有効にするには、3 つの重要な概念を理解する必要があります。
- [**プロダクト**](product) – ユーザーが購入できるもの(サブスクリプション、消耗型アイテム、永続アクセスなど)
- [**ペイウォール**](paywalls) – どのプロダクトを提供するかを定義する設定です。Adapty では、プロダクトの取得はペイウォールを通じてのみ行えます。この設計により、アプリのコードを変更せずにオファー内容、価格、プロダクトの組み合わせを変更できます。
- [**プレースメント**](placements) – アプリ内でペイウォールを表示する場所とタイミング(`main`、`onboarding`、`settings` など)。ダッシュボードでプレースメントに対してペイウォールを設定し、コード内でプレースメント ID を使ってリクエストします。これにより、A/B テストの実施や、ユーザーごとに異なるペイウォールの表示が容易になります。
Adapty では、アプリ内で購入を有効にする 3 つの方法を提供しています。アプリの要件に応じて選択してください。
| 実装方法 | 複雑さ | 使用場面 |
|---------------------------|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Adapty ペイウォールビルダー | ✅ 簡単 | [ノーコードビルダーで完全な購入対応ペイウォールを作成します](quickstart-paywalls)。Adapty が自動的にレンダリングし、複雑な購入フロー、レシート検証、サブスクリプション管理をすべて裏側で処理します。 |
| 手動作成のペイウォール | 🟡 中程度 | ペイウォールの UI をアプリのコードで実装しますが、プロダクトオファーの柔軟性を保つため、Adapty からペイウォールオブジェクトを取得します。[ガイド](unity-quickstart-manual)を参照してください。 |
| オブザーバーモード | 🔴 難しい | 独自の購入処理インフラを既に持っており、それを引き続き使用したい場合に選びます。オブザーバーモードには Adapty における制限があることに注意してください。[記事](observer-vs-full-mode)を参照してください。 |
:::important
**以下の手順は、Adapty ペイウォールビルダーで作成したペイウォールの実装方法を示しています。**
ペイウォールビルダーを使用しない場合は、[手動作成ペイウォールでの購入処理ガイド](unity-making-purchases)を参照してください。
:::
Adapty ペイウォールビルダーで作成したペイウォールを表示するには、アプリのコードで以下の手順を実行するだけです。
1. **ペイウォールを取得する**: Adapty からペイウォールを取得します。
2. **ペイウォールを表示する(購入処理は Adapty が行います)**: 取得したペイウォールコンテナをアプリに表示します。
3. **ボタンアクションを処理する**: ペイウォール上のユーザー操作とアプリのレスポンスを紐付けます。たとえば、ユーザーがボタンをクリックしたときにリンクを開いたり、ペイウォールを閉じたりします。
## 始める前に \{#before-you-start\}
始める前に、以下の手順を完了してください。
1. Adapty ダッシュボードでアプリを [App Store](initial_ios) および/または [Google Play](initial-android) に接続します。
2. Adapty で[プロダクトを作成します](create-product)。
3. [ペイウォールを作成してプロダクトを追加します](create-paywall)。
4. [プレースメントを作成してペイウォールを追加します](create-placement)。
5. アプリのコードに [Adapty SDK をインストールして有効化します](sdk-installation-unity)。
:::tip
これらの手順を最短で完了するには、[クイックスタートガイド](quickstart)に従うか、[Developer CLI](developer-cli-quickstart) を使ってペイウォールとプレースメントを作成してください。
:::
## 1. ペイウォールを取得する \{#1-get-the-paywall\}
ペイウォールはダッシュボードで設定したプレースメントに紐付けられています。プレースメントを使うと、異なるオーディエンスに対して別々のペイウォールを表示したり、[A/B テスト](ab-tests)を実施したりできます。
Adapty ペイウォールビルダーで作成したペイウォールを取得するには、以下の手順を実行します。
1. `GetPaywall` メソッドを使って[プレースメント](placements) ID から `paywall` オブジェクトを取得し、`HasViewConfiguration` プロパティでビルダーで作成されたペイウォールかどうかを確認します。
2. `CreatePaywallView` メソッドを使ってペイウォールビューを作成します。このビューには、ペイウォールを表示するために必要な UI 要素とスタイルが含まれています。
:::important
ビュー設定を取得するには、ペイウォールビルダーで **Show on device** トグルをオンにする必要があります。オフのままにすると、空のビュー設定が返され、ペイウォールが表示されません。
:::
```csharp showLineNumbers
Adapty.GetPaywall("YOUR_PLACEMENT_ID", (paywall, error) => {
if(error != null) {
// handle the error
return;
}
// Create paywall view parameters
var parameters = new AdaptyUICreatePaywallViewParameters();
// Create the paywall view
AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
if(error != null) {
// handle the error
return;
}
// view - the paywall view ready to be presented
});
});
```
:::info
このクイックスタートはペイウォールを表示するための最小限の設定を提供しています。高度な設定の詳細については、[ペイウォールの取得に関するガイド](unity-get-pb-paywalls)を参照してください。
:::
## 2. ペイウォールを表示する \{#2-display-the-paywall\}
ペイウォール設定を取得したら、数行追加するだけでペイウォールを表示できます。
ペイウォールを表示するには、`CreatePaywallView` メソッドで作成した `view` に対して `view.Present()` メソッドを呼び出します。各 `view` は一度しか使用できません。ペイウォールを再度表示する必要がある場合は、`CreatePaywallView` をもう一度呼び出して新しい `view` インスタンスを作成してください。
```csharp showLineNumbers title="Unity"
view.Present((error) => {
// handle the error
});
```
:::info
ペイウォールの表示方法の詳細については、[ガイド](unity-present-paywalls)を参照してください。
:::
## 3. ボタンアクションを処理する \{#3-handle-button-actions\}
ユーザーがペイウォール内のボタンをクリックすると、Unity SDK が購入と復元を自動的に処理します。ただし、カスタムまたは事前定義された ID を持つその他のボタンについては、コードでアクションを処理する必要があります。
たとえば、ペイウォールには通常、閉じるボタンや開くべき URL(利用規約やプライバシーポリシーなど)があります。これらのアクションを処理するには、クラスが `AdaptyPaywallsEventsListener` インターフェースを実装し、リスナーとして登録する必要があります。
:::tip
ボタンの[アクション](unity-handle-paywall-actions)と[イベント](unity-handling-events)の処理方法については、各ガイドを参照してください。
:::
```csharp showLineNumbers title="Unity"
public class YourClass : MonoBehaviour, AdaptyPaywallsEventsListener
{
void Start()
{
// Register this class as the paywall events listener
Adapty.SetPaywallsEventsListener(this);
}
// AdaptyPaywallsEventsListener method - handles button actions
public void PaywallViewDidPerformAction(
AdaptyUIPaywallView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
Application.OpenURL(action.Value);
break;
default:
break;
}
}
}
```
## 次のステップ \{#next-steps\}
:::tip
ご質問やお困りのことがあれば、[サポートフォーラム](https://adapty.featurebase.app/)をご覧ください。よくある質問への回答を見つけたり、ご自身の質問を投稿することができます。チームとコミュニティがサポートいたします!
:::
ペイウォールをアプリに表示する準備が整いました。[App Store サンドボックス](test-purchases-in-sandbox)または [Google Play ストア](testing-on-android)でテスト購入を行い、ペイウォールからテスト購入を完了できることを確認してください。
次に、[ユーザーのアクセスレベルを確認し](unity-check-subscription-status)、適切なユーザーにペイウォールを表示したり、有料機能へのアクセスを付与したりできるようにする必要があります。
## 完全な実装例 \{#full-example\}
以下は、すべての手順をアプリに統合した場合の例です。
```csharp showLineNumbers
using System;
using UnityEngine;
using AdaptySDK;
public class PaywallManager : MonoBehaviour, AdaptyPaywallsEventsListener
{
[SerializeField] private string placementId = "YOUR_PLACEMENT_ID";
private AdaptyUIPaywallView currentPaywallView;
void Start()
{
// Register for paywall events
Adapty.SetPaywallsEventsListener(this);
GetAndDisplayPaywall();
}
private void GetAndDisplayPaywall()
{
Adapty.GetPaywall(placementId, (paywall, error) => {
if (error != null) {
Debug.LogError("Error getting paywall: " + error.Message);
return;
}
if (paywall.HasViewConfiguration) {
CreateAndPresentPaywallView(paywall);
} else {
Debug.LogWarning("Paywall was not created using the builder");
}
});
}
private void CreateAndPresentPaywallView(AdaptyPaywall paywall)
{
var parameters = new AdaptyUICreatePaywallViewParameters();
AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
if (error != null) {
Debug.LogError("Error creating paywall view: " + error.Message);
return;
}
currentPaywallView = view;
view.Present((presentError) => {
if (presentError != null) {
Debug.LogError("Error presenting paywall: " + presentError.Message);
return;
}
Debug.Log("Paywall presented successfully");
});
});
}
// AdaptyPaywallsEventsListener implementation
public void PaywallViewDidPerformAction(
AdaptyUIPaywallView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
Debug.Log("Close button pressed");
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
Application.OpenURL(action.Value);
break;
default:
break;
}
}
// Required interface methods (implement as needed)
public void PaywallViewDidAppear(AdaptyUIPaywallView view) { }
public void PaywallViewDidDisappear(AdaptyUIPaywallView view) { }
public void PaywallViewDidSelectProduct(AdaptyUIPaywallView view, string productId) { }
public void PaywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product) { }
public void PaywallViewDidFinishPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyPurchaseResult purchasedResult) { }
public void PaywallViewDidFailPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void PaywallViewDidStartRestore(AdaptyUIPaywallView view) { }
public void PaywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile) { }
public void PaywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error) { }
public void PaywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) { }
public void PaywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyError error) { }
public void PaywallViewDidFinishWebPaymentNavigation(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void ShowPaywall()
{
GetAndDisplayPaywall();
}
void OnDestroy()
{
if (currentPaywallView != null) {
currentPaywallView.Dismiss(null);
}
}
}
```
---
# File: unity-check-subscription-status
---
---
title: "Unity SDKでサブスクリプションステータスを確認する"
description: "AdaptyでUnityアプリのサブスクリプションステータスを確認する方法を学びます。"
---
ユーザーが有料コンテンツにアクセスできるか、またはペイウォールを表示するかどうかを判断するには、プロファイル内の[アクセスレベル](access-level)を確認する必要があります。
この記事では、プロファイルの状態にアクセスして、ユーザーにペイウォールを表示するか有料機能へのアクセスを許可するかを判断する方法を説明します。
## サブスクリプションステータスを取得する \{#get-subscription-status\}
ユーザーにペイウォールを表示するか有料コンテンツを表示するかを判断する際は、プロファイル内の[アクセスレベル](access-level)を確認します。2つの方法があります:
- アプリ起動時などに最新のプロファイルデータがすぐに必要な場合や、強制的に更新したい場合は `GetProfile` を呼び出します。
- サブスクリプションステータスが変わるたびに自動的に更新されるローカルコピーを保持するために、**プロファイルの自動更新**を設定します。
### プロファイルを取得する \{#get-profile\}
サブスクリプションステータスを取得するもっとも簡単な方法は、`GetProfile` メソッドを使ってプロファイルにアクセスすることです:
```csharp showLineNumbers
Adapty.GetProfile((profile, error) => {
if (error != null) {
// handle the error
return;
}
// check the access
});
```
### サブスクリプションの更新を受け取る \{#listen-to-subscription-updates\}
アプリでプロファイルの更新を自動的に受け取るには:
1. `AdaptyEventListener` を継承して `OnLoadLatestProfile` メソッドを実装します。ユーザーのサブスクリプションステータスが変わると、Adaptyが自動的にこのメソッドを呼び出します。
2. このメソッドが呼び出されたときに更新されたプロファイルデータを保存しておくと、追加のネットワークリクエストなしにアプリ全体で利用できます。
```csharp
public class SubscriptionManager : MonoBehaviour, AdaptyEventListener {
private AdaptyProfile currentProfile;
void Start() {
// Register this object as an Adapty event listener
Adapty.SetEventListener(this);
}
// Store the profile when it updates
public void OnLoadLatestProfile(AdaptyProfile profile) {
currentProfile = profile;
// Update UI, unlock content, etc.
}
public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { }
public void OnInstallationDetailsFail(AdaptyError error) { }
// Use stored profile instead of calling getProfile()
public bool HasAccess() {
if (currentProfile?.AccessLevels != null &&
currentProfile.AccessLevels.ContainsKey("premium")) {
return currentProfile.AccessLevels["premium"].IsActive;
}
return false;
}
}
```
:::note
Adaptyはアプリ起動時に自動的に `OnLoadLatestProfile` を呼び出し、デバイスがオフラインでもキャッシュされたサブスクリプションデータを提供します。
:::
## プロファイルとペイウォールロジックを連携させる \{#connect-profile-with-paywall-logic\}
ペイウォールの表示や有料機能へのアクセス許可をすぐに判断したい場合は、ユーザーのプロファイルを直接確認できます。この方法は、アプリ起動時、プレミアムセクションに入るとき、特定のコンテンツを表示する前など、さまざまなシナリオで役立ちます。
```csharp
private void CheckAccessLevel()
{
Adapty.GetProfile((profile, error) => {
if (error != null) {
Debug.LogError("Error checking access level: " + error.Message);
// Show paywall if access check fails
return;
}
var accessLevel = profile.AccessLevels["YOUR_ACCESS_LEVEL"];
if (accessLevel == null || !accessLevel.IsActive) {
// Show paywall if no access
}
});
}
private void InitializePaywall()
{
LoadPaywall();
CheckAccessLevel();
}
```
## 次のステップ \{#next-steps\}
サブスクリプションステータスの追跡方法を確認したら、次は[ユーザープロファイルの操作](unity-quickstart-identify)を学んで、ユーザーが購入したものにアクセスできるようにしましょう。
---
# File: unity-quickstart-identify
---
---
title: "Unity SDKでユーザーを識別する"
description: "UnityでのアプリNの課金管理のための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**でインストールをカウントする必要があります。この場合、再インストールを含む、デバイスへのアプリインストールのたびにインストールとしてカウントされます。
## 識別済みユーザー \{#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)をご覧ください。
:::
### ログイン/サインアップ時 \{#during-loginsignup\}
アプリ起動後にユーザーを識別する場合(例:アプリへのログイン後やサインアップ後)、`identify`メソッドを使用してカスタマーユーザーIDを設定します。
- **このカスタマーユーザーIDを以前に使用したことがない**場合、Adaptyは自動的に現在のプロファイルに紐付けます。
- **このカスタマーユーザーIDでユーザーを以前に識別したことがある**場合、AdaptyはそのカスタマーユーザーIDに関連付けられたプロファイルに切り替えて処理を行います。
:::important
カスタマーユーザーIDは各ユーザーで一意である必要があります。パラメータ値をハードコードすると、すべてのユーザーが同一人物として扱われます。
:::
他のSDKメソッドを呼び出す前に、`Identify`の完了コールバックを待ってください。同時に呼び出すと`#3006 profileWasChanged`が発生するか、匿名プロファイルに対して処理が行われます。詳細は[Unity SDKの呼び出し順序](unity-sdk-call-order)をご覧ください。
```csharp showLineNumbers
Adapty.Identify("YOUR_USER_ID", (error) => { // Unique for each user
if(error == null) {
// successful identify
}
});
```
### SDKアクティベーション時 \{#during-the-sdk-activation\}
SDKをアクティベートする際にすでにカスタマーユーザーIDがわかっている場合は、`identify`を別途呼び出す代わりに、`activate`メソッドに渡すことができます。
カスタマーユーザーIDがわかっているのにアクティベーション後にのみ設定する場合、アクティベーション時にAdaptyが新しい匿名プロファイルを作成し、`identify`を呼び出した後にのみ既存のプロファイルに切り替わります。
既存のカスタマーユーザーID(以前に使用したもの)または新しいものを渡すことができます。新しいものを渡すと、アクティベーション時に作成された新しいプロファイルが自動的にそのカスタマーユーザーIDに紐付けられます。
:::note
デフォルトでは、匿名プロファイルの作成はアナリティクスダッシュボードに影響しません。インストールはデバイスIDに基づいてカウントされるためです。
デバイスIDはデバイスへのアプリのストアからの単一インストールを表し、アプリの再インストール後にのみ再生成されます。
初回インストールか再インストールか、または既存のカスタマーユーザーIDが使用されているかどうかには依存しません。
プロファイルの作成(SDKのアクティベーション時またはログアウト時)、ログイン、またはアプリの再インストールなしのアップグレードは、追加のインストールイベントを生成しません。
デバイスではなく一意のユーザーに基づいてインストールをカウントしたい場合は、**App settings**に移動して[**Installs definition for analytics**](general#4-installs-definition-for-analytics)を設定してください。
:::
```csharp showLineNumbers
using UnityEngine;
using AdaptySDK;
var builder = new AdaptyConfiguration.Builder("YOUR_API_KEY")
.SetCustomerUserId("YOUR_USER_ID"); // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
Adapty.Activate(builder.Build(), (error) => {
if (error != null) {
// handle the error
return;
}
});
```
### ユーザーをログアウトする \{#log-users-out\}
ユーザーをログアウトさせるボタンがある場合は、`logout`メソッドを使用します。
:::important
ユーザーをログアウトすると、そのユーザーの新しい匿名プロファイルが作成されます。
:::
```csharp showLineNumbers
Adapty.Logout((error) => {
if(error == null) {
// successful logout
}
});
```
:::info
ユーザーをアプリに再度ログインさせるには、`identify`メソッドを使用します。
:::
### ログインなしでの購入を許可する \{#allow-purchases-without-login\}
ユーザーがアプリへのログイン前後の両方で購入できる場合、ログイン後もアクセスが維持されるよう対応が必要です。
1. ログアウト状態のユーザーが購入すると、AdaptyはそれをそのユーザーのアノニマスプロファイルIDに紐付けます。
2. ユーザーがアカウントにログインすると、Adaptyはその識別済みプロファイルへの処理に切り替えます。
- 新しいカスタマーユーザーIDの場合(例:登録前に購入が行われた場合)、Adaptyはカスタマーユーザーをを現在のプロファイルに割り当てるため、すべての購入履歴が維持されます。
- 既存のカスタマーユーザーIDの場合(カスタマーユーザーIDがすでにプロファイルに紐付けられている場合)、プロファイルの切り替え後に実際のアクセスレベルを取得する必要があります。識別後すぐに[`getProfile`](unity-check-subscription-status)を呼び出すか、[プロファイルの更新をリッスン](unity-check-subscription-status)してデータを自動的に同期させることができます。
## 次のステップ \{#next-steps\}
おめでとうございます!アプリにアプリ内課金のロジックを実装できました!アプリの収益化がうまくいくことを願っています!
Adaptyをさらに活用するために、以下のトピックも探ってみてください。
- [**テスト**](troubleshooting-test-purchases): すべてが期待どおりに動作することを確認する
- [**オンボーディング**](onboardings): オンボーディングでユーザーを引き込み、継続率を高める
- [**インテグレーション**](configuration): マーケティングアトリビューションや分析サービスをたった1行のコードで統合する
- [**カスタムプロファイル属性を設定する**](unity-setting-user-attributes): ユーザープロファイルにカスタム属性を追加してセグメントを作成し、A/B テストを実施したり、異なるユーザーに異なるペイウォールを表示したりする
---
# File: adapty-sdk-integration-skill-unity
---
---
title: "SDKインテグレーションスキルを使ってAdaptyをUnityアプリに統合する"
description: "adapty-sdk-integrationスキルを使用して、AIコーディングツールでAdapty SDKをUnityアプリにエンドツーエンドで統合します。"
---
:::important
このスキルはベータ版です。スキルが途中で止まったり予期しない動作をする場合は、代わりに[ステップバイステップの統合ガイド](adapty-cursor-unity)を参照してください。AIツールが各ステージを適切なドキュメントとともに順を追って進められるようになっています。
:::
[adapty-sdk-integration スキル](https://github.com/adaptyteam/adapty-sdk-integration-skill)は、Adapty のインテグレーションをエンドツーエンドで自動化します。ダッシュボードのセットアップ、SDK のインストール、ペイウォール、各ステージの検証まで対応しています。プラットフォームを自動検出し、各ステージで関連する Adapty ドキュメントを取得します。
**対応ツール**: Claude Code、GitHub Copilot CLI、OpenAI Codex、Gemini CLI。
インストールするには、お使いのツールに対応したフォームを選択してください。全リストは[スキルの README](https://github.com/adaptyteam/adapty-sdk-integration-skill) にあります。
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex またはその他のツール** — [skills CLI](https://skills.sh) を使用してください(この方法でインストールしたスキルは自動更新されません):
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
または、リポジトリをクローンして `skills/adapty-sdk-integration/` をお使いのツールのスキルディレクトリにコピーしてください。
インストール後、プロジェクトでスキルを実行します:
```
/adapty-sdk-integration
```
スキルがいくつかのセットアップに関する質問をした後、ダッシュボードのセットアップ、SDK のインストール、ペイウォール、検証の手順を案内します。
---
# File: adapty-cursor-unity
---
---
title: "AIアシスタンスを使ってUnityアプリにAdaptyを統合する"
description: "Cursor、Context7、ChatGPT、Claude、その他のAIツールを使用して、UnityアプリにAdaptyを統合するためのステップバイステップガイド。"
---
このガイドでは、AIコーディングツールを使ってUnityアプリにAdaptyを段階的に統合する手順を説明します。適切なAdaptyドキュメントを正しい順序でAIに提供することがポイントです。
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## 始める前に:ダッシュボードの設定 \{#before-you-start-dashboard-setup\}
AdaptyはSDKコードを書く前に、ダッシュボードでの設定が必要です。インタラクティブなLLMスキルを使うか、ダッシュボードから手動で設定できます。
### スキルを使うアプローチ(推奨) \{#skill-approach-recommended\}
Adapty CLIスキルを使うと、LLMがアプリ、プロダクト、アクセスレベル、ペイウォール、プレースメントを直接設定できます。ダッシュボードを都度開く必要がなく、[ストアの接続](integrate-payments)だけダッシュボードで行えば大丈夫です。
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
スキルを追加したら、エージェントで `/adapty-cli` を実行してください。各ステップをガイドしてくれます。ストアの接続が必要なタイミングも案内してくれます。
### ダッシュボードを使うアプローチ \{#dashboard-approach\}
すべてを手動で設定したい場合は、コードを書く前に以下の準備が必要です。ダッシュボードの値はLLMが調べることができないため、ご自身で用意してください。
1. **アプリストアを接続する**: Adapty ダッシュボードで **App settings → General** に移動し、UnityアプリがiOSとAndroid両方を対象としている場合はApp StoreとGoogle Playの両方を接続してください。購入機能を動作させるために必須です。
[アプリストアを接続する](integrate-payments)
2. **Public SDKキーをコピーする**: Adapty ダッシュボードで **App settings → General** に移動し、**API keys** セクションを見つけてください。コード上ではAdaptyの設定ビルダーに渡す文字列として使用します。
3. **プロダクトを少なくとも1つ作成する**: Adapty ダッシュボードで **Products** ページに移動してください。プロダクトはコードから直接参照しません。Adaptyはペイウォールを通じてプロダクトを配信します。
[プロダクトを追加する](quickstart-products)
4. **ペイウォールとプレースメントを作成する**: Adapty ダッシュボードの **Paywalls** ページでペイウォールを作成し、**Placements** ページでプレースメントに割り当てます。コードでは、プレースメントIDが `Adapty.GetPaywall("YOUR_PLACEMENT_ID")` に渡す文字列になります。
[ペイウォールを作成する](quickstart-paywalls)
5. **アクセスレベルを設定する**: Adapty ダッシュボードの **Products** ページでプロダクトごとに設定します。コードでは `profile.AccessLevels["premium"]?.IsActive` で確認する文字列です。デフォルトの `premium` アクセスレベルはほとんどのアプリで機能します。プロダクトによって異なる機能へのアクセス権を付与する場合(例:`basic` プランと `pro` プラン)は、コーディングを始める前に[追加のアクセスレベルを作成](assigning-access-level-to-a-product)してください。
:::tip
5つすべて揃ったら、コードを書く準備完了です。LLMに「Public SDKキーはX、プレースメントIDはY」と伝えると、正確な初期化コードとペイウォール取得コードを生成してもらえます。
:::
### 準備ができたら設定する \{#set-up-when-ready\}
コーディングを始めるにあたって必須ではありませんが、統合が成熟するにつれて必要になります:
- **A/B テスト**: **Placements** ページで設定します。コードの変更は不要です。
[A/B テスト](ab-tests)
- **追加のペイウォールとプレースメント**: 異なるプレースメントIDで `GetPaywall` の呼び出しを追加します。
- **アナリティクス統合**: **Integrations** ページで設定します。統合によって設定方法が異なります。[アナリティクス統合](analytics-integration)と[アトリビューション統合](attribution-integration)を参照してください。
## AdaptyドキュメントをLLMに提供する \{#feed-adapty-docs-to-your-llm\}
### Context7を使う(推奨) \{#use-context7-recommended\}
[Context7](https://context7.com)は、LLMが最新のAdaptyドキュメントに直接アクセスできるMCPサーバーです。質問の内容に基づいて適切なドキュメントを自動的に取得するため、URLを手動で貼り付ける必要がありません。
Context7は**Cursor**、**Claude Code**、**Windsurf**、その他のMCP対応ツールで使用できます。セットアップするには以下を実行してください:
```
npx ctx7 setup
```
エディタを自動検出してContext7サーバーを設定します。手動設定については[Context7 GitHubリポジトリ](https://github.com/upstash/context7)を参照してください。
設定が完了したら、プロンプトでAdaptyライブラリを参照してください:
```
Use the adaptyteam/adapty-docs library to look up how to install the Unity SDK
```
:::warning
Context7を使うとドキュメントのリンクを手動で貼り付ける必要がなくなりますが、実装の順序は重要です。すべてが正しく動作するよう、以下の[実装ウォークスルー](#implementation-walkthrough)をステップ順に進めてください。
:::
### プレーンテキストのドキュメントを使う \{#use-plain-text-docs\}
AdaptyのドキュメントはプレーンテキストのMarkdownとしてアクセスできます。URLの末尾に `.md` を追加するか、記事タイトルの下にある **Copy for LLM** をクリックしてください。例:[adapty-cursor-unity.md](https://adapty.io/docs/ja/adapty-cursor-unity.md)。
以下の[実装ウォークスルー](#implementation-walkthrough)の各ステージには、貼り付け用の `.md` リンクを含む「LLMに送信するもの」ブロックが含まれています。
より多くのドキュメントが必要な場合は、以下の[インデックスファイルとプラットフォーム別サブセット](#plain-text-doc-index-files)を参照してください。
## 実装ウォークスルー \{#implementation-walkthrough\}
このガイドの残りの部分では、実装の順序でAdapty統合を進めていきます。各ステージにはLLMに送るドキュメント、完了時の確認事項、よくある問題が含まれています。
### 統合の計画を立てる \{#plan-your-integration\}
コードを書き始める前に、LLMにプロジェクトを分析させて実装計画を立ててもらいましょう。AIツールがプランニングモードをサポートしている場合(CursorやClaude Codeのプランモードなど)、コードを書く前にLLMがプロジェクト構造とAdaptyドキュメントの両方を読めるよう、それを使用してください。
購入に使用するアプローチをLLMに伝えてください。これによって参照すべきガイドが変わります:
- [**Adapty ペイウォールビルダー**](adapty-paywall-builder): Adaptyのノーコードビルダーでペイウォールを作成し、SDKが自動的にレンダリングします。
- [**手動で作成したペイウォール**](unity-making-purchases): コードで独自のペイウォールUIを構築しますが、プロダクトの取得と購入処理にはAdaptyを使用します。
- [**オブザーバーモード**](observer-vs-full-mode): 既存の購入インフラを維持し、アナリティクスと統合のみにAdaptyを使用します。
どれを選べばいいか迷っていますか?[クイックスタートの比較表](unity-quickstart-paywalls)を読んでください。
### SDKをインストールして設定する \{#install-and-configure-the-sdk\}
Unity Package ManagerでAdapty SDKパッケージを追加し、Public SDKキーで有効化します。これが基盤となり、他のすべての機能はこれなしでは動作しません。
**ガイド:** [Adapty SDKをインストールして設定する](sdk-installation-unity)
LLMに送信するもの:
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/ja/sdk-installation-unity.md
```
:::tip[チェックポイント]
- **期待される結果:** プロジェクトがビルドされ実行されます。UnityコンソールにAdaptyのアクティベーションログが表示されます。
- **注意点:** 「Public API key is missing」→ プレースホルダーをApp settingsの実際のキーに置き換えたか確認してください。
:::
### ペイウォールを表示して購入を処理する \{#show-paywalls-and-handle-purchases\}
プレースメントIDでペイウォールを取得し、表示して、購入イベントを処理します。必要なガイドは購入の処理方法によって異なります。
進めながらサンドボックスで各購入をテストしてください。最後まで待たないようにしましょう。設定手順については[サンドボックスで購入をテストする](test-purchases-in-sandbox)を参照してください。
任意
デフォルト: `en`
|[ペイウォールのローカライズ](add-paywall-locale-in-adapty-paywall-builder)の識別子。マイナス(**-**)文字で区切られた1つまたは2つのサブタグからなる言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。
例:`en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードと推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDKはサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、このオプションを推奨します。
ただし、ユーザーの接続が不安定な場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在する場合はそれを返すことを検討してください。この場合、最新のデータが得られないことがありますが、接続状況にかかわらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても安全です。
キャッシュはアプリの再起動後も保持され、アプリの再インストールまたは手動クリーンアップ時にのみクリアされます。
Adapty SDK はペイウォールをローカルに2層で保存します:上述の定期更新キャッシュと[フォールバックペイウォール](fallback-paywalls)です。また、CDNを使用してペイウォールをより高速に取得し、CDNが利用できない場合のためにスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な場合でも常に最新バージョンのペイウォールを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウトを制限する値です。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
内部で複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間より少し遅くタイムアウトすることがあります。
| レスポンスパラメーター: | パラメーター | 説明 | | :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | プロダクトIDのリスト、ペイウォール識別子、リモートコンフィグ、その他のプロパティを含む [`AdaptyPaywall`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) オブジェクト。 | ## ペイウォールビルダーで設計したペイウォールのビュー設定を取得する \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important ペイウォールビルダーで **Show on device** トグルが有効になっていることを確認してください。このオプションがオンになっていない場合、ビュー設定を取得できません。 ::: ペイウォールを取得したら、`ViewConfiguration` が含まれているかどうかを確認します。これはペイウォールビルダーで作成されたことを示します。`ViewConfiguration` が存在する場合はペイウォールビルダーのペイウォールとして扱い、存在しない場合は[リモートコンフィグペイウォールとして処理](present-remote-config-paywalls-unity)します。 Unity SDK では、ビュー設定を手動で取得せずに、直接 `CreatePaywallView` メソッドを呼び出します。 :::warning `CreatePaywallView` メソッドの結果は1回のみ使用できます。再度使用する必要がある場合は、`CreatePaywallView` メソッドを再度呼び出してください。再作成せずに2回呼び出すと、`AdaptyUIError.viewAlreadyPresented` エラーが発生する場合があります。 ::: ```csharp showLineNumbers var parameters = new AdaptyUICreatePaywallViewParameters() .SetPreloadProducts(preloadProducts) .SetLoadTimeout(new TimeSpan(0, 0, 3)); AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => { // handle the result }); ``` パラメーター: | パラメーター | 必須/任意 | 説明 | | :------------------ | :------------- | :----------------------------------------------------------- | | **paywall** | 必須 | 対象のペイウォールのコントローラーを取得するための `AdaptyPaywall` オブジェクト。 | | **loadTimeout** | デフォルト: 5秒 | このメソッドのタイムアウトを制限する値です。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。内部で複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間より少し遅くタイムアウトすることがあります。 | | **PreloadProducts** | 任意 | `AdaptyPaywallProducts` の配列を提供して、画面上のプロダクト表示タイミングを最適化します。`nil` が渡された場合、AdaptyUI は必要なプロダクトを自動的に取得します。 | | **CustomTags** | 任意 | カスタムタグとその解決済みの値の辞書を定義します。カスタムタグはペイウォールコンテンツのプレースホルダーとして機能し、ペイウォール内のパーソナライズされたコンテンツのために特定の文字列に動的に置き換えられます。詳細はペイウォールビルダーのカスタムタグのトピックを参照してください。 | | **CustomTimers** | 任意 | カスタムタイマーとその終了日時の辞書を定義します。カスタムタイマーを使用すると、ペイウォールにカウントダウンタイマーを表示できます。 | :::note 複数の言語を使用する場合、[ペイウォールビルダーのローカライズ](add-paywall-locale-in-adapty-paywall-builder)を追加する方法と、ロケールコードを正しく使用する方法を[こちら](localizations-and-locale-codes)で確認してください。 ::: ビューを取得したら、[ペイウォールを表示](unity-present-paywalls)します。 ## アセットをカスタマイズする \{#customize-assets\} ペイウォール内の画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像と動画には事前定義されたID(`hero_image` と `hero_video`)があります。カスタムアセットバンドルでは、これらのIDでターゲット要素を指定してカスタマイズします。 その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定](custom-media)する必要があります。 例えば、以下のことができます: - 一部のユーザーに異なる画像や動画を表示する。 - リモートのメイン画像の読み込み中にローカルのプレビュー画像を表示する。 - 動画再生前にプレビュー画像を表示する。 :::important この機能を使用するには、Adapty Unity SDK をバージョン 3.8.0 以降に更新してください。 ::: シンプルな辞書でカスタムアセットを提供する例: ```csharp showLineNumbers var customAssets = new Dictionary任意
デフォルト: `en`
|ペイウォールのローカライズの識別子。マイナス(**-**)文字で区切られた1つまたは2つのサブタグからなる言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。
例:`en` は英語、`pt-br` はブラジルポルトガル語を表します。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDKはサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、このオプションを推奨します。
ただし、ユーザーの接続が不安定な場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在する場合はそれを返すことを検討してください。この場合、最新のデータが得られないことがありますが、接続状況にかかわらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても安全です。
キャッシュはアプリの再起動後も保持され、アプリの再インストールまたは手動クリーンアップ時にのみクリアされます。
Adapty SDK はペイウォールをローカルに2層で保存します:上述の定期更新キャッシュとフォールバックペイウォールです。また、CDNを使用してペイウォールをより高速に取得し、CDNが利用できない場合のためにスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な場合でも常に最新バージョンのペイウォールを取得できるよう設計されています。
| --- # File: unity-present-paywalls --- --- title: "ペイウォールを表示する" description: "Adapty SDK を使用して Unity アプリでペイウォールを表示する方法を学びましょう。" --- ペイウォールビルダーを使ってペイウォールをカスタマイズしている場合、モバイルアプリのコード内でユーザーに表示するためのレンダリング処理は不要です。このようなペイウォールには、表示する内容と表示方法の両方が含まれています。 :::warning このガイドは、Adapty SDK 3.3.0 以降が必要な**新しいペイウォールビルダー**を対象としています。 リモートコンフィグのペイウォールを表示する場合は、[リモートコンフィグで設計したペイウォールのレンダリング](present-remote-config-paywalls)を参照してください。 ::: ペイウォールを表示するには、[`CreatePaywallView`](unity-get-pb-paywalls#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder) メソッドで作成した `view` に対して `view.Present()` メソッドを使用します。各 `view` は一度しか使用できません。ペイウォールを再度表示する必要がある場合は、`CreatePaywallView` をもう一度呼び出して新しい `view` インスタンスを作成してください。 :::warning `view` を再作成せずに再利用すると、`AdaptyUIError.viewAlreadyPresented` エラーが発生する場合があります。 ::: ```csharp showLineNumbers title="Unity" view.Present((error) => { // handle the error }); ``` :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: ## ダイアログを表示する \{#show-dialog\} Android でペイウォールビューが表示されている場合は、ネイティブのアラートダイアログの代わりにこのメソッドを使用してください。Android では、通常のアラートはペイウォールビューの背面に表示されるため、ユーザーには見えません。このメソッドを使用すると、すべてのプラットフォームでペイウォールの上に正しくダイアログが表示されます。 ```csharp showLineNumbers title="Unity" var dialog = new AdaptyUIDialogConfiguration() .SetTitle("Close paywall?") .SetContent("You will lose access to exclusive offers.") .SetDefaultActionTitle("Stay") .SetSecondaryActionTitle("Close"); AdaptyUI.ShowDialog(view, dialog, (action, error) => { if (error == null) { if (action == AdaptyUIDialogActionType.Secondary) { // User confirmed - close the paywall view.Dismiss(); } // If primary - do nothing, user stays } }); ``` ## iOS の表示スタイルを設定する \{#configure-ios-presentation-style\} `Present()` メソッドに `iosPresentationStyle` パラメーターを渡すことで、iOS でのペイウォールの表示方法を設定できます。パラメーターには `AdaptyUIIOSPresentationStyle.FullScreen`(デフォルト)または `AdaptyUIIOSPresentationStyle.PageSheet` を指定できます。 ```csharp showLineNumbers title="Unity" view.Present(AdaptyUIIOSPresentationStyle.PageSheet, (error) => { // handle the error }); ``` --- # File: unity-handle-paywall-actions --- --- title: "Unity SDKでボタンアクションに応答する" description: "AdaptyのUnityでペイウォールのボタンアクションを処理して、アプリのマネタイズを改善します。" --- Adaptyのペイウォールビルダーを使ってペイウォールを作成する場合、ボタンを適切に設定することが重要です。 1. [ペイウォールビルダーでボタンを追加](paywall-buttons)し、既存のアクションを割り当てるか、カスタムアクションIDを作成します。 2. 割り当てた各アクションを処理するコードをアプリに実装します。 このガイドでは、カスタムアクションと既存のアクションをコードで処理する方法を説明します。 :::warning **購入と復元のみ自動的に処理されます。** ペイウォールを閉じる、リンクを開くなど、その他のボタンアクションはすべて、アプリのコードに適切な処理を実装する必要があります。 ::: ## ペイウォールを閉じる \{#close-paywalls\} ペイウォールを閉じるボタンを追加するには、次の手順に従います。 1. ペイウォールビルダーでボタンを追加し、**Close** アクションを割り当てます。 2. アプリのコードに、ペイウォールを閉じる `close` アクションのハンドラーを実装します。 ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.Close: view.Dismiss(null); break; default: // handle other events break; } } ``` ## ペイウォールからURLを開く \{#open-urls-from-paywalls\} :::tip リンクのグループ(利用規約や購入の復元など)を追加したい場合は、ペイウォールビルダーで **Link** 要素を追加し、**Open URL** アクションが設定されたボタンと同じ方法で処理します。 ::: ペイウォールからリンクを開くボタン(**Terms of use** や **Privacy policy** など)を追加するには、次の手順に従います。 1. ペイウォールビルダーでボタンを追加し、**Open URL** アクションを割り当て、開きたいURLを入力します。 2. アプリのコードに、受け取ったURLをブラウザで開く `openUrl` アクションのハンドラーを実装します。 ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.OpenUrl: var urlString = action.Value; if(!string.IsNullOrWhiteSpace(urlString)) { Application.OpenURL(urlString); } break; default: // handle other events break; } } ``` ## アプリへのログイン \{#log-into-the-app\} ユーザーをアプリにログインさせるボタンを追加するには、次の手順に従います。 1. ペイウォールビルダーでボタンを追加し、ID `login` の **Custom** アクションを割り当てます。 2. アプリのコードに、ユーザーを識別する `login` カスタムアクションのハンドラーを実装します。 ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.Custom: if (action.Value == "login") { // Navigate to login scene SceneManager.LoadScene("LoginScene"); } break; default: // handle other events break; } } ``` ## カスタムアクションを処理する \{#handle-custom-actions\} その他のアクションを処理するボタンを追加するには、次の手順に従います。 1. ペイウォールビルダーでボタンを追加し、**Custom** アクションを割り当て、IDを設定します。 2. アプリのコードに、作成したアクションIDのハンドラーを実装します。 たとえば、別のサブスクリプションオファーや買い切り購入がある場合、別のペイウォールを表示するボタンを追加できます。 ```csharp showLineNumbers title="Unity" public void PaywallViewDidPerformAction( AdaptyUIPaywallView view, AdaptyUIUserAction action ) { switch (action.Type) { case AdaptyUIUserActionType.Custom: if (action.Value == "openNewPaywall") { // Display another paywall ShowAlternativePaywall(); } break; default: // handle other events break; } } private void ShowAlternativePaywall() { // Implement your logic to show alternative paywall } ``` --- # File: unity-handling-events --- --- title: "ペイウォールイベントの処理" description: "Adapty SDK を使用して Unity アプリでペイウォールイベントを処理する方法を学びましょう。" --- :::important このガイドでは、購入・復元・プロダクト選択・ペイウォールのレンダリングに関するイベント処理を説明します。ボタン操作(ペイウォールを閉じる、リンクを開くなど)の実装も必要です。詳細は[ボタンアクションの処理ガイド](unity-handle-paywall-actions)をご覧ください。 ::: [ペイウォールビルダー](adapty-paywall-builder)で設定されたペイウォールは、購入や復元のために追加コードは不要です。ただし、アプリが応答できるいくつかのイベントが生成されます。これらのイベントには、ボタン操作(閉じるボタン、URL、プロダクト選択など)や、ペイウォール上で行われた購入関連のアクションへの通知が含まれます。以下でこれらのイベントへの対応方法を説明します。 :::warning このガイドは、Adapty SDK v3.3.0 以降が必要な**新しいペイウォールビルダーのペイウォール**専用です。 ::: :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: ## イベントの処理 \{#handling-events\} モバイルアプリ内のペイウォール画面で発生するプロセスを制御・監視するには、`AdaptyPaywallsEventsListener` インターフェースを実装します。 ```csharp showLineNumbers title="Unity" using UnityEngine; using AdaptySDK; public class PaywallEventsHandler : MonoBehaviour, AdaptyPaywallsEventsListener { void Start() { Adapty.SetPaywallsEventsListener(this); } // Implement all required interface methods below } ``` ### ユーザーが生成するイベント \{#user-generated-events\} #### ペイウォールの表示 \{#paywall-appeared\} ペイウォールビューが画面に表示されたときに呼び出されます。 :::note iOS では、ユーザーがペイウォール内の[ウェブペイウォールボタン](web-paywall#step-2a-add-a-web-purchase-button)をタップして、インアプリブラウザでウェブペイウォールが開いたときにも呼び出されます。 ::: ```csharp showLineNumbers title="Unity" public void PaywallViewDidAppear(AdaptyUIPaywallView view) { } ``` #### ペイウォールの非表示 \{#paywall-disappeared\} ペイウォールビューが画面から閉じられたときに呼び出されます。 :::note iOS では、ペイウォールからインアプリブラウザで開いた[ウェブペイウォール](web-paywall#step-2a-add-a-web-purchase-button)が画面から消えたときにも呼び出されます。 ::: ```csharp showLineNumbers title="Unity" public void PaywallViewDidDisappear(AdaptyUIPaywallView view) { } ``` #### プロダクト選択 \{#product-selection\} プロダクトが購入対象として選択されたとき(ユーザーまたはシステムによる)に呼び出されます。 ```csharp showLineNumbers title="Unity" public void PaywallViewDidSelectProduct( AdaptyUIPaywallView view, string productId ) { } ```
## ペイウォールのビュー数が多すぎる \{#the-paywall-view-number-is-too-big\}
**問題**: ペイウォールのビュー数が期待値の2倍になっている。
**原因**: コード内で `LogShowPaywall` を呼び出している可能性があります。ペイウォールビルダーを使用している場合、この呼び出しによってビュー数が重複します。ペイウォールビルダーでデザインされたペイウォールでは、アナリティクスが自動的に追跡されるため、このメソッドを使用する必要はありません。
**解決策**: ペイウォールビルダーを使用している場合は、コード内で `LogShowPaywall` を呼び出していないことを確認してください。
## その他の問題 \{#other-issues\}
**問題**: 上記以外のペイウォールビルダー関連の問題が発生している。
**解決策**: 必要に応じて[マイグレーションガイド](unity-sdk-migration-guides)を参照し、SDKを最新バージョンに移行してください。多くの問題は新しいSDKバージョンで解決されています。
---
# File: unity-quickstart-manual
---
---
title: "Unity SDKでカスタムペイウォールの購入を有効にする"
description: "Adapty SDKをUnityのカスタムペイウォールに統合してアプリ内課金を有効にします。"
---
このガイドでは、カスタムペイウォールへのAdapty統合方法を説明します。ペイウォールの実装を完全にコントロールしながら、Adapty SDKがプロダクトの取得、新規購入の処理、過去の購入の復元を担当します。
:::important
**このガイドはカスタムペイウォールを実装する開発者向けです。** 購入を最も簡単に有効にする方法をお探しの場合は、[Adapty ペイウォールビルダー](unity-quickstart-paywalls)をご利用ください。ペイウォールビルダーを使えば、ノーコードのビジュアルエディターでペイウォールを作成でき、購入ロジックはAdaptyが自動処理します。また、アプリを再公開することなく異なるデザインをテストできます。
:::
## 始める前に \{#before-you-start\}
### プロダクトのセットアップ \{#set-up-products\}
アプリ内課金を有効にするには、次の3つの重要な概念を理解する必要があります:
- [**プロダクト**](product) – ユーザーが購入できるもの(サブスクリプション、消耗型アイテム、永続アクセス)
- [**ペイウォール**](paywalls) – どのプロダクトを提供するかを定義する設定。Adaptyではペイウォールがプロダクトを取得する唯一の方法ですが、この設計によりアプリコードを変更せずにプロダクト、価格、オファーを変更できます。
- [**プレースメント**](placements) – アプリ内でペイウォールを表示する場所とタイミング(`main`、`onboarding`、`settings`など)。ダッシュボードでプレースメントにペイウォールを設定し、コード内でプレースメントIDを使ってリクエストします。これにより、A/Bテストの実施や異なるユーザーへの異なるペイウォール表示が簡単になります。
カスタムペイウォールを使う場合でも、これらの概念を理解しておくことが重要です。基本的に、アプリで販売するプロダクトを管理するための手段です。
カスタムペイウォールを実装するには、**ペイウォール**を作成して**プレースメント**に追加する必要があります。この設定によりプロダクトを取得できます。ダッシュボードで何をすべきかを理解するには、[こちら](quickstart)のクイックスタートガイドをご覧ください。
### ユーザーの管理 \{#manage-users\}
バックエンド認証の有無にかかわらず利用できます。
ただし、Adapty SDKは匿名ユーザーと識別済みユーザーを異なる方法で扱います。詳細を確認し、ユーザーを適切に扱うために[識別クイックスタートガイド](unity-quickstart-identify)をお読みください。
## ステップ1. プロダクトを取得する \{#step-1-get-products\}
カスタムペイウォール用のプロダクトを取得するには、次の手順が必要です:
1. `getPaywall`メソッドに[プレースメント](placements)IDを渡して`paywall`オブジェクトを取得します。
2. `getPaywallProducts`メソッドを使ってこのペイウォールのプロダクト配列を取得します。
```csharp showLineNumbers
using AdaptySDK;
void LoadPaywall() {
Adapty.GetPaywall("YOUR_PLACEMENT_ID", (paywall, error) => {
if (error != null) {
// Handle the error
return;
}
Adapty.GetPaywallProducts(paywall, (products, productsError) => {
if (productsError != null) {
// Handle the error
return;
}
// Use products to build your custom paywall UI
});
});
}
```
## ステップ2. 購入を受け付ける \{#step-2-accept-purchases\}
ユーザーがカスタムペイウォールでプロダクトをタップしたら、選択されたプロダクトを引数に`makePurchase`メソッドを呼び出します。購入フローが処理され、更新されたプロファイルが返されます。
```csharp showLineNumbers
using AdaptySDK;
void PurchaseProduct(AdaptyPaywallProduct product) {
Adapty.MakePurchase(product, (result, error) => {
if (error != null) {
// Handle the error
return;
}
switch (result.Type) {
case AdaptyPurchaseResultType.Success:
var profile = result.Profile;
// Purchase successful, profile updated
break;
case AdaptyPurchaseResultType.UserCancelled:
// User canceled the purchase
break;
case AdaptyPurchaseResultType.Pending:
// Purchase is pending (e.g., user will pay offline with cash)
break;
}
});
}
```
## ステップ3. 購入を復元する \{#step-3-restore-purchases\}
アプリストアは、サブスクリプションのあるすべてのアプリに対して、ユーザーが購入を復元できる手段を提供することを要求しています。
ユーザーが復元ボタンをタップしたら`restorePurchases`メソッドを呼び出します。購入履歴がAdaptyと同期され、更新されたプロファイルが返されます。
```csharp showLineNumbers
using AdaptySDK;
void RestorePurchases() {
Adapty.RestorePurchases((profile, error) => {
if (error != null) {
// Handle the error
return;
}
// Restore successful, profile updated
});
}
```
## 次のステップ \{#next-steps\}
:::tip
ご質問やお困りのことがあれば、[サポートフォーラム](https://adapty.featurebase.app/)をご覧ください。よくある質問への回答を見つけたり、ご自身の質問を投稿することができます。チームとコミュニティがサポートいたします!
:::
ペイウォールをアプリに表示する準備が整いました。[App Storeサンドボックス](test-purchases-in-sandbox)または[Google Play Store](testing-on-android)でテスト購入を実施して、ペイウォールからテスト購入を完了できることを確認してください。
次に、[ユーザーが購入を完了したかどうか確認](unity-check-subscription-status)して、ペイウォールを表示するか有料機能へのアクセスを許可するかを判断します。
---
# File: fetch-paywalls-and-products-unity
---
---
title: "Unity SDKでリモートコンフィグペイウォールのペイウォールとプロダクトを取得する"
description: "Adapty Unity SDKでペイウォールとプロダクトを取得し、ユーザーのマネタイズを強化する。"
---
リモートコンフィグやカスタムペイウォールを表示する前に、それらの情報を取得する必要があります。このトピックはリモートコンフィグおよびカスタムペイウォールに関するものです。ペイウォールビルダーでカスタマイズしたペイウォールの取得方法については、[ペイウォールビルダーのペイウォールと設定の取得](unity-get-pb-paywalls)を参照してください。
:::tip
Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。
:::
任意
デフォルト: `en`
|[ペイウォールのローカライゼーション](add-remote-config-locale)の識別子。このパラメータはマイナス(**-**)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
ロケールコードの詳細と推奨される使い方については、[ローカライゼーションとロケールコード](unity-localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDKはサーバーからデータを読み込もうとし、失敗した場合はキャッシュデータを返します。ユーザーが常に最新のデータを取得できるため、この設定を推奨します。
ただし、ユーザーのインターネット接続が不安定だと思われる場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在する場合に返すことを検討してください。この場合、ユーザーは最新データを取得できないことがありますが、通信状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中のネットワークリクエスト削減に安全に使用できます。
キャッシュはアプリの再起動後も保持され、アプリの再インストールまたは手動でのクリア時のみ削除されます。
Adapty SDKはペイウォールを2層で保存します。上記の定期更新キャッシュと[フォールバックペイウォール](unity-use-fallback-paywalls)です。また、CDNを使用してペイウォールを高速に取得し、CDNが利用できない場合のスタンドアロンフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な環境でも常に最新バージョンのペイウォールを確実に取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウトを制限します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。
このメソッドは内部で複数のリクエストを実行する場合があるため、まれに `loadTimeout` で指定した時間よりわずかに遅れてタイムアウトすることがあります。
| プロダクトIDはハードコードしないでください!ペイウォールはリモートで設定されるため、利用可能なプロダクト、プロダクトの数、特典(無料トライアルなど)は時間とともに変わる場合があります。これらのシナリオをコードで処理するようにしてください。 例えば、最初に2つのプロダクトを取得した場合、アプリはその2つを表示します。後で3つのプロダクトを取得した場合も、コード変更なしにすべての3つを表示できるようにしてください。ハードコードが必要なのはプレースメントIDだけです。 レスポンスパラメータ: | パラメータ | 説明 | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | プロダクトIDのリスト、ペイウォール識別子、リモートコンフィグ、その他いくつかのプロパティを含む [`AdaptyPaywall`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) オブジェクト。 | ## プロダクトの取得 \{#fetch-products\} ペイウォールを取得したら、対応するプロダクト配列を取得できます: ```csharp showLineNumbers Adapty.GetPaywallProducts(paywall, (products, error) => { if(error != null) { // handle the error return; } // products - the requested products array }); ``` レスポンスパラメータ: | パラメータ | 説明 | | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Products | プロダクト識別子、プロダクト名、価格、通貨、サブスクリプション期間、その他いくつかのプロパティを含む [`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html) オブジェクトのリスト。 | 独自のペイウォールデザインを実装する場合、[`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html) オブジェクトのプロパティへのアクセスが必要になるでしょう。以下によく使用されるプロパティを示しますが、すべての利用可能なプロパティの詳細はリンク先のドキュメントを参照してください。 | プロパティ | 説明 | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | プロダクトのタイトルを表示するには `product.LocalizedTitle` を使用してください。ローカライゼーションはデバイス自体のロケールではなく、ユーザーが選択しているストアの国に基づきます。 | | **Price** | ローカライズされた価格を表示するには `product.Price.LocalizedString` を使用してください。このローカライゼーションはデバイスのロケール情報に基づきます。`product.Price.Amount` を使用して価格を数値として取得することもできます。値はローカル通貨で提供されます。関連する通貨記号を取得するには `product.Price.CurrencySymbol` を使用してください。 | | **Subscription Period** | 期間(週、月、年など)を表示するには `product.Subscription?.LocalizedPeriod` を使用してください。このローカライゼーションはデバイスのロケールに基づきます。プログラムでサブスクリプション期間を取得するには `product.Subscription?.Period` を使用してください。そこから `Unit` 列挙型にアクセスして長さを取得できます(`AdaptySubscriptionPeriodUnit.Day`、`AdaptySubscriptionPeriodUnit.Week`、`AdaptySubscriptionPeriodUnit.Month`、`AdaptySubscriptionPeriodUnit.Year`、または `AdaptySubscriptionPeriodUnit.Unknown`)。`NumberOfUnits` の値で期間単位の数を取得できます。例えば、四半期サブスクリプションの場合、Unit プロパティに `AdaptySubscriptionPeriodUnit.Month`、NumberOfUnits プロパティに `3` が表示されます。 | | **Introductory Offer** | サブスクリプションに初回オファーが含まれているかをバッジなどで示すには、`product.Subscription?.Offer?.Phases` プロパティを確認してください。これは最大2つの割引フェーズ(無料トライアルフェーズと初回価格フェーズ)を含むことができるリストです。各フェーズオブジェクトには以下の便利なプロパティが含まれます:任意
デフォルト: `en`
|ペイウォールのローカライゼーションの識別子。このパラメータはマイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。
例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDKはサーバーからデータを読み込もうとし、失敗した場合はキャッシュデータを返します。ユーザーが常に最新のデータを取得できるため、このオプションを推奨します。
ただし、ユーザーのインターネット接続が不安定だと思われる場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータが存在する場合に返すことを検討してください。この場合、ユーザーは最新データを取得できないことがありますが、通信状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中のネットワークリクエスト削減に安全に使用できます。
キャッシュはアプリの再起動後も保持され、アプリの再インストールまたは手動でのクリア時のみ削除されます。
Adapty SDKはペイウォールをローカルに2層で保存します。上記の定期更新キャッシュとフォールバックペイウォールです。また、CDNを使用してペイウォールを高速に取得し、CDNが利用できない場合のスタンドアロンフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な環境でも常に最新バージョンのペイウォールを確実に取得できるよう設計されています。
| --- # File: present-remote-config-paywalls-unity --- --- title: "Unity SDKでリモートコンフィグによるペイウォールをレンダリングする" description: "Adapty Unity SDKでリモートコンフィグのペイウォールを表示し、ユーザー体験をパーソナライズする方法を解説します。" --- リモートコンフィグを使ってペイウォールをカスタマイズした場合、ユーザーに表示するためにモバイルアプリのコードでレンダリングを実装する必要があります。リモートコンフィグはニーズに合わせた柔軟性を提供するため、何を含めるか、ペイウォールのビューがどのように表示されるかはすべて開発者が管理します。リモートコンフィグを取得するメソッドを提供しているので、リモートコンフィグで設定したカスタムペイウォールを自由に表示できます。 ## ペイウォールのリモートコンフィグを取得して表示する \{#get-paywall-remote-config-and-present-it\} ペイウォールのリモートコンフィグを取得するには、`remoteConfig` プロパティにアクセスして必要な値を取り出します。 ```csharp showLineNumbers Adapty.GetPaywall("YOUR_PLACEMENT_ID", (paywall, error) => { if (error != null) { // handle the error return; } // Access remote config dictionary var dictionary = paywall.RemoteConfig?.Dictionary; var headerText = dictionary?["header_text"] as string; // Or access raw JSON data var jsonData = paywall.RemoteConfig?.Data; }); ``` 必要な値をすべて取得したら、それらをレンダリングして視覚的に魅力的なページに組み立てます。さまざまなモバイル端末の画面サイズや向きに対応したデザインにして、異なるデバイスでもシームレスで使いやすい体験を提供してください。 :::warning Adapty アナリティクスがファネルや A/B テストのデータを取得できるよう、以下で説明する[ペイウォール表示イベントの記録](present-remote-config-paywalls-unity#track-paywall-view-events)を必ず行ってください。 ::: ペイウォールの表示が完了したら、購入フローの設定に進みます。ユーザーが購入する際は、ペイウォールのプロダクトを引数として `.MakePurchase()` を呼び出すだけです。`.MakePurchase()` メソッドの詳細については、[購入の実装](unity-making-purchases)をご覧ください。 インターネット接続やキャッシュが利用できない場合にユーザーに表示される[フォールバックペイウォールの作成](unity-use-fallback-paywalls)をお勧めします。これにより、そのような状況でもスムーズな体験が確保されます。 ## ペイウォール表示イベントをトラッキングする \{#track-paywall-view-events\} Adapty はペイウォールのパフォーマンス測定をサポートしています。購入データは自動的に収集されますが、ペイウォールの表示ログはユーザーがペイウォールを見たタイミングを把握しているのは開発者だけのため、手動での記録が必要です。 ペイウォール表示イベントをログに記録するには `.LogShowPaywall(paywall)` を呼び出すだけで、ファネルや A/B テストのペイウォール指標に反映されます。 :::important [ペイウォールビルダー](adapty-paywall-builder)で作成したペイウォールを表示する場合は、`.LogShowPaywall(paywall)` を呼び出す必要はありません。 ::: ```csharp showLineNumbers Adapty.LogShowPaywall(paywall, (error) => { // handle the error }); ``` リクエストパラメーター: | パラメーター | 必須 | 説明 | | :---------- | :------- |:------------------------------------------------------------------| | **paywall** | 必須 | [`AdaptyPaywall`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) オブジェクト。 | --- # File: unity-making-purchases --- --- title: "Unity SDKでモバイルアプリ内購入を行う" description: "Adaptyを使用したアプリ内課金とサブスクリプションの処理ガイド。" --- モバイルアプリ内にペイウォールを表示することは、ユーザーにプレミアムコンテンツやサービスへのアクセスを提供するための重要なステップです。ただし、[ペイウォールビルダー](adapty-paywall-builder)を使ってペイウォールをカスタマイズしている場合は、ペイウォールを表示するだけで購入処理が完結します。 ペイウォールビルダーを使用しない場合は、`.makePurchase()` という別のメソッドを使って購入を完了し、対象のコンテンツをアンロックする必要があります。このメソッドは、ユーザーがペイウォールを操作して購入を進めるための入口となります。 ペイウォールに購入しようとしているプロダクトに対して有効なプロモーションオファーが設定されている場合、Adaptyは購入時に自動的にそのオファーを適用します。 :::warning 初回オファーが自動的に適用されるのは、ペイウォールビルダーで設定されたペイウォールを使用している場合のみです。 それ以外の場合は、[iOS での初回オファーの適用資格をユーザーごとに確認する](fetch-paywalls-and-products#check-intro-offer-eligibility-on-ios)必要があります。このステップを省略すると、リリース時にアプリが審査でリジェクトされる可能性があります。また、初回オファーの対象となるユーザーに通常価格が請求されてしまう場合もあります。 ::: [初期設定](quickstart)をすべてのステップを漏らさず完了していることを確認してください。設定が完了していないと、購入の検証ができません。 ## 購入を行う \{#make-purchase\} :::note **[ペイウォールビルダー](adapty-paywall-builder)を使用していますか?** 購入は自動的に処理されるため、このステップは省略できます。 **ステップバイステップのガイドをお探しですか?** エンドツーエンドの実装手順については、[クイックスタートガイド](unity-implement-paywalls-manually)をご確認ください。 ::: ```csharp showLineNumbers using AdaptySDK; void MakePurchase(AdaptyPaywallProduct product) { Adapty.MakePurchase(product, (result, error) => { switch (result.Type) { case AdaptyPurchaseResultType.Pending: // handle pending purchase break; case AdaptyPurchaseResultType.UserCancelled: // handle purchase cancellation break; case AdaptyPurchaseResultType.Success: var profile = result.Profile; // handle successfull purchase break; default: break; } }); } ``` リクエストパラメーター: | パラメーター | 必須/任意 | 説明 | | :---------- | :------- |:------------------------------------------------------------------------------------------------------| | **Product** | 必須 | ペイウォールから取得した [`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html) オブジェクト。 | レスポンスパラメーター: | パラメーター | 説明 | |---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Profile** |リクエストが成功した場合、このオブジェクトがレスポンスに含まれます。[AdaptyProfile](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html) オブジェクトは、ユーザーのアクセスレベル、サブスクリプション、アプリ内の買い切り購入に関する包括的な情報を提供します。
アクセスレベルのステータスを確認して、ユーザーが必要なアクセス権を持っているかどうかを判断してください。
| :::warning **注意:** Apple の StoreKit バージョンが v2.0 未満、かつ Adapty SDK バージョンが v2.9.0 未満の場合は、代わりに [Apple App Store 共有シークレット](app-store-connection-configuration#step-5-enter-app-store-shared-secret)を提供する必要があります。この方法は現在 Apple によって非推奨とされています。 ::: ## 購入時にサブスクリプションを変更する \{#change-subscription-when-making-a-purchase\} ユーザーが現在のサブスクリプションを更新する代わりに新しいサブスクリプションを選択する場合、動作はアプリストアによって異なります。 - App Storeでは、サブスクリプショングループ内でサブスクリプションが自動的に更新されます。ユーザーがあるグループのサブスクリプションを購入した際に、別のグループのサブスクリプションがすでに有効な場合、両方のサブスクリプションが同時に有効になります。 - Google Playでは、サブスクリプションは自動的に更新されません。以下に説明するように、モバイルアプリのコードで切り替え処理を管理する必要があります。 Androidで別のサブスクリプションに切り替えるには、追加パラメーターを指定して `.makePurchase()` メソッドを呼び出します。 ```csharp showLineNumbers // Create subscription update parameters var subscriptionUpdateParams = new AdaptySubscriptionUpdateParameters( "old_product_id", // Product ID of the current subscription AdaptySubscriptionUpdateReplacementMode.WithTimeProration ); Adapty.MakePurchase(product, subscriptionUpdateParams, (profile, error) => { if(error != null) { // Handle the error return; } // successful cross-grade }); ``` 追加のリクエストパラメーター: | パラメーター | 必須/任意 | 説明 | | :--------------------------- | :------- |:-------------------------------------------------------------------------------------------------------| | **subscriptionUpdateParams** | 必須 | [`AdaptySubscriptionUpdateParameters`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_subscription_update_parameters.html) オブジェクト。 | サブスクリプションと置き換えモードの詳細については、Google Developerのドキュメントをご参照ください。 - [置き換えモードについて](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [置き換えモードに関するGoogleの推奨事項](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - 置き換えモード [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE())。注意: このメソッドはサブスクリプションのアップグレードにのみ使用できます。ダウングレードはサポートされていません。 - 置き換えモード [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED())。注意: 実際のサブスクリプション変更は、現在のサブスクリプションの請求期間が終了した時点でのみ発生します。 ## iOSでオファーコードを利用する \{#redeem-offer-codes-in-ios\}[`AdaptyProfile`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html) オブジェクト。このモデルには、アクセスレベル、サブスクリプション、非サブスクリプション購入に関する情報が含まれています。
**アクセスレベルのステータス**を確認して、ユーザーがアプリにアクセスできるかどうかを判断してください。
| :::tip Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演している[サンプルアプリ](sample-apps)をご覧ください。 ::: --- # File: implement-observer-mode-unity --- --- title: "Unity SDKにオブザーバーモードを実装する" description: "Unity SDKのAdaptyでオブザーバーモードを実装し、ユーザーのサブスクリプションイベントを追跡します。" --- すでに独自の購入インフラを持っており、すぐにAdaptyへ完全移行する準備が整っていない場合は、[オブザーバーモード](observer-vs-full-mode)を検討してみてください。基本的な使い方では、オブザーバーモードは高度なアナリティクスやアトリビューション・アナリティクスシステムとのシームレスな連携を提供します。 この方法で問題なければ、必要な作業は以下の2点だけです: 1. `observerMode` パラメータを `true` に設定して、Adapty SDKの設定時にオブザーバーモードを有効にします。設定手順については[Unity](sdk-installation-unity#activate-adapty-module-of-adapty-sdk)を参照してください。 2. 既存の購入インフラからAdaptyへ[トランザクションを報告する](report-transactions-observer-mode-unity)。 ### オブザーバーモードのセットアップ \{#observer-mode-setup\} 購入とサブスクリプションのステータスを自分で管理し、サブスクリプションイベントやアナリティクスの送信にAdaptyを使用する場合は、オブザーバーモードを有効にしてください。 :::important オブザーバーモードで動作している場合、Adapty SDKはトランザクションをクローズしません。そのため、必ずご自身でトランザクションを処理するようにしてください。 ::: ```csharp showLineNumbers title="C#" using UnityEngine; using AdaptySDK; public class AdaptyListener : MonoBehaviour, AdaptyEventListener { void Start() { DontDestroyOnLoad(this.gameObject); Adapty.SetEventListener(this); var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY") .SetObserverMode(true); // Enable observer mode Adapty.Activate(builder.Build(), (error) => { if (error != null) { // handle the error return; } }); } public void OnLoadLatestProfile(AdaptyProfile profile) { } public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { } public void OnInstallationDetailsFail(AdaptyError error) { } } ``` パラメータ: | パラメータ | 説明 | |--------------|------------------------------------------------------------------------------------------------------------| | observerMode | [オブザーバーモード](observer-vs-full-mode)を制御するブール値です。デフォルト値は `false` です。 | ## オブザーバーモードでAdaptyのペイウォールを使用する \{#using-adapty-paywalls-in-observer-mode\} Adaptyのペイウォールやアナリティクス機能も使いたい場合は可能ですが、オブザーバーモードでは追加のセットアップが必要です。上記の手順に加えて、以下の対応が必要になります: 1. [リモートコンフィグのペイウォール](present-remote-config-paywalls-unity)と同様にペイウォールを表示する。 3. 購入トランザクションに[ペイウォールを関連付ける](report-transactions-observer-mode-unity)。 --- # File: report-transactions-observer-mode-unity --- --- title: "Unity SDKのObserverモードでトランザクションを報告する" description: "Unity SDKのAdapty Observerモードで購入トランザクションを報告し、ユーザーインサイトと収益トラッキングを実現します。" ---iOS、StoreKit 1 の場合:[SKPaymentTransaction](https://developer.apple.com/documentation/storekit/skpaymenttransaction) オブジェクト。
iOS、StoreKit 2 の場合:[Transaction](https://developer.apple.com/documentation/storekit/transaction) オブジェクト。
Android の場合:購入の文字列識別子(purchase.getOrderId)。ここで purchase は billing library の [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) クラスのインスタンスです。
| | variationId | 必須 | バリアントの文字列識別子。[AdaptyPaywall](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) オブジェクトの `variationId` プロパティを使用して取得できます。 |phoneNumber
firstName
lastName
| String | | gender | 列挙型。使用可能な値:`female`、`male`、`other` | | birthday | Date | ### カスタムユーザー属性 \{#custom-user-attributes\} 独自のカスタム属性を設定することができます。これらは通常、アプリの利用状況に関連します。たとえば、フィットネスアプリなら週あたりの運動回数、語学学習アプリならユーザーの習熟度レベルなどが考えられます。カスタム属性はセグメントに活用してターゲットを絞ったペイウォールやオファーを作成したり、収益に最も影響するプロダクト指標を分析したりするのに役立ちます。 ```csharp showLineNumbers try { builder = builder.SetCustomStringAttribute("string_key", "string_value"); builder = builder.SetCustomDoubleAttribute("double_key", 123.0f); } catch (Exception e) { // handle the exception } ``` 既存のキーを削除するには、`.withRemoved(customAttributeForKey:)`メソッドを使用します: ```csharp showLineNumbers try { builder = builder.RemoveCustomAttribute("key_to_remove"); } catch (Exception e) { // handle the exception } ``` 事前にどのようなカスタム属性が設定されているか確認したい場合は、`AdaptyProfile`オブジェクトの`customAttributes`フィールドを使用してください。 :::warning `customAttributes`の値は最新でない場合があります。ユーザー属性は異なるデバイスからいつでも送信される可能性があるため、最後の同期以降にサーバー上の属性が変更されていることがあります。 ::: ### 制限事項 \{#limits\} - ユーザーあたり最大30個のカスタム属性 - キー名は最大30文字。キー名に使用できる文字は英数字および`_`、`-`、`.`です - 値は文字列または浮動小数点数で、50文字以内 --- # File: unity-listen-subscription-changes --- --- title: "Unity SDKでサブスクリプションステータスを確認する" description: "UnityアプリでAdaptyを使ってユーザーのサブスクリプションステータスを追跡・管理し、顧客維持率を向上させましょう。" --- Adaptyを使えば、サブスクリプションステータスの管理が簡単になります。プロダクトIDをコードに直接記述する必要はありません。アクティブな[アクセスレベル](access-level)を確認するだけで、ユーザーのサブスクリプションステータスを簡単に把握できます。[AdaptyProfile](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html)オブジェクト。通常は、ユーザーがプレミアムアクセスを持っているかどうかを判断するために、プロファイルのアクセスレベルのステータスだけを確認すれば十分です。
`.getProfile`メソッドは常にAPIへの問い合わせを試みるため、最新の情報を返します。何らかの理由(例:インターネット接続なし)でAdapty SDKがサーバーから情報を取得できなかった場合は、キャッシュのデータが返されます。また、Adapty SDKは`AdaptyProfile`のキャッシュを定期的に更新し、情報をできる限り最新の状態に保っています。
| `.getProfile()`メソッドはユーザープロファイルを返し、そこからアクセスレベルのステータスを取得できます。アプリごとに複数のアクセスレベルを設定することも可能です。たとえば、新聞アプリでさまざまなトピックへのサブスクリプションを独立して販売する場合、「sports」と「science」というアクセスレベルを作成できます。ただし、多くの場合はアクセスレベルは1つで十分であり、その場合はデフォルトの「premium」アクセスレベルを使うだけで問題ありません。 デフォルトの「premium」アクセスレベルを確認する例を示します。 ```csharp showLineNumbers Adapty.GetProfile((profile, error) => { if (error != null) { // handle the error return; } // "premium" is an identifier of default access level var accessLevel = profile.AccessLevels["premium"]; if (accessLevel != null && accessLevel.IsActive) { // grant access to premium features } }); ``` ### サブスクリプションステータスの更新をリッスンする \{#listening-for-subscription-status-updates\} ユーザーのサブスクリプションが変更されるたびに、Adaptyはイベントを発火します。 Adaptyからメッセージを受け取るには、追加の設定が必要です。 ```csharp showLineNumbers // Extend `AdaptyEventListener ` with `OnLoadLatestProfile ` method: public class AdaptyListener : MonoBehaviour, AdaptyEventListener { public void OnLoadLatestProfile(AdaptyProfile profile) { // handle any changes to subscription state } } ``` Adaptyはアプリケーション起動時にもイベントを発火します。この場合、キャッシュされたサブスクリプションステータスが渡されます。 ### サブスクリプションステータスのキャッシュ \{#subscription-status-cache\} Adapty SDKに実装されたキャッシュは、プロファイルのサブスクリプションステータスを保存します。そのため、サーバーにアクセスできない状況でも、キャッシュされたデータを使ってプロファイルのサブスクリプションステータスを確認できます。 ただし、キャッシュからデータを直接取得することはできない点に注意してください。SDKは1分ごとに定期的にサーバーへ問い合わせを行い、プロファイルに関する更新や変更がないかを確認します。新しいトランザクションやその他の更新といった変更があった場合は、サーバーと同期するためにキャッシュデータへ反映されます。 --- # File: unity-deal-with-att --- --- title: "Unity SDKでATTを処理する" description: "UnityでAdaptyを使い始めて、サブスクリプションのセットアップと管理を効率化しましょう。" --- アプリでAppTrackingTransparencyフレームワークを使用しており、ユーザーにアプリトラッキングの認証リクエストを表示する場合は、[認証ステータス](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/)をAdaptyに送信する必要があります。 ```csharp showLineNumbers var builder = new Adapty.ProfileParameters.Builder() .SetAppTrackingTransparencyStatus(IOSAppTrackingTransparencyStatus.Authorized); Adapty.UpdateProfile(builder.Build(), (error) => { if(error != null) { // handle the error } }); ``` :::warning この値は変更されたタイミングでできるだけ早く送信することを強く推奨します。そうすることで、設定済みのインテグレーションにタイムリーにデータが送信されます。 ::: --- # File: kids-mode-unity --- --- title: "Unity SDKのキッズモード" description: "キッズモードを簡単に有効化してAppleとGoogleのポリシーに準拠。Unity SDKではIDFA、GAID、広告データは収集されません。" --- Unityアプリが子ども向けである場合、[Apple](https://developer.apple.com/kids/)および[Google](https://support.google.com/googleplay/android-developer/answer/9893335)のポリシーに従う必要があります。Adapty SDKを使用している場合、いくつかの簡単な手順でこれらのポリシーに準拠し、アプリストアの審査を通過できるよう設定できます。 ## 何が必要ですか? \{#whats-required\} 以下の収集を無効にするようAdapty SDKを設定する必要があります。 - [IDFA(広告識別子)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers)(iOS) - [Android広告ID(AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248)(Android) - [IPアドレス](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) また、カスタマーユーザーIDの取り扱いには注意が必要です。`任意
デフォルト: `en`
|オンボーディングのローカライゼーション識別子。このパラメーターは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語を表し、2番目は地域を表します。
例:`en` は英語、`pt-br` はブラジルのポルトガル語を表します。
ロケールコードと推奨する使用方法については、[ローカライゼーションとロケールコード](flutter-localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、このオプションを推奨します。
ただし、ユーザーが不安定なインターネット環境にいると思われる場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータ(存在する場合)を返すことを検討してください。この場合、ユーザーは最新のデータを取得できないことがありますが、インターネット接続の状態に関わらず、より速い読み込み時間を体験できます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても安全です。
キャッシュはアプリの再起動後も保持され、アプリのアンインストール時または手動でクリアした場合にのみ消去されます。
Adapty SDK はオンボーディングをローカルに2層で保存します:上記の定期的に更新されるキャッシュとフォールバックオンボーディングです。また、オンボーディングをより速く取得するためにCDNを使用し、CDNが到達不能な場合のスタンドアローンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な場合でも、常に最新バージョンのオンボーディングを取得できるよう設計されています。
| | **loadTimeout** | デフォルト: 5秒 |このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルフォールバックが返されます。
このメソッドは内部で複数のリクエストで構成される場合があるため、まれに `loadTimeout` で指定した時間より若干遅れてタイムアウトすることがあります。
| レスポンスパラメーター: | パラメーター | 説明 | |:----------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | オンボーディングの識別子と設定、リモートコンフィグ、その他いくつかのプロパティを含む [`AdaptyOnboarding`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_onboarding.html) オブジェクト。 | オンボーディングを取得したら、`CreateOnboardingView` メソッドを呼び出します。 :::warning `CreateOnboardingView` メソッドの結果は一度しか使用できません。再度使用する必要がある場合は、`CreateOnboardingView` メソッドを再度呼び出してください。再作成せずに2回呼び出すと、`AdaptyUIError.viewAlreadyPresented` エラーが発生する可能性があります。 ::: ```csharp showLineNumbers AdaptyUI.CreateOnboardingView(onboarding, (view, error) => { // handle the result }); ``` パラメーター: | パラメーター | 必須 | 説明 | |:---------------| :------------- |:-----------------------------------------------------------------------------| | **onboarding** | 必須 | 目的のオンボーディングのビューを取得するための `AdaptyOnboarding` オブジェクト。 | | **externalUrlsPresentation** |任意
デフォルト: `InAppBrowser`
|オンボーディング内のリンクを開く方法を制御します。使用可能なオプション:
- `AdaptyWebPresentation.InAppBrowser` - リンクをアプリ内ブラウザで開く(デフォルト)
- `AdaptyWebPresentation.ExternalBrowser` - リンクをデバイスの外部ブラウザで開く
使用例については、[オンボーディングでのリンクの開き方をカスタマイズする](unity-present-onboardings#customize-how-links-open-in-onboardings)を参照してください。
| オンボーディングとそのビュー設定の読み込みに成功したら、[モバイルアプリで表示する](unity-present-onboardings)ことができます。 ## デフォルトオーディエンスのオンボーディングでフェッチを高速化する \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} 通常、オンボーディングはほぼ即座に取得されるため、このプロセスの高速化を心配する必要はありません。ただし、オーディエンスやオンボーディングが多数あり、ユーザーのインターネット接続が弱い場合、オンボーディングの取得に予想以上の時間がかかることがあります。そのような状況では、オンボーディングをまったく表示しないよりも、スムーズなユーザー体験を確保するためにデフォルトのオンボーディングを表示したい場合があります。 これに対処するために、`GetOnboardingForDefaultAudience` メソッドを使用できます。このメソッドは、**All Users** オーディエンス向けの指定されたプレースメントのオンボーディングを取得します。ただし、上記の[オンボーディングの取得とビューの作成](#fetch-onboarding-and-create-view)セクションで説明した `getOnboarding` メソッドでオンボーディングを取得することが推奨されるアプローチであることを理解することが重要です。 :::warning `GetOnboardingForDefaultAudience` の代わりに `GetOnboarding` の使用を検討してください。前者には重要な制限があります: - **互換性の問題**:複数のアプリバージョンをサポートする際に問題が生じる可能性があり、後方互換性のあるデザインを作成するか、古いバージョンで正しく表示されないことを許容する必要があります。 - **パーソナライゼーションなし**:「All Users」オーディエンス向けのコンテンツのみを表示し、国、アトリビューション、またはカスタム属性に基づくターゲティングが行われません。 ユースケースでこれらのデメリットよりも高速な取得が重要な場合は、以下に示すように `GetOnboardingForDefaultAudience` を使用してください。そうでない場合は、[上記](#fetch-onboarding-and-create-view)の説明通り `GetOnboarding` を使用してください。 ::: ```csharp showLineNumbers Adapty.GetOnboardingForDefaultAudience("YOUR_PLACEMENT_ID", (onboarding, error) => { if (error != null) { // handle the error return; } // the requested onboarding }); ``` パラメーター: | パラメーター | 必須 | 説明 | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | 必須 | 目的の[プレースメント](placements)の識別子。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 | | **locale** |任意
デフォルト: `en`
|オンボーディングのローカライゼーション識別子。このパラメーターは、マイナス(**-**)文字で区切られた1つまたは2つのサブタグで構成される言語コードを指定します。最初のサブタグは言語を表し、2番目は地域を表します。
例:`en` は英語、`pt-br` はブラジルのポルトガル語を表します。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、このオプションを推奨します。
ただし、ユーザーが不安定なインターネット環境にいると思われる場合は、`.returnCacheDataElseLoad` を使用してキャッシュデータ(存在する場合)を返すことを検討してください。この場合、ユーザーは最新のデータを取得できないことがありますが、インターネット接続の状態に関わらず、より速い読み込み時間を体験できます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても安全です。
キャッシュはアプリの再起動後も保持され、アプリのアンインストール時または手動でクリアした場合にのみ消去されます。
Adapty SDK はオンボーディングをローカルに2層で保存します:上記の定期的に更新されるキャッシュとフォールバックオンボーディングです。また、オンボーディングをより速く取得するためにCDNを使用し、CDNが到達不能な場合のスタンドアローンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な場合でも、常に最新バージョンのオンボーディングを取得できるよう設計されています。
| --- # File: unity-present-onboardings --- --- title: "Unity SDKでオンボーディングを表示する" description: "コンバージョンを高めるためにオンボーディングを効果的に表示する方法を学びましょう。" --- ビルダーでオンボーディングをカスタマイズしている場合、ユーザーに表示するためにUnityアプリのコードでレンダリングを実装する必要はありません。そのようなオンボーディングには、表示する内容と表示方法の両方が含まれています。 始める前に、以下を確認してください。 1. [Adapty Unity SDK](sdk-installation-unity) 3.14.0以降をインストールしていること。 2. [オンボーディングを作成](create-onboarding)していること。 3. オンボーディングを[プレースメント](placements)に追加していること。 オンボーディングを表示するには、`CreateOnboardingView`メソッドで作成した`view`に対して`view.Present()`メソッドを使用します。各`view`は一度しか使用できません。再度ペイウォールを表示する必要がある場合は、`CreateOnboardingView`をもう一度呼び出して新しい`view`インスタンスを作成してください。 :::warning `view`を再作成せずに再利用すると、`AdaptyUIError.viewAlreadyPresented`エラーが発生する可能性があります。 ::: ```csharp showLineNumbers title="Unity" view.Present((presentError) => { if (presentError != null) { // handle the error } }; ``` ## iOS表示スタイルの設定 \{#configure-ios-presentation-style\} `Present()`メソッドに`iosPresentationStyle`パラメーターを渡すことで、iOSでのオンボーディングの表示方法を設定できます。パラメーターには`AdaptyUIIOSPresentationStyle.FullScreen`(デフォルト)または`AdaptyUIIOSPresentationStyle.PageSheet`を指定できます。 ```csharp showLineNumbers title="Unity" view.Present(AdaptyUIIOSPresentationStyle.PageSheet, (error) => { // handle the error }); ``` ## オンボーディングでのリンクの開き方をカスタマイズする \{#customize-how-links-open-in-onboardings\} :::important オンボーディングでのリンクの開き方のカスタマイズは、Adapty SDK v3.15以降でサポートされています。 ::: デフォルトでは、オンボーディング内のリンクはアプリ内ブラウザで開かれ、アプリを切り替えることなくウェブページをアプリ内で表示できるシームレスな体験を提供します。 代わりに外部ブラウザでリンクを開くには、`CreateOnboardingView`メソッドに`AdaptyWebPresentation.ExternalBrowser`を渡してください。 ```csharp showLineNumbers title="Unity" AdaptyUI.CreateOnboardingView( onboarding, AdaptyWebPresentation.ExternalBrowser, // default — InAppBrowser (view, error) => { if (error != null) { // handle the error return; } // present the onboarding view view.Present((presentError) => { if (presentError != null) { // handle the error } }); } ); ``` 利用可能なオプション: - `AdaptyWebPresentation.InAppBrowser` - アプリ内ブラウザでリンクを開く(デフォルト) - `AdaptyWebPresentation.ExternalBrowser` - デバイスの外部ブラウザでリンクを開く --- # File: unity-handling-onboarding-events --- --- title: "Unity SDKでオンボーディングイベントを処理する" description: "Adaptyを使ってUnityでオンボーディング関連のイベントを処理します。" --- 始める前に、以下を確認してください: 1. [Adapty Unity SDK](sdk-installation-unity) 3.14.0以降をインストール済みであること。 2. [オンボーディングを作成済み](create-onboarding)であること。 3. オンボーディングを[プレースメント](placements)に追加済みであること。 ビルダーで設定されたオンボーディングは、アプリが反応できるイベントを生成します。これらのイベントへの対応方法を以下で説明します。 Unityアプリ内のオンボーディング画面で発生するプロセスを制御・監視するには、`AdaptyOnboardingsEventsListener`インターフェースを実装してください。 ## カスタムアクション \{#custom-actions\} ビルダーでは、ボタンに**カスタム**アクションを追加してIDを割り当てることができます。
このIDをコード内で使用し、カスタムアクションとして処理できます。たとえば、ユーザーが**ログイン**や**通知を許可**などのカスタムボタンをタップすると、`OnboardingViewOnCustomAction`メソッドが呼び出され、`actionId`パラメーターにビルダーで設定した**アクションID**が渡されます。"allowNotifications"のような独自のIDを作成できます。
オンボーディングイベントを処理するには、`AdaptyOnboardingsEventsListener`インターフェースを実装してください:
```csharp showLineNumbers title="Unity"
public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener
{
void Start()
{
Adapty.SetOnboardingsEventsListener(this);
}
public void OnboardingViewOnCustomAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
string actionId
)
{
if (actionId == "allowNotifications") {
// request notification permissions
}
}
public void OnboardingViewDidFailWithError(
AdaptyUIOnboardingView view,
AdaptyError error
)
{
// handle errors
}
// Implement other required interface methods (see examples below)
}
```
:::important
ユーザーがオンボーディングを閉じたときの動作を自分で管理する必要があります。たとえば、オンボーディング自体の表示を停止する処理が必要です。
:::
クラスに`OnboardingViewOnCloseAction`メソッドを実装してください:
```csharp showLineNumbers title="Unity"
public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener
{
public void OnboardingViewOnCloseAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
string actionId
)
{
view.Dismiss((error) => {
if (error != null) {
// handle the error
}
});
}
// ... other interface methods
}
```
2. サブスクリプショングループ名をクリックすると、**Subscriptions** セクションにプロダクトの一覧が表示されます。
3. テストしているプロダクトが **Ready to Submit** としてマークされていることを確認します。
4. 表内のプロダクトIDと、Adapty ダッシュボードの [**Products**](https://app.adapty.io/products) タブに表示されているIDを比較します。IDが一致しない場合は、表からプロダクトIDをコピーし、Adapty ダッシュボードで[プロダクトを作成](create-product)してください。
## ステップ3. プロダクトの提供地域を確認する \{#step-4-check-product-availability\}
1. **App Store Connect** に戻り、同じ **Subscriptions** セクションを開きます。
2. サブスクリプショングループ名をクリックしてプロダクトを表示します。
3. テストしているプロダクトを選択します。
4. **Availability** セクションまでスクロールし、必要なすべての国・地域が一覧に含まれていることを確認します。
## ステップ4. プロダクトの価格を確認する \{#step-5-check-product-prices\}
1. **App Store Connect** の **Monetization** → **Subscriptions** セクションに移動します。
2. サブスクリプショングループ名をクリックします。
3. テストしているプロダクトを選択します。
4. **Subscription Pricing** までスクロールし、**Current Pricing for New Subscribers** セクションを展開します。
5. 必要なすべての価格が一覧に表示されていることを確認します。
## ステップ5. アプリの有料ステータス、銀行口座、税務フォームが有効であることを確認する \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. [**App Store Connect**](https://appstoreconnect.apple.com/) のホームページで **Business** をクリックします。
2. 会社名を選択します。
3. 下にスクロールし、**Paid Apps Agreement**、**Bank Account**、**Tax forms** がすべて **Active** になっていることを確認します。
これらの手順を実行することで、`InvalidProductIdentifiers` の警告を解消し、プロダクトをストアで有効にできるはずです。
## ステップ6. 問題が解消しない場合はプロダクトを再作成する \{#step-6-recreate-the-product-if-its-stuck\}
ステップ1〜5をすべてパスしている場合(`Approved` ステータス、バンドルIDの一致、有効なAPIキー)でも、SDKが `1000 noProductIDsFound` を返し続けることがあります。この場合、プロダクトがAppleのレジストリでスタックしている可能性があります。App Store ConnectのUIにはプロダクトが存在するものの、StoreKitのルックアップパスに公開されていない状態になることがあります。
App Store Connectでプロダクトを削除し、同じプロダクトIDで再作成してください。再作成後、反映されるまで最大24時間かかる場合があります。
---
# File: cantMakePayments-unity
---
---
title: "Unity SDK における Code-1003 cantMakePayment エラーの修正"
description: "Adapty でサブスクリプションを管理する際に発生する決済エラーを解決します。"
---
1003エラー(`cantMakePayments`)は、このデバイスでアプリ内課金ができないことを示しています。
`cantMakePayments`エラーが発生している場合、通常は以下のいずれかの原因が考えられます:
- デバイスの制限:このエラーはAdaptyとは無関係です。以下の解決方法を参照してください。
- オブザーバーモードの設定:`makePurchase`メソッドとオブザーバーモードは同時に使用できません。以下のセクションを参照してください。
## 問題:デバイスの制限 \{#issue-device-restrictions\}
| 問題 | 解決方法 |
|-----------------------------|---------------------------------------------------------|
| スクリーンタイムの制限 | [スクリーンタイム](https://support.apple.com/en-us/102470)でアプリ内課金の制限を無効にする |
| アカウントの停止 | Appleサポートに連絡してアカウントの問題を解決する |
| 地域の制限 | 対応地域のApp Storeアカウントを使用する |
## 問題:オブザーバーモードとmakePurchaseの併用 \{#issue-using-both-observer-mode-and-makepurchase\}
購入処理に`makePurchase`を使用している場合、オブザーバーモードを使用する必要はありません。[オブザーバーモード](observer-vs-full-mode)が必要なのは、購入ロジックを自分で実装する場合のみです。
したがって、`makePurchase`を使用している場合は、SDK有効化コードからオブザーバーモードの有効化を安全に削除できます。
---
# File: migration-to-unity-sdk-314
---
---
title: "Adapty Unity SDK を v3.14 へ移行する"
description: "より高いパフォーマンスと新しいマネタイズ機能のために Adapty Unity SDK v3.14 へ移行します。"
---
Adapty SDK 3.14.0 はメジャーリリースであり、いくつかの改善が含まれています。ただし、以下の移行手順が必要になる場合があります。
1. ペイウォールイベント用の専用イベントリスナーの分離。
2. `AdaptyUI.CreateView` を `AdaptyUI.CreatePaywallView` およびその関連メソッドにリネーム。
3. `MakePurchase` メソッドで個別パラメーターの代わりに `AdaptyPurchaseParameters` を使用するよう更新。
4. `SetFallbackPaywalls` を `SetFallback` メソッドに置き換え。
5. `AdaptyPlacement` を使用してペイウォールプロパティにアクセスするよう更新。
6. `AdaptyRemoteConfig` オブジェクトを使用してリモートコンフィグにアクセスするよう更新。
7. `AdaptyPaywall` モデルの `VendorProductIds` を `ProductIdentifiers` に置き換え。
8. `GetPaywall` のフェッチポリシーで `AdaptyFetchPolicy` を使用するよう更新。
## ペイウォールイベント用の専用イベントリスナーの分離 \{#separate-event-listener-for-paywall-events\}
[ペイウォールビルダー](adapty-paywall-builder)でデザインしたペイウォールを表示する場合、ペイウォールビューのイベントは専用の `AdaptyPaywallsEventsListener` インターフェースと `SetPaywallsEventsListener` メソッドを使用するようになりました。コアの `AdaptyEventListener` インターフェースは、プロファイル更新とインストール詳細のために引き続き使用されます。
```diff showLineNumbers
using UnityEngine;
using AdaptySDK;
public class AdaptyListener : MonoBehaviour,
- AdaptyEventListener {
+ AdaptyEventListener,
+ AdaptyPaywallsEventsListener {
void Start() {
Adapty.SetEventListener(this);
+ Adapty.SetPaywallsEventsListener(this);
}
// AdaptyEventListener methods
public void OnLoadLatestProfile(AdaptyProfile profile) { }
public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { }
public void OnInstallationDetailsFail(AdaptyError error) { }
+ // AdaptyPaywallsEventsListener methods
+ // Implement paywall event handlers here
}
```
[ペイウォールイベントの処理について詳しく見る](unity-handling-events)。
## ビュー作成・表示メソッドのリネーム \{#rename-view-creation-and-presentation-methods\}
ビューの作成と表示に使用するメソッドがリネームされました。
```diff showLineNumbers
using AdaptySDK;
- AdaptyUI.CreateView(paywall, parameters, (view, error) => {
+ AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
if (error != null) {
// handle the error
return;
}
- AdaptyUI.PresentView(view, (error) => {
+ AdaptyUI.PresentPaywallView(view, (error) => {
// handle the error
});
});
}
```
同様に、閉じるメソッドもリネームされました。
```diff showLineNumbers
- AdaptyUI.DismissView(view, (error) => {
+ AdaptyUI.DismissPaywallView(view, (error) => {
// handle the error
});
```
## MakePurchase メソッドの更新 \{#update-makepurchase-method\}
`MakePurchase` メソッドは、個別の `subscriptionUpdateParams` および `isOfferPersonalized` 引数の代わりに `AdaptyPurchaseParameters` を使用するようになりました。これにより型安全性が向上し、将来的な購入パラメーターの拡張にも対応しやすくなります。
```diff showLineNumbers
using AdaptySDK;
void MakePurchase(
AdaptyPaywallProduct product,
AdaptySubscriptionUpdateParameters subscriptionUpdate,
bool? isOfferPersonalized
) {
- Adapty.MakePurchase(product, subscriptionUpdate, isOfferPersonalized, (result, error) => {
+ var parameters = new AdaptyPurchaseParametersBuilder()
+ .SetSubscriptionUpdateParams(subscriptionUpdate)
+ .SetIsOfferPersonalized(isOfferPersonalized)
+ .Build();
+
+ Adapty.MakePurchase(product, parameters, (result, error) => {
switch (result.Type) {
case AdaptyPurchaseResultType.Pending:
// handle pending purchase
break;
case AdaptyPurchaseResultType.UserCancelled:
// handle purchase cancellation
break;
case AdaptyPurchaseResultType.Success:
var profile = result.Profile;
// handle successful purchase
break;
default:
break;
}
});
}
```
追加パラメーターが不要な場合は、次のように簡単に記述できます。
```csharp showLineNumbers
using AdaptySDK;
void MakePurchase(AdaptyPaywallProduct product) {
Adapty.MakePurchase(product, (result, error) => {
// handle purchase result
});
}
```
## フォールバックメソッドの更新 \{#update-fallback-method\}
:::important
Unity SDK 3.14 にアップグレードする際は、Adapty ダッシュボードから新しいフォールバックファイルをダウンロードし、プロジェクト内の既存ファイルと置き換える必要があります。
:::
フォールバックを設定するメソッドが更新されました。`SetFallbackPaywalls` メソッドは `SetFallback` にリネームされました。
```diff showLineNumbers
using AdaptySDK;
void SetFallBackPaywalls() {
#if UNITY_IOS
var assetId = "adapty_fallback_ios.json";
#elif UNITY_ANDROID
var assetId = "adapty_fallback_android.json";
#else
var assetId = "";
#endif
- Adapty.SetFallbackPaywalls(assetId, (error) => {
+ Adapty.SetFallback(assetId, (error) => {
// handle the error
});
}
```
最終的なコード例は [Unity でフォールバックペイウォールを使用する](unity-use-fallback-paywalls) のページをご覧ください。
## ペイウォールプロパティアクセスの更新 \{#update-paywall-property-access\}
以下のプロパティが `AdaptyPaywall` から `AdaptyPlacement` に移動されました。
```diff showLineNumbers
using AdaptySDK;
void ProcessPaywall(AdaptyPaywall paywall) {
- var abTestName = paywall.ABTestName;
- var audienceName = paywall.AudienceName;
- var revision = paywall.Revision;
- var placementId = paywall.PlacementId;
+ var abTestName = paywall.Placement.ABTestName;
+ var audienceName = paywall.Placement.AudienceName;
+ var revision = paywall.Placement.Revision;
+ var placementId = paywall.Placement.Id;
}
```
## リモートコンフィグアクセスの更新 \{#update-remote-config-access\}
リモートコンフィグのプロパティが `AdaptyRemoteConfig` オブジェクトに再構成され、より整理された形になりました。
```diff showLineNumbers
using AdaptySDK;
void ProcessRemoteConfig(AdaptyPaywall paywall) {
- var remoteConfigString = paywall.RemoteConfigString;
- var locale = paywall.Locale;
- var remoteConfigDict = paywall.RemoteConfig;
+ var remoteConfigString = paywall.RemoteConfig.Data;
+ var locale = paywall.RemoteConfig.Locale;
+ var remoteConfigDict = paywall.RemoteConfig.Dictionary;
}
```
## AdaptyPaywall モデルの使用方法の更新 \{#update-adapty-paywall-model-usage\}
`VendorProductIds` プロパティは非推奨となり、`ProductIdentifiers` に置き換えられました。新しいプロパティは単純な文字列ではなく `AdaptyProductIdentifier` オブジェクトを返すため、プロダクト情報がより構造化されています。
```diff showLineNumbers
using AdaptySDK;
void ProcessPaywallProducts(AdaptyPaywall paywall) {
- var productIds = paywall.VendorProductIds;
- foreach (var vendorId in productIds) {
- // use vendorId
- }
+ var productIdentifiers = paywall.ProductIdentifiers;
+ foreach (var productId in productIdentifiers) {
+ var vendorId = productId.VendorProductId;
+ // use vendorId
+ }
}
```
`AdaptyProductIdentifier` オブジェクトは `VendorProductId` プロパティを通じてベンダープロダクト ID にアクセスでき、従来と同じ機能を維持しつつ、将来の拡張に向けてより良い構造を提供します。
## GetPaywall フェッチポリシーの更新 \{#update-getpaywall-fetch-policy\}
`GetPaywall` メソッドの `fetchPolicy` パラメーターの型が `AdaptyPaywallFetchPolicy` から `AdaptyPlacementFetchPolicy` に変更されました。この変更により、SDK 全体でフェッチポリシーの使用が統一されます。
```diff showLineNumbers
using AdaptySDK;
void GetPaywall(string placementId) {
- Adapty.GetPaywall(placementId, AdaptyPaywallFetchPolicy.ReloadRevalidatingCacheData, null, (paywall, error) => {
+ Adapty.GetPaywall(placementId, AdaptyPlacementFetchPolicy.ReloadRevalidatingCacheData, null, (paywall, error) => {
// handle the result
});
}
```
---
# File: migration-to-unity-sdk-34
---
---
title: "Adapty Unity SDK を v3.4 へ移行する"
description: "Adapty Unity SDK v3.4 に移行して、パフォーマンス向上と新しいマネタイゼーション機能をご活用ください。"
---
Adapty SDK 3.4.0 はメジャーリリースであり、お客様側での移行手順が必要な改善が含まれています。
## フォールバックペイウォールファイルの更新 \{#update-fallback-paywall-files\}
新しい SDK バージョンとの互換性を確保するため、フォールバックペイウォールファイルを更新してください。
1. Adapty ダッシュボードから[更新済みのフォールバックペイウォールファイルをダウンロード](fallback-paywalls)します。
2. モバイルアプリ内の既存のフォールバックペイウォールを[新しいファイルに置き換えます](unity-use-fallback-paywalls)。
## オブザーバーモードの実装を更新する \{#update-implementation-of-observer-mode\}
オブザーバーモードを使用している場合は、その実装を必ず更新してください。
以前は、トランザクションを Adapty に報告するために異なるメソッドが使用されていました。新しいバージョンでは、Android と iOS の両方で `reportTransaction` メソッドを一貫して使用する必要があります。このメソッドは各トランザクションを Adapty に明示的に報告し、認識されることを保証します。ペイウォールを使用した場合は、トランザクションをそのペイウォールに紐付けるためにバリエーション ID を渡してください。
:::warning
**トランザクションの報告をスキップしないでください!**
`reportTransaction` を呼び出さないと、Adapty はトランザクションを認識できず、アナリティクスに表示されず、インテグレーションにも送信されません。
:::
```diff showLineNumbers
- #if UNITY_ANDROID && !UNITY_EDITOR
- Adapty.RestorePurchases((profile, error) => {
- // handle the error
- });
- #endif
Adapty.ReportTransaction(
"YOUR_TRANSACTION_ID",
"PAYWALL_VARIATION_ID", // optional
(error) => {
// handle the error
});
```
---
# File: migration-to-unity330
---
---
title: "Adapty Unity SDK を v3.3 へ移行する"
description: "パフォーマンス向上と新しいマネタイズ機能のために Adapty Unity SDK v3.3.3 へ移行する方法を説明します。"
---
Adapty SDK 3.3.0 はメジャーリリースであり、いくつかの改善が含まれていますが、移行作業が必要な場合があります。
1. Adapty SDK v3.3.x へアップグレードする。
2. Adapty SDK の Adapty モジュールおよび AdaptyUI モジュールで、複数のクラス・プロパティ・メソッドの名前が変更されました。
3. `SetLogLevel` メソッドがコールバックを引数として受け取るようになりました。
4. `PresentCodeRedemptionSheet` メソッドがコールバックを引数として受け取るようになりました。
5. ペイウォールビューの作成方法を変更する。
6. `GetProductsIntroductoryOfferEligibility` メソッドを削除する。
7. フォールバックペイウォールをプラットフォームごとに別々のファイル(各プラットフォーム1ファイル)として `Assets/StreamingAssets/` に保存し、そのファイル名を `SetFallbackPaywalls` メソッドに渡す。
8. 購入処理を更新する。
9. ペイウォールビルダーのイベント処理を更新する。
10. ペイウォールビルダーのペイウォールエラー処理を更新する。
11. Adjust、Amplitude、AppMetrica、Appsflyer、Branch、Firebase および Google Analytics、Mixpanel、OneSignal、Pushwoosh のインテグレーション設定を更新する。
13. Observer モードの実装を更新する。
14. 明示的な `Activate` 呼び出しで Unity プラグインの初期化を更新する。
## Adapty Unity SDK を 3.3.x へアップグレードする \{#upgrade-adapty-unity-sdk-to-33x\}
このバージョンまでは、Adapty SDK がアプリ内で Adapty を正常に動作させるためのコアかつ必須の SDK であり、AdaptyUI SDK はペイウォールビルダーを使用する場合にのみ必要なオプションの SDK でした。
バージョン 3.3.0 以降、AdaptyUI SDK は非推奨となり、AdaptyUI は Adapty SDK のモジュールとして統合されました。この変更により、AdaptyUISDK を削除し、AdaptySDK を再インストールする必要があります。
1. プロジェクトから **AdaptySDK** と **AdaptyUISDK** の両方のパッケージ依存関係を削除する。
2. **AdaptySDK** フォルダーと **AdaptyUISDK** フォルダーを削除する。
3. [Adapty SDK installation & configuration for Unity](sdk-installation-unity) ページの説明に従って、AdaptySDK パッケージを再度インポートする。
## 名前変更 \{#renamings\}
1. Adapty モジュールでの名前変更:
| 旧バージョン | 新バージョン |
| ------------------------- | ------------------------ |
| Adapty.sdkVersion | Adapty.SDKVersion |
| Adapty.LogLevel | AdaptyLogLevel |
| Adapty.Paywall | AdaptyPaywall |
| Adapty.PaywallFetchPolicy | AdaptyPaywallFetchPolicy |
| PaywallProduct | AdaptyPaywallProduct |
| Adapty.Profile | AdaptyProfile |
| Adapty.ProfileParameters | AdaptyProfileParameters |
| ProfileGender | AdaptyProfileGender |
| Error | AdaptyError |
2. AdaptyUI モジュールでの名前変更:
| 旧バージョン | 新バージョン |
| ------------------ | ------------------ |
| CreatePaywallView | CreateView |
| PresentPaywallView | PresentView |
| DismissPaywallView | DismissView |
| AdaptyUI.View | AdaptyUIView |
| AdaptyUI.Action | AdaptyUIUserAction |
## SetLogLevel メソッドの変更 \{#change-the-setloglevel-method\}
`SetLogLevel` メソッドがコールバックを引数として受け取るようになりました。
```diff showLineNumbers
- Adapty.SetLogLevel(Adapty.LogLevel.Verbose);
+ Adapty.SetLogLevel(Adapty.LogLevel.Verbose, null); // or you can pass the callback to handle the possible error
```
## PresentCodeRedemptionSheet メソッドの変更 \{#change-the-presentcoderedemptionsheet-method\}
`PresentCodeRedemptionSheet` メソッドがコールバックを引数として受け取るようになりました。
```diff showLineNumbers
- Adapty.PresentCodeRedemptionSheet();
+ Adapty.PresentCodeRedemptionSheet(null); // or you can pass the callback to handle the possible error
```
## ペイウォールビューの作成方法を変更する \{#change-how-the-paywall-view-is-created\}
完全なコード例については、[ペイウォールビルダーで作成したペイウォールのビュー設定を取得する](unity-get-pb-paywalls#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder) を参照してください。
```diff showLineNumbers
+ var parameters = new AdaptyUICreateViewParameters()
+ .SetPreloadProducts(true);
- AdaptyUI.CreatePaywallView(
+ AdaptyUI.CreateView(
paywall,
- preloadProducts: true,
+ parameters,
(view, error) => {
// use the view
});
```
## GetProductsIntroductoryOfferEligibility メソッドの削除 \{#remove-the-getproductsintroductoryoffereligibility-method\}
Adapty iOS SDK 3.3.0 より前は、ユーザーが対象かどうかに関わらず、プロダクトオブジェクトには常にオファーが含まれていました。そのため、オファーを使用する前に手動で対象確認を行う必要がありました。
現在は、ユーザーが対象である場合にのみプロダクトオブジェクトにオファーが含まれます。つまり、対象確認は不要になりました — オファーが存在する場合、そのユーザーは対象です。
## フォールバックペイウォールの提供方法を更新する \{#update-method-for-providing-fallback-paywalls\}
このバージョンまでは、フォールバックペイウォールはシリアライズされた JSON として渡されていました。v 3.3.0 以降、仕組みが変更されました。
1. フォールバックペイウォールを `/Assets/StreamingAssets/` 内のファイルに保存する(Android 用に 1 ファイル、iOS 用に 1 ファイル)。
2. ファイル名を `SetFallbackPaywalls` メソッドに渡す。
コードの変更は次のようになります。
```diff showLineNumbers
using AdaptySDK;
void SetFallBackPaywalls() {
+ #if UNITY_IOS
+ var assetId = "adapty_fallback_ios.json";
+ #elif UNITY_ANDROID
+ var assetId = "adapty_fallback_android.json";
+ #else
+ var assetId = "";
+ #endif
- Adapty.SetFallbackPaywalls("FALLBACK_PAYWALLS_JSON_STRING", (error) => {
+ Adapty.SetFallbackPaywalls(assetId, (error) => {
// handle the error
});
}
```
最終的なコード例は [Unity でフォールバックペイウォールを使用する](unity-use-fallback-paywalls) ページを参照してください。
## 購入処理の更新 \{#update-making-purchase\}
以前は、キャンセルされた購入と保留中の購入はエラーとして扱われ、それぞれ `PaymentCancelled` と `PendingPurchase` コードが返されていました。
新しい `AdaptyPurchaseResultType` クラスを使用して、キャンセル済み・成功・保留中の購入を処理します。購入コードを次のように更新してください。
```diff showLineNumbers
using AdaptySDK;
void MakePurchase(AdaptyPaywallProduct product) {
- Adapty.MakePurchase(product, (profile, error) => {
- // handle successfull purchase
+ Adapty.MakePurchase(product, (result, error) => {
+ switch (result.Type) {
+ case AdaptyPurchaseResultType.Pending:
+ // handle pending purchase
+ break;
+ case AdaptyPurchaseResultType.UserCancelled:
+ // handle purchase cancellation
+ break;
+ case AdaptyPurchaseResultType.Success:
+ var profile = result.Profile;
+ // handle successful purchase
+ break;
+ default:
+ break;
}
});
}
```
最終的なコード例は [モバイルアプリで購入する](unity-making-purchases) ページを参照してください。
## ペイウォールビルダーのイベント処理を更新する \{#update-handling-of-paywall-builder-events\}
キャンセルされた購入と保留中の購入はエラーとして扱われなくなり、これらのケースはすべて `PaywallViewDidFinishPurchase` メソッドで処理されます。
1. キャンセルされた購入イベントの処理を削除する。
2. 購入成功イベントの処理を次のように更新する。
```diff showLineNumbers
- public void OnFinishPurchase(
- AdaptyUI.View view,
- Adapty.PaywallProduct product,
- Adapty.Profile profile
- ) { }
+ public void PaywallViewDidFinishPurchase(
+ AdaptyUIView view,
+ AdaptyPaywallProduct product,
+ AdaptyPurchaseResult purchasedResult
+ ) { }
```
3. アクションの処理を更新する。
```diff showLineNumbers
- public void OnPerformAction(
- AdaptyUI.View view,
- AdaptyUI.Action action
- ) {
+ public void PaywallViewDidPerformAction(
+ AdaptyUIView view,
+ AdaptyUIUserAction action
+ ) {
switch (action.Type) {
- case AdaptyUI.ActionType.Close:
+ case AdaptyUIUserActionType.Close:
view.Dismiss(null);
break;
- case AdaptyUI.ActionType.OpenUrl:
+ case AdaptyUIUserActionType.OpenUrl:
var urlString = action.Value;
if (urlString != null {
Application.OpenURL(urlString);
}
default:
// handle other events
break;
}
}
```
4. 購入開始の処理を更新する。
```diff showLineNumbers
- public void OnSelectProduct(
- AdaptyUI.View view,
- Adapty.PaywallProduct product
- ) { }
+ public void PaywallViewDidSelectProduct(
+ AdaptyUIView view,
+ string productId
+ ) { }
```
5. 購入失敗の処理を更新する。
```diff showLineNumbers
- public void OnFailPurchase(
- AdaptyUI.View view,
- Adapty.PaywallProduct product,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailPurchase(
+ AdaptyUIView view,
+ AdaptyPaywallProduct product,
+ AdaptyError error
+ ) { }
```
6. リストア成功イベントの処理を更新する。
```diff showLineNumbers
- public void OnFailRestore(
- AdaptyUI.View view,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailRestore(
+ AdaptyUIView view,
+ AdaptyError error
+ ) { }
```
最終的なコード例は [ペイウォールのイベントを処理する](unity-handling-events) ページを参照してください。
## ペイウォールビルダーのペイウォールエラー処理を更新する \{#update-handling-of-paywall-builder-paywall-errors\}
エラーの処理も変更されました。以下のガイダンスに従ってコードを更新してください。
1. プロダクト読み込みエラーの処理を更新する。
```diff showLineNumbers
- public void OnFailLoadingProducts(
- AdaptyUI.View view,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailLoadingProducts(
+ AdaptyUIView view,
+ AdaptyError error
+ ) { }
```
2. レンダリングエラーの処理を更新する。
```diff showLineNumbers
- public void OnFailRendering(
- AdaptyUI.View view,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailRendering(
+ AdaptyUIView view,
+ AdaptyError error
+ ) { }
```
## サードパーティインテグレーション SDK 設定の更新 \{#update-third-party-integration-sdk-configuration\}
Adapty Unity SDK 3.3.0 以降、`updateAttribution` メソッドのパブリック API を更新しました。以前は `[AnyHashable: Any]` ディクショナリを受け取り、さまざまなサービスからアトリビューションオブジェクトを直接渡すことができました。現在は `[String: any Sendable]` が必要なため、渡す前にアトリビューションオブジェクトを変換する必要があります。
Adapty Unity SDK 3.3.0 以降でインテグレーションが正しく機能するよう、以下のセクションに記載されているインテグレーションの SDK 設定を更新してください。
### Adjust
以下のようにモバイルアプリのコードを更新してください。完全なコード例については、[Adjust インテグレーションの SDK 設定](adjust#connect-your-app-to-adjust) を参照してください。
```diff showLineNumbers
- using static AdaptySDK.Adapty;
using AdaptySDK;
Adjust.GetAdid((adid) => {
- Adjust.GetAttribution((attribution) => {
- Dictionary