---
title: "React Native SDKでストアメッセージを制御する"
description: "React Nativeアプリで、App StoreやGoogle Playが表示する価格変更・請求問題・支払い拒否などのメッセージを表示するタイミングを制御し、フローやオンボーディングを妨げないようにします。"
---

> **AI agents**: to search Adapty docs faster and with fewer tokens, install the Adapty skills: `npx adapty skills install --yes`

App StoreやGoogle Playでは、サブスクリプションに関するメッセージをユーザーに表示することがあります。

- **App Store**: 価格値上げへの同意リクエスト、請求に関するお知らせ、またはウィンバックオファー。デフォルトでは、アプリが開いている間、StoreKit がこれらのメッセージを自動的に表示します。
- **Google Play**: サブスクリプションの支払いが拒否され、支払い方法の更新が必要であるというお知らせ。デフォルトでは、Adapty SDK はアプリの `Activity` が起動するたびにこれらのメッセージをリクエストします。

いずれの場合も、メッセージはフロー、オンボーディング、またはチェックアウトの上に表示されることがあります。表示のタイミングを自分で制御するには、Adapty SDK を手動メッセージ処理モードに切り替え、ユーザーの操作を妨げないタイミングで `showStoreMessages` を呼び出してください。

:::warning
手動モードでは、ストアが独自にメッセージを表示することはありません。アプリが `showStoreMessages` を一度も呼び出さない場合、ユーザーは価格変更の同意リクエスト、支払い情報の問題に関する通知、または決済失敗の通知を一切受け取れません。
:::

## 始める前に \{#before-you-start\}

以下が必要です：

- **Adapty React Native SDK 4.3.0 以降**：それより古いバージョンにはストアメッセージ API がありません。
- **iOS 16 以降**（App Store メッセージ用）：StoreKit はそれより古いバージョンの iOS ではアプリにメッセージを配信しません。iOS 15 では、`getPendingStoreMessageTypes` と `showStoreMessages` はエラーをスローするため、アプリが iOS 15 をサポートしている場合は、iOS 16 以降でのみこれらを呼び出してください。

## 手動処理を有効にする \{#enable-manual-handling\}

`showStoreMessages` を呼び出したときだけストアのメッセージを表示するには、[SDK を有効化する](sdk-installation-react-native-pure#activate-adapty-module-of-adapty-sdk)際に `storeMessagesHandling` を `'manual'` に設定してください：

```typescript showLineNumbers title="App.tsx"
adapty.activate('YOUR_PUBLIC_SDK_KEY', {
  storeMessagesHandling: 'manual', // 'auto' is the default
});
```

iOSでは、SDKが各App Storeメッセージを現在のアプリセッションの保留リストに追加します。Androidでは、SDKがGoogle Playメッセージの取得を自動的に停止します。デフォルトの`'auto'`値では、SDKはApp Storeメッセージをキャプチャしないため、iOSでは`getPendingStoreMessageTypes`と`showStoreMessages`は返すものも表示するものもありません。

## 保留中のメッセージタイプを取得する \{#get-pending-message-types\}

iOS では、App Store のメッセージが待機中かどうかを確認するには、`getPendingStoreMessageTypes` を呼び出します。保留中のメッセージのタイプを、表示も削除もせずに返します:

```typescript showLineNumbers
const pendingTypes = await adapty.getPendingStoreMessageTypes();

if (pendingTypes === null) {
  // Android: Google Play decides whether a message applies when you show it
} else if (pendingTypes.includes('billing_issue')) {
  // For example, skip the upsell and show the billing message first
}
```

Androidでは、このメソッドは`null`を返します。Google Playは保留中のメッセージを報告せず、アプリがリクエストしたときにのみそのメッセージが適用されるかどうかを判断します。空の配列は、iOS上で保留中のメッセージがないことを意味します。

各App Storeメッセージには、次のいずれかのタイプがあります：

| タイプ | メッセージ |
|:-----|:--------|
| `generic` | App Storeの一般的なメッセージ。 |
| `price_increase_consent` | サブスクリプションの値上げへの同意リクエスト。 |
| `billing_issue` | サブスクリプションの請求に関する通知。iOS 16.4以降で利用可能。 |
| `win_back_offer` | 対象となる[ウィンバックオファー](app-store-offers#win-back-offers)。iOS 18以降で利用可能。 |

SDKが認識できないメッセージタイプの値は `storekit_<number>` となります。

## メッセージの表示 \{#show-messages\}

ユーザーの操作を妨げないタイミング（フローを閉じた後やオンボーディングが完了した後など）で、`showStoreMessages` を呼び出してください：

```typescript showLineNumbers
try {
  await adapty.showStoreMessages();
} catch (error) {
  // handle the error
}
```

- **iOS**: SDKは保留中のメッセージを順番に表示します。StoreKitがメッセージを表示した後、SDKはそのメッセージを保留リストから削除します。StoreKitがメッセージの表示に失敗した場合、SDKはAdaptyログにエラーを記録し、次回の呼び出しのためにメッセージを保持して、残りのメッセージの処理を続けます。
- **Android**: SDKは現在の`Activity`に対してGoogle Playのメッセージをリクエストします。Google Playがメッセージをそのユーザーに適用するかどうかを判断するため、リクエストしても必ずしもメッセージが表示されるわけではありません。ユーザーがメッセージから支払い方法を修正した場合、SDKはユーザーの購入情報をAdaptyと同期し、[プロファイルリスナー](react-native-listen-subscription-changes)が更新されたアクセスレベルを受け取ります。

デフォルトの `'auto'` モードでは、Android で `showStoreMessages` を呼び出すこともできます。たとえば、すでに実行中の `Activity` でメッセージを再リクエストする場合などに使用します。

### 特定のメッセージタイプのみを表示する \{#show-only-some-message-types\}

保留中の App Store メッセージの一部のみを表示するには、`ios.filter` にタイプを指定します。指定しなかったメッセージは保留状態のまま残ります：

```typescript showLineNumbers
await adapty.showStoreMessages({
  ios: { filter: ['billing_issue', 'price_increase_consent'] },
});
```

`filter` を指定しない場合、SDK は認識できないタイプも含めて保留中のすべてのメッセージを表示します。Android は `filter` を無視し、すべての Google Play メッセージをリクエストします。

### エラー \{#errors\}

`showStoreMessages` は以下のコードのいずれかを持つ [`AdaptyError`](react-native-handle-errors) をスローします：

| コード | 名前 | 原因 |
|:-----|:-----|:------|
| 3201 | `operationInProgress` | 別の `showStoreMessages` の呼び出しがまだメッセージを表示中です。完了するまで待ってから再試行してください。 |
| 3202 | `resolverFailure` | iOS のみ：SDK がメッセージを表示するためのフォアグラウンドのアクティブなウィンドウシーンを見つけられませんでした。アプリがフォアグラウンドにある状態でメソッドを再度呼び出してください。 |