# REACT-NATIVE - Adapty Documentation (Full Content) This file contains the complete content of all documentation pages for this platform. Locale: ja Generated on: 2026-06-24T14:36:28.585Z Total files: 44 --- # File: sdk-installation-react-native-expo --- --- title: "ExpoプロジェクトにAdapty React Native SDKをインストール・設定する" description: "サブスクリプションアプリ向けに、ExpoプロジェクトでAdapty React Native SDKをインストールするステップバイステップガイド。" --- :::important このガイドは、**ExpoプロジェクトへのAdapty React Native SDKのインストールと設定**を説明します。 **純粋なReact Native(Expoなし)**を使用している場合は、代わりに[React Nativeインストールガイド](sdk-installation-react-native-pure)をご覧ください。 ::: Adapty SDKには、React Nativeアプリへのシームレスな統合に必要な2つの主要モジュールが含まれています: - **Core Adapty**:アプリでAdaptyを正しく動作させるために必要なモジュールです。 - **AdaptyUI**:クロスプラットフォームのペイウォールを簡単に作成できるノーコードツール[Adapty ペイウォールビルダー](adapty-paywall-builder)を使用する場合に必要なモジュールです。AdaptyUIはコアモジュールと同時に自動的に有効化されます。 React NativeアプリでIAPを実装する方法の完全なチュートリアルが必要な場合は、[こちら](https://adapty.io/blog/react-native-in-app-purchases-tutorial/)をご覧ください。 :::tip Adapty SDKがExpoアプリにどのように統合されているかの実際の例を見たい方は、サンプルアプリをご確認ください: - [Expo dev buildサンプル](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/FocusJournalExpo):実際の購入やペイウォールビルダーを含む全機能向け - [Expo Go & Webサンプル](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/ExpoGoWebMock):モックモードでのテスト向け ::: 完全な実装ウォークスルーは、以下の動画でも確認できます:
### ログイン/サインアップ時 \{#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ツールを各ステージで適切なドキュメントに沿って案内します。
:::
---
no_index: true
---
[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 またはその他のツール**: リポジトリをクローンし、`plugins/adapty-sdk-integration/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)を参照してください。
任意
デフォルト: `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 に到達できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が不安定な場合でも信頼性を確保しながら、常に最新バージョンのペイウォールを取得できるように設計されています。
| | **loadTimeoutMs** | デフォルト: 5秒 |このメソッドのタイムアウトを制限する値です。タイムアウトに達した場合、キャッシュされたデータまたはローカルフォールバックが返されます。
内部的に複数のリクエストで構成される場合があるため、まれに `loadTimeout` で指定した時間よりも少し遅くタイムアウトすることがあります。
Android の場合:拡張関数(例:`5.seconds`、`.seconds` は `import com.adapty.utils.seconds` からインポート)または `TimeInterval.seconds(5)` を使用して `TimeInterval` を作成できます。制限なしにするには、`TimeInterval.INFINITE` を使用します。
| レスポンスパラメーター: | パラメーター | 説明 | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 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` メソッドの結果は1回のみ使用できます。再度使用する必要がある場合は、`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** オーディエンス向けに指定されたプレースメントのペイウォールを取得します。ただし、推奨されるアプローチは、上記の[ペイウォール情報の取得](#fetch-paywall-designed-with-paywall-builder)セクションで説明したように `getPaywall` メソッドでペイウォールを取得することを理解しておくことが重要です。 :::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\} ペイウォール内の画像や動画をカスタマイズするには、カスタムアセットを実装します。 ヒーロー画像とヒーロー動画には定義済みのID(`hero_image` と `hero_video`)があります。カスタムアセットバンドルでは、これらの 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倍になっている。
**原因**: コード内で `logShowPaywall` を呼び出している可能性があります。ペイウォールビルダーを使用している場合、このメソッドを呼び出すと表示回数が重複します。ペイウォールビルダーでデザインされたペイウォールは、アナリティクスが自動的に計測されるため、このメソッドを使用する必要はありません。
**解決策**: ペイウォールビルダーを使用している場合は、コード内で `logShowPaywall` を呼び出していないことを確認してください。
## その他の問題 \{#other-issues\}
**問題**: 上記以外のペイウォールビルダー関連の問題が発生している。
**解決策**: 必要に応じて[マイグレーションガイド](react-native-sdk-migration-guides)を参照し、SDK を最新バージョンに移行してください。新しいバージョンでは多くの問題が修正されています。
---
# File: react-native-quickstart-manual
---
---
title: "React Native SDKのカスタムペイウォールで購入を有効にする"
description: "Adapty SDKをReact Nativeのカスタムペイウォールに統合して、アプリ内課金を有効にします。"
---
このガイドでは、Adaptyをカスタムペイウォールに統合する方法を説明します。ペイウォールの実装を完全にコントロールしながら、Adapty SDKがプロダクトの取得、新規購入の処理、過去の購入の復元を行います。
:::important
**このガイドはカスタムペイウォールを実装する開発者向けです。** 最も簡単に購入を有効にしたい場合は、[ペイウォールビルダー](react-native-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は匿名ユーザーと識別済みユーザーを異なる方法で処理します。詳細を把握し、ユーザーを適切に扱うために、[識別クイックスタートガイド](react-native-quickstart-identify)をお読みください。
## ステップ1. プロダクトを取得する \{#step-1-get-products\}
カスタムペイウォール用のプロダクトを取得するには、次の手順を実行します:
1. `getPaywall`メソッドに[プレースメント](placements)IDを渡して`paywall`オブジェクトを取得する。
2. `getPaywallProducts`メソッドを使用して、このペイウォールのプロダクト配列を取得する。
```typescript showLineNumbers
async function loadPaywall() {
try {
const paywall: AdaptyPaywall = await adapty.getPaywall('YOUR_PLACEMENT_ID');
const products: AdaptyPaywallProduct[] = await adapty.getPaywallProducts(paywall);
// 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\}
---
no_index: true
---
import Callout from '../../../components/Callout.astro';
任意
デフォルト: `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)オブジェクトのプロパティにアクセスする必要があります。以下によく使用されるプロパティを示しますが、利用可能なすべてのプロパティの詳細についてはリンク先のドキュメントを参照してください。 | プロパティ | 説明 | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **タイトル** | プロダクトのタイトルを表示するには、`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`はブラジルポルトガル語を表します。
ロケールコードの詳細と推奨される使用方法については、[ローカライズとロケールコード](react-native-localizations-and-locale-codes)を参照してください。
| | **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` |デフォルトでは、SDKはサーバーからデータを読み込もうとし、失敗した場合はキャッシュデータを返します。ユーザーが常に最新のデータを取得できるため、この設定を推奨します。
ただし、ユーザーが不安定なインターネット環境にいると想定される場合は、`.returnCacheDataElseLoad`を使用してキャッシュデータが存在すれば返すことを検討してください。この場合、最新データが取得できないこともありますが、接続状況に関わらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても安全です。
キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップ時のみ削除されます。
| --- # File: present-remote-config-paywalls-react-native --- --- title: "React Native SDKでリモートコンフィグによるペイウォールをレンダリングする" description: "Adapty React Native SDKでリモートコンフィグのペイウォールを表示し、ユーザー体験をパーソナライズする方法をご覧ください。" --- リモートコンフィグを使ってペイウォールをカスタマイズした場合、ユーザーに表示するためのレンダリング処理をモバイルアプリのコードに実装する必要があります。リモートコンフィグはニーズに合わせた柔軟性を提供するため、ペイウォールに何を含めるか、またどのように表示するかはあなた次第です。リモートコンフィグから取得したカスタムペイウォールを表示できるよう、リモートコンフィグを取得するメソッドを提供しています。 ## ペイウォールのリモートコンフィグを取得して表示する \{#get-paywall-remote-config-and-present-it\} ペイウォールのリモートコンフィグを取得するには、`remoteConfig` プロパティにアクセスして必要な値を取り出します。 ```typescript showLineNumbers try { const paywall = await adapty.getPaywall({ placementId: "YOUR_PLACEMENT_ID" }); const headerText = paywall.remoteConfig?.data?.["header_text"]; } catch (error) { // handle the error } ``` 必要な値をすべて取得したら、それらをレンダリングして見栄えの良いページに組み立てましょう。さまざまなスマートフォンの画面サイズや向きに対応したデザインにすることで、デバイスを問わずシームレスで使いやすい体験を提供できます。 :::warning AdaptyアナリティクスがファネルやみA/B テストのデータを正確に収集できるよう、以下で説明する[ペイウォール表示イベントの記録](present-remote-config-paywalls-react-native#track-paywall-view-events)を必ず行ってください。 ::: ペイウォールの表示が完了したら、購入フローの設定に進みます。ユーザーが購入を行う際は、ペイウォールのプロダクトを使って `.makePurchase()` を呼び出すだけです。`.makePurchase()` メソッドの詳細については、[購入の実装](react-native-making-purchases)をご覧ください。 インターネット接続がない場合やキャッシュが利用できない場合でもスムーズな体験を確保するため、[フォールバックペイウォールの作成](react-native-use-fallback-paywalls)をおすすめします。 ## ペイウォール表示イベントを記録する \{#track-paywall-view-events\} Adaptyはペイウォールのパフォーマンス測定をサポートしています。購入データは自動的に収集されますが、ペイウォールの表示ログはお客様側で記録する必要があります。ペイウォールをいつ表示するかを把握しているのはあなただけだからです。 ペイウォール表示イベントをログに記録するには、`.logShowPaywall(paywall)` を呼び出すだけです。これにより、ファネルやA/B テストのペイウォール指標に反映されます。 :::important [ペイウォールビルダー](adapty-paywall-builder)で作成したペイウォールを表示する場合、`.logShowPaywall(paywall)` の呼び出しは不要です。 ::: ```typescript showLineNumbers await adapty.logShowPaywall(paywall); ``` リクエストパラメータ: | パラメータ | 必須 | 説明 | | :---------- | :------- |:--------------------------------------------------------------------------------------------| | **paywall** | 必須 | [`AdaptyPaywall`](https://react-native.adapty.io/interfaces/adaptypaywall) オブジェクト。 | --- # File: react-native-making-purchases --- --- title: "React Native 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)を使用していますか?** 購入は自動的に処理されます。このステップはスキップできます。 **ステップバイステップのガイドをお探しですか?** フルコンテキストのエンドツーエンド実装手順については、[クイックスタートガイド](react-native-implement-paywalls-manually)をご覧ください。 ::: ```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 } ``` リクエストパラメーター: | パラメーター | 必須 | 説明 | | :---------- | :------- |:-------------------------------------------------------------------------------------------------------------------------------| | **Product** | 必須 | ペイウォールから取得した [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) オブジェクト。 | レスポンスパラメーター: | パラメーター | 説明 | |---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Profile** |リクエストが成功した場合、このオブジェクトがレスポンスに含まれます。[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\} --- no_index: true --- import Callout from '../../../components/Callout.astro';[`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 を使用している場合、いくつかの簡単な手順でこれらのポリシーに準拠するよう設定し、アプリストアの審査を通過できます。 ## 必要な設定 \{#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層で保存します:上記の定期更新キャッシュとフォールバックオンボーディングです。また、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**オーディエンス向けオンボーディングを取得します。ただし、上記の[オンボーディングの取得](#fetch-onboarding)セクションで説明した`getOnboarding`メソッドを使用することが推奨アプローチであることを理解することが重要です。 :::warning `getOnboardingForDefaultAudience`の代わりに`getOnboarding`の使用を検討してください。後者には重要な制限があります: - **互換性の問題**:複数のアプリバージョンをサポートする際に問題が生じる可能性があり、後方互換性のあるデザインが必要になるか、古いバージョンで正しく表示されないことを受け入れる必要があります。 - **パーソナライゼーションなし**:「All Users」オーディエンス向けのコンテンツのみを表示し、国、アトリビューション、カスタム属性に基づくターゲティングができません。 取得速度の向上がこれらのデメリットを上回る場合は、以下に示す`getOnboardingForDefaultAudience`を使用してください。それ以外の場合は、[上記](#fetch-onboarding)の`getOnboarding`を使用してください。 ::: ```typescript showLineNumbers try { const placementId = 'YOUR_PLACEMENT_ID'; const locale = 'en'; const onboarding = await adapty.getOnboardingForDefaultAudience(placementId, locale); // the requested onboarding } catch (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: react-native-present-onboardings --- --- title: "React Native SDKでオンボーディングを表示する" description: "React Nativeでオンボーディングを表示してコンバージョンと収益を向上させる方法を解説します。" --- ペイウォールビルダーを使ってオンボーディングをカスタマイズした場合、モバイルアプリのコード上でレンダリング処理を実装しなくても、ユーザーに表示できます。このようなオンボーディングには、表示する内容と表示方法の両方が含まれています。 始める前に、以下を確認してください: 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をコード内で使用し、カスタムアクションとして処理できます。たとえば、ユーザーが**ログイン**や**通知を許可**などのカスタムボタンをタップすると、ビルダーの**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-react-native-314
---
---
title: "Adapty React Native SDK を v3.14 に移行する"
description: "Adapty React Native SDK v3.14 に移行して、パフォーマンスの向上と新しいマネタイズ機能を活用しましょう。"
---
Adapty React Native SDK 3.14.0 はメジャーリリースであり、以下の対応が必要な変更が含まれています:
- `registerEventHandlers` メソッドが `setEventHandlers` メソッドに置き換えられました。
- `AdaptyOnboardingView` では、イベントハンドラーが `eventHandlers` オブジェクトではなく個別の props として渡されるようになりました。
- UI コンポーネント向けの新しいシンプルなインポート方法が導入されました。
- `logShowOnboarding` メソッドが削除されました。
- React Native の最低バージョンが 0.73.0 に更新されました。
- ペイウォールとオンボーディングの iOS デフォルト表示スタイルがページシートからフルスクリーンに変更されました。
## `registerEventHandlers` を `setEventHandlers` に置き換える \{#replace-registereventhandlers-with-seteventhandlers\}
Adapty ペイウォールビルダーおよびオンボーディングビルダーで使用されていた `registerEventHandlers` メソッドが `setEventHandlers` メソッドに置き換えられました。
Adapty ペイウォールビルダーやオンボーディングビルダーを使用している場合は、アプリのコード内で `registerEventHandlers` を見つけて `setEventHandlers` に置き換えてください。
この変更はメソッドの動作をより明確にするために行われました。ハンドラーは `true`/`false` を返すため、1 つずつ処理されます。1 つのイベントに複数のハンドラーを設定すると、結果の動作が不明確になっていたためです。
`AdaptyOnboardingView` や `AdaptyPaywallView` などの React コンポーネントを使用する場合、自分自身の状態管理でコンポーネントの表示を制御するため、イベントハンドラーから `true`/`false` を返す必要はありません。戻り値が必要なのは、SDK がビューのライフサイクルを管理するモーダル画面表示の場合のみです。
:::important
`setEventHandlers` を複数回呼び出すと、指定したハンドラーが上書きされ、デフォルトおよびそれ以前に設定したハンドラーが置き換えられます。
:::
```diff showLineNumbers
- const unsubscribe = view.registerEventHandlers({
- // your event handlers
- })
const unsubscribe = view.setEventHandlers({
// your event handlers
})
```
## UI コンポーネントのインポートパスを更新する \{#update-import-paths-for-ui-components\}
Adapty SDK 3.14.0 では、UI コンポーネント向けのシンプルなインポート方法が導入されました。`react-native-adapty/dist/ui` からインポートする代わりに、`react-native-adapty` から直接インポートできるようになりました。
新しいインポート方法は標準的な React Native の慣行に沿っており、インポート文がよりシンプルになります。`AdaptyPaywallView` や `AdaptyOnboardingView` などの UI コンポーネントを使用している場合は、以下のようにインポートを更新してください:
```diff showLineNumbers
- import { AdaptyPaywallView } from 'react-native-adapty/dist/ui';
+ import { AdaptyPaywallView } from 'react-native-adapty';
- import { AdaptyOnboardingView } from 'react-native-adapty/dist/ui';
+ import { AdaptyOnboardingView } from 'react-native-adapty';
- import { createPaywallView } from 'react-native-adapty/dist/ui';
+ import { createPaywallView } from 'react-native-adapty';
- import { createOnboardingView } from 'react-native-adapty/dist/ui';
+ import { createOnboardingView } from 'react-native-adapty';
```
:::note
後方互換性のため、旧インポート方法(`react-native-adapty/dist/ui`)は引き続きサポートされています。ただし、一貫性と明確さのために新しいインポート方法の使用を推奨します。
:::
## React コンポーネントのオンボーディングイベントハンドラーを更新する \{#update-onboarding-event-handlers-in-the-react-component\}
オンボーディングのイベントハンドラーが、`AdaptyOnboardingView` の `eventHandlers` オブジェクトの外に移動されました。`AdaptyOnboardingView` を使用してオンボーディングを表示している場合は、イベント処理の構造を更新してください。
:::important
イベントハンドラーの実装方法に注意してください。レンダリングのたびにオブジェクトが再生成されないようにするため、イベントを処理する関数には `useCallback` を使用してください。
:::
```diff showLineNumbers
import React, { useCallback } from 'react';
- import { AdaptyOnboardingView } from 'react-native-adapty/dist/ui';
+ import { AdaptyOnboardingView } from 'react-native-adapty';
+ import type { OnboardingEventHandlers } from 'react-native-adapty';
+
+ function MyOnboarding({ onboarding }) {
+ const onAnalytics = useCallback```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)をご確認ください。