---
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**: Запрос на согласие с повышением цены, уведомление о проблеме с оплатой или win-back offer. По умолчанию StoreKit показывает эти сообщения самостоятельно, пока открыто ваше приложение.
- **Google Play**: Уведомление о том, что платёж по подписке отклонён и необходимо обновить способ оплаты. По умолчанию SDK запрашивает эти сообщения каждый раз, когда запускается `Activity` вашего приложения.

В любом случае сообщение может появиться поверх флоу, онбординга или чекаута. Чтобы выбрать момент самостоятельно, переключите SDK в режим ручной обработки сообщений и вызывайте `showStoreMessages` тогда, когда сообщение не прервёт пользователя.

:::warning
В ручном режиме стор не показывает сообщения самостоятельно. Если ваше приложение никогда не вызывает `showStoreMessages`, пользователи не увидят ни запрос на согласие с повышением цены, ни уведомление о проблеме с оплатой, ни уведомление об отклонённом платеже.
:::

## Перед началом работы \{#before-you-start\}

Вам потребуется:

- **Adapty React Native SDK 4.3.0 или новее**: в более ранних версиях API стор-сообщений недоступно.
- **iOS 16 или новее** для сообщений App Store: StoreKit не доставляет сообщения приложениям на более ранних версиях. На iOS 15 `getPendingStoreMessageTypes` и `showStoreMessages` возвращают ошибку, поэтому если ваше приложение поддерживает iOS 15, вызывайте их только на iOS 16 и новее.

## Включение ручной обработки \{#enable-manual-handling\}

Чтобы сообщения стора отображались только при явном вызове `showStoreMessages` в вашем приложении, установите `storeMessagesHandling` в значение `'manual'` при [активации SDK](sdk-installation-react-native-pure#activate-adapty-module-of-adapty-sdk):

```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` | Подходящий [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 запрашивает сообщения Google Play для текущего `Activity`. Google Play самостоятельно определяет, применимо ли сообщение к пользователю, поэтому запрос не всегда приводит к показу сообщения. Если пользователь исправляет способ оплаты через сообщение, SDK синхронизирует покупки пользователя с Adapty, и ваш [слушатель профиля](react-native-listen-subscription-changes) получает обновлённый уровень доступа.

В режиме `'auto'` по умолчанию вы также можете вызвать `showStoreMessages` на Android — например, чтобы повторно запросить сообщение в `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 не нашёл активного оконного сцены на переднем плане для отображения сообщений. Вызовите метод снова, когда приложение находится на переднем плане. |