# REACT-NATIVE - 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.707Z Total files: 45 --- # File: sdk-installation-react-native-expo --- --- title: "Install & configure Adapty React Native SDK in an Expo project" description: "Step-by-step guide on installing Adapty React Native SDK in an Expo project for subscription-based apps." --- :::important このガイドでは、**Expo プロジェクト**への Adapty React Native SDK のインストールと設定について説明します。 **Pure 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 アプリへのアプリ内課金の実装方法について詳しく知りたい場合は、[こちらのチュートリアル](https://adapty.io/blog/react-native-in-app-purchases-tutorial/)をご覧ください。 :::tip Adapty SDKをExpoアプリに統合する実際の例を見てみたいですか?サンプルアプリをご確認ください: - [Expo devビルドサンプル](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ツールを各ステージで適切なドキュメントに沿って案内します。
:::
[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)をご確認ください。