# REACT-NATIVE - Adapty Documentation (Full Content) This file contains the complete content of all documentation pages for this platform. Locale: ru Generated on: 2026-07-24T13:01:12.810Z 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 Этот гайд охватывает установку и настройку Adapty SDK для React Native **в проекте Expo**. Если вы используете **чистый React Native (без Expo)**, следуйте [гайду по установке для React Native](sdk-installation-react-native-pure). ::: Adapty SDK включает два ключевых модуля для интеграции в ваше React Native приложение: - **Core Adapty**: Этот модуль необходим для корректной работы Adapty в вашем приложении. - **AdaptyUI**: Этот модуль нужен, если вы используете [Adapty Paywall Builder](adapty-paywall-builder) — удобный инструмент без кода для создания кроссплатформенных пейволов. AdaptyUI активируется автоматически вместе с основным модулем. Если вам нужен полный туториал по реализации встроенных покупок в React Native-приложении, ознакомьтесь с [этим материалом](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) — полная функциональность, включая реальные покупки и Paywall Builder - [Пример Expo Go & Web](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/ExpoGoWebMock) — тестирование в режиме мока ::: Полное пошаговое руководство по реализации также доступно в виде видео:
## Требования \{#requirements\} Adapty React Native SDK требует iOS 15.0+. Для сборки под iOS необходим **Swift 6.0** или более новая версия. [Kids Mode](kids-mode-react-native) требует **Swift 6.1** или более новой версии. :::info Начиная с SDK v3.17, Adapty SDK использует Google Play Billing Library v8.0.0 по умолчанию. ::: :::info Установка SDK — это шаг 5 настройки Adapty. Прежде чем покупки заработают в вашем приложении, вам также нужно подключить приложение к сторам, а затем создать продукты, пейвол и плейсмент в дашборде Adapty. [Гайд по быстрому старту](quickstart) описывает все необходимые шаги. ::: ## Установка Adapty SDK \{#install-adapty-sdk\} :::important Начиная с версии v4, Adapty React Native SDK больше не поддерживает установку нативных зависимостей через CocoaPods. Если вам нужна версия v4 или выше (для [Flow Builder](adapty-flow-builder)), воспользуйтесь инструкцией [Adapty SDK 4.0: подключение Swift Package Manager](#adapty-sdk-40-enable-swift-package-manager) ниже. ::: [![Release](https://img.shields.io/github/v/release/adaptyteam/AdaptySDK-React-Native.svg?style=flat&logo=react)](https://github.com/adaptyteam/AdaptySDK-React-Native/releases) :::important Для использования Adapty в проекте Expo требуется [Expo Dev Client](https://docs.expo.dev/versions/latest/sdk/dev-client/) (кастомная сборка для разработки). Expo Go не поддерживает кастомные нативные модули, поэтому его можно использовать только в [**режиме mock**](#set-up-mock-mode-for-expo-go--expo-web) для разработки UI/логики (без реальных покупок и без рендеринга AdaptyUI/Paywall Builder). ::: 1. Установите Adapty SDK (при этом автоматически устанавливается `@adapty/core`): ```sh npx expo install react-native-adapty npx expo prebuild ``` 2. Соберите приложение для разработки с помощью EAS или локальной сборки: ```sh # For iOS eas build --profile development --platform ios # For Android eas build --profile development --platform android ``` ```sh # For iOS npx expo run:ios # For Android npx expo run:android ``` 3. Запустите dev-сервер: ```sh npx expo start --dev-client ``` ### Adapty SDK 4.0: включение Swift Package Manager \{#adapty-sdk-40-enable-swift-package-manager\} React Native SDK 4.0 — который добавляет поддержку [Flow Builder](adapty-flow-builder) — требует **React Native 0.75 или выше**. Установите SDK: ```sh npx expo install react-native-adapty@^4.0.0 ``` v4 подключает нативные iOS SDK (`Adapty`, `AdaptyUI`, `AdaptyPlugin`) через Swift Package Manager вместо CocoaPods sub-dependencies ([репозиторий спецификаций CocoaPods переходит в режим «только чтение» в декабре 2026 года](https://blog.cocoapods.org/CocoaPods-Specs-Repo/)). SPM требует динамических фреймворков, которые в Expo включаются через плагин [`expo-build-properties`](https://docs.expo.dev/versions/latest/sdk/build-properties/). Добавьте его в `app.json` (или `app.config.js`): ```json showLineNumbers title="app.json" { "expo": { "plugins": [ [ "expo-build-properties", { "ios": { "useFrameworks": "dynamic" } } ] ] } } ``` Затем установите плагин и пересоздайте нативный проект: ```sh npx expo install expo-build-properties npx expo prebuild --clean ``` См. [Миграция Adapty React Native SDK на v4](migration-to-react-native-sdk-v4) для полного руководства по миграции. ## Активация модуля Adapty SDK \{#activate-adapty-module-of-adapty-sdk\} Чтобы получить **Public SDK Key**: 1. Откройте дашборд Adapty и перейдите в [**App settings → General**](https://app.adapty.io/settings/general). 2. В разделе **Api keys** скопируйте **Public SDK Key** (НЕ Secret Key). 3. Замените `"YOUR_PUBLIC_SDK_KEY"` в коде. Или получите его программно с помощью [Adapty CLI](developer-cli): ``` npm install -g adapty adapty auth login adapty apps list ``` Или напрямую: ``` npx adapty auth login adapty apps list ``` - Убедитесь, что для инициализации Adapty вы используете **Public SDK key** — **Secret key** предназначен только для [серверного API](getting-started-with-server-side-api). - **SDK-ключи** уникальны для каждого приложения, поэтому если у вас несколько приложений, выберите нужный ключ. Скопируйте следующий код в `App.tsx`, чтобы активировать Adapty: ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY'); ``` :::important Дождитесь завершения `activate`, прежде чем вызывать другие методы Adapty SDK. Полная последовательность описана в разделе [Порядок вызовов в React Native SDK](react-native-sdk-call-order). ::: Теперь настройте пейволы в вашем приложении: - Если вы используете [Adapty Paywall Builder](adapty-paywall-builder), следуйте [быстрому старту для Paywall Builder](react-native-quickstart-paywalls). - Если вы создаёте собственный интерфейс пейвола, см. [быстрый старт для кастомных пейволов](react-native-quickstart-manual). :::tip Чтобы избежать ошибок активации в среде разработки, воспользуйтесь [советами](#development-environment-tips). ::: ## Активация модуля AdaptyUI в SDK Adapty \{#activate-adaptyui-module-of-adapty-sdk\} Если вы планируете использовать [Paywall Builder](adapty-paywall-builder), вам понадобится модуль AdaptyUI. Он активируется автоматически вместе с основным модулем — никаких дополнительных действий не требуется. ## Дополнительная настройка \{#optional-setup\} ### Логирование \{#logging\} #### Настройка системы логирования \{#set-up-the-logging-system\} Adapty записывает ошибки и другую важную информацию, чтобы вы понимали, что происходит. Доступны следующие уровни логирования: | Level | Description | | ---------- | ------------------------------------------------------------ | | `error` | Будут записываться только ошибки | | `warn` | Будут записываться ошибки и сообщения от SDK, которые не вызывают критических ошибок, но заслуживают внимания | | `info` | Будут записываться ошибки, предупреждения и различные информационные сообщения | | `verbose` | Будет записываться любая дополнительная информация, которая может быть полезна при отладке: вызовы функций, API-запросы и т. д. | Вы можете задать уровень логирования до или во время инициализации Adapty: ```typescript showLineNumbers title="App.tsx" // Set log level before activation // 'verbose' is recommended for development and the first production release adapty.setLogLevel('verbose'); // Or set it during configuration adapty.activate('YOUR_PUBLIC_SDK_KEY', { logLevel: 'verbose', }); ``` ### Политики обработки данных \{#data-policies\} Adapty не хранит персональные данные пользователей, если вы явно их не передаёте. При необходимости можно настроить дополнительные политики безопасности данных для соответствия требованиям стора или законодательства конкретной страны. #### Отключение сбора и передачи IP-адресов \{#disable-ip-address-collection-and-sharing\} При активации модуля Adapty установите `ipAddressCollectionDisabled` в значение `true`, чтобы отключить сбор и передачу IP-адресов пользователей. Значение по умолчанию — `false`. Используйте этот параметр для защиты конфиденциальности пользователей, соблюдения региональных законов о защите данных (например, GDPR или CCPA) или сокращения избыточного сбора данных в случаях, когда функции на основе IP-адреса вашему приложению не нужны. ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { ipAddressCollectionDisabled: true, }); ``` #### Отключение сбора и передачи рекламного идентификатора \{#disable-advertising-id-collection-and-sharing\} При активации модуля Adapty установите `ios.idfaCollectionDisabled` (iOS) или `android.adIdCollectionDisabled` (Android) в значение `true`, чтобы отключить сбор рекламных идентификаторов. Значение по умолчанию — `false`. Используйте этот параметр для соответствия требованиям App Store/Play Store, чтобы не вызывать запрос App Tracking Transparency, или если ваше приложение не требует атрибуции рекламы или аналитики на основе рекламных идентификаторов. ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { ios: { idfaCollectionDisabled: true, }, android: { adIdCollectionDisabled: true, }, }); ``` #### Настройка кэша медиафайлов для AdaptyUI \{#set-up-media-cache-configuration-for-adaptyui\} По умолчанию AdaptyUI кэширует медиафайлы (например, изображения и видео), чтобы повысить производительность и сократить использование сети. Вы можете настроить параметры кэша, передав собственную конфигурацию. Используйте `mediaCache`, чтобы переопределить настройки кэша по умолчанию: ```typescript adapty.activate('YOUR_PUBLIC_SDK_KEY', { mediaCache: { memoryStorageTotalCostLimit: 200 * 1024 * 1024, // Optional: memory cache size in bytes memoryStorageCountLimit: 2147483647, // Optional: max number of items in memory diskStorageSizeLimit: 200 * 1024 * 1024, // Optional: disk cache size in bytes }, }); ``` | Параметр | Обязательный | Описание | |-----------|----------|-------------| | memoryStorageTotalCostLimit | необязательный | Общий размер кэша в памяти в байтах. По умолчанию используется значение, зависящее от платформы. | | memoryStorageCountLimit | необязательный | Максимальное количество элементов в кэше в памяти. По умолчанию используется значение, зависящее от платформы. | | diskStorageSizeLimit | необязательный | Максимальный размер файлов на диске в байтах. По умолчанию используется значение, зависящее от платформы. | ### Включите локальные уровни доступа (Android) \{#enable-local-access-levels-android\} По умолчанию [локальные уровни доступа](local-access-levels) включены на iOS и отключены на Android. Чтобы включить их на Android, установите `localAccessLevelAllowed` в `true`: ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { android: { localAccessLevelAllowed: true, }, }); ``` ### Очистка данных при восстановлении из резервной копии \{#clear-data-on-backup-restore\} Если `clearDataOnBackup` установлен в `true`, SDK определяет, что приложение было восстановлено из резервной копии iCloud, и удаляет все локально сохранённые данные SDK, включая кэшированную информацию профиля, сведения о продуктах и пейволы. После этого SDK инициализируется с чистым состоянием. Значение по умолчанию — `false`. :::note Удаляется только локальный кэш SDK. История транзакций в Apple и данные пользователя на серверах Adapty остаются без изменений. ::: ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { ios: { clearDataOnBackup: true }, }); ``` ## Советы по разработке \{#development-environment-tips\} #### Настройка режима заглушки для Expo Go / Expo Web \{#set-up-mock-mode-for-expo-go--expo-web\} В Expo Go и Expo Web нет доступа к нативным модулям Adapty. Чтобы избежать ошибок во время выполнения и при этом иметь возможность собирать и тестировать UI приложения и логику пейвола, Adapty предоставляет **режим заглушки**. ::::important Режим заглушки — это **не** инструмент для тестирования реальных покупок: - Он **не открывает** потоки покупок App Store / Google Play и **не создаёт** реальные транзакции. - Он **не отображает** пейволы/онбординги, созданные с помощью **Adapty Paywall Builder (AdaptyUI)**. - Нативные модули Adapty **полностью обходятся** — даже отсутствующие файлы нативного SDK в сборке Xcode/Android или недействительный API-ключ не вызовут ошибок. Для тестирования реальных покупок и пейволов Paywall Builder используйте Expo Dev Client или production-сборку, в которых режим мока отключён автоматически. :::: **По умолчанию** SDK автоматически определяет среды Expo Go и web и включает режим mock. Никакой дополнительной настройки не требуется — если только вы не хотите изменить mock-данные. Когда активен режим mock: - Все методы Adapty возвращают mock-данные, не отправляя запросы на серверы Adapty. - По умолчанию исходный mock-профиль не имеет активных подписок. - По умолчанию `makePurchase(...)` симулирует успешную покупку и предоставляет премиум-доступ. Вы можете настроить мок-данные с помощью `mockConfig` при активации. Формат конфига и поддерживаемые параметры описаны [здесь](https://react-native.adapty.io/interfaces/adaptymockconfig). ```typescript showLineNumbers title="App.tsx" try { await adapty.activate('YOUR_PUBLIC_SDK_KEY', { mockConfig: { // Customize the initial mock profile (optional) }, }); } catch (error) { console.error('Failed to activate Adapty SDK:', error); } ``` Если вам нужно вызывать методы SDK до активации (например, `isActivated()` или `setLogLevel()`), используйте `enableMock()` перед `activate()`. Если бридж уже инициализирован, этот метод ничего не делает. ```typescript showLineNumbers title="App.tsx" adapty.enableMock(); // Optional: pass mockConfig to customize mock data // Now you can call methods before activation await adapty.activate('YOUR_PUBLIC_SDK_KEY'); ``` #### Отложить активацию SDK в целях разработки \{#delay-sdk-activation-for-development-purposes\} Adapty заранее загружает все необходимые данные пользователя при активации SDK, что обеспечивает быстрый доступ к актуальным данным. Однако в симуляторе iOS это может вызывать проблемы: во время разработки симулятор часто запрашивает аутентификацию. Adapty не может управлять флоу аутентификации StoreKit, но может откладывать запросы SDK на получение свежих данных пользователя. Если включить свойство `__debugDeferActivation`, вызов активации будет удерживаться до следующего обращения к Adapty SDK. Это позволяет избежать лишних запросов аутентификационных данных, если они не нужны. Важно учитывать, что **эта функция предназначена только для разработки** — она не охватывает все возможные пользовательские сценарии. В продакшене не следует откладывать активацию, так как реальные устройства обычно запоминают данные аутентификации и не запрашивают учётные данные повторно. Рекомендуемый подход к использованию: ```typescript showLineNumbers title="Typescript" try { adapty.activate('PUBLIC_SDK_KEY', { __debugDeferActivation: isSimulator(), // 'isSimulator' from any 3rd party library }); } catch (error) { console.error('Failed to activate Adapty SDK:', error); // Handle the error appropriately for your app } ``` #### Устранение ошибок активации SDK при Fast Refresh в React Native \{#troubleshoot-sdk-activation-errors-on-react-natives-fast-refresh\} При разработке с Adapty SDK в React Native вы можете столкнуться с ошибкой: `Adapty can only be activated once. Ensure that the SDK activation call is not made more than once.` Это происходит потому, что функция быстрого обновления (fast refresh) в React Native вызывает несколько обращений к активации во время разработки. Чтобы этого избежать, используйте опцию `__ignoreActivationOnFastRefresh` со значением `__DEV__` (флаг режима разработки в React Native). ```typescript showLineNumbers title="Typescript" try { adapty.activate('PUBLIC_SDK_KEY', { __ignoreActivationOnFastRefresh: __DEV__, }); } catch (error) { console.error('Failed to activate Adapty SDK:', error); // Handle the error appropriately for your app } ``` ## Устранение неполадок \{#troubleshooting\} #### Ошибка минимальной версии iOS \{#minimum-ios-version-error\} При сборке для iOS может появиться ошибка о **минимальной версии iOS** или deployment target. Adapty требует **iOS 15.0+**. Поскольку Expo генерирует iOS-проект (включая `Podfile`) во время выполнения `expo prebuild`, **не редактируйте `Podfile` напрямую**. Вместо этого настройте deployment target через config-плагин `expo-build-properties`. 1. Установите плагин: ```sh npx expo install expo-build-properties ``` 2. Обновите конфигурацию Expo (`app.json` или `app.config.js`), указав iOS deployment target: ``` { "expo": { // ...other Expo config... "plugins": [ [ "expo-build-properties", { "ios": { // Adapty requires iOS 15.0+. "deploymentTarget": "15.0" } } ], ] } } ``` 3. Пересоздайте нативный iOS-проект и выполните сборку: ``` npx expo prebuild --clean npx expo run:ios # или `eas build -p ios` на вашем CI ``` #### Конфликт Android Auto Backup в манифесте \{#android-auto-backup-manifest-conflict\} Когда вы используете Expo с несколькими SDK, которые настраивают Android Auto Backup (например, Adapty, AppsFlyer или expo-secure-store), может возникнуть конфликт при слиянии манифестов. Типичная ошибка выглядит так: `Manifest merger failed : Attribute application@fullBackupContent value=(@xml/secure_store_backup_rules) from AndroidManifest.xml:24:248-306 is also present at [io.adapty:android-sdk:3.12.0] AndroidManifest.xml:9:18-70 value=(@xml/adapty_backup_rules).` Чтобы решить этот конфликт, нужно разрешить плагину Adapty управлять конфигурацией резервного копирования Android. Если в вашем проекте также используется `expo-secure-store`, отключите его собственную настройку резервного копирования, чтобы избежать конфликта. Вот как настроить `app.json`: ```json title="app.json" { "expo": { "plugins": [ ["react-native-adapty", { "replaceAndroidBackupConfig": true }], ["expo-secure-store", { "configureAndroidBackup": false }] ] } } ``` Опция `replaceAndroidBackupConfig` по умолчанию имеет значение `false`. При включении она позволяет плагину Adapty управлять правилами резервного копирования Android. Добавьте `"configureAndroidBackup": false`, если вы используете `expo-secure-store`, чтобы избежать предупреждений — настройка резервного копирования SecureStore теперь будет выполняться через Adapty. :::important Эта настройка учитывает требования к резервному копированию только для Adapty, AppsFlyer и expo-secure-store. Если другие библиотеки в вашем проекте определяют собственные правила резервного копирования, вам нужно настроить их вручную. ::: --- # File: sdk-installation-react-native-pure --- --- title: "Install & configure Adapty SDK in a pure React Native project" description: "Step-by-step guide on installing Adapty SDK on React Native for subscription-based apps." --- :::important Это руководство применимо только к **чистым проектам React Native (без Expo)**. Если вы используете **Expo**, следуйте [инструкции по установке для Expo](sdk-installation-react-native-expo). ::: Adapty SDK включает два ключевых модуля для интеграции в ваше приложение React Native: - **Core Adapty**: Этот модуль необходим для корректной работы Adapty в вашем приложении. - **AdaptyUI**: Этот модуль нужен, если вы используете [Adapty Paywall Builder](adapty-paywall-builder) — удобный no-code инструмент для создания кросс-платформенных пейволов. AdaptyUI активируется автоматически вместе с основным модулем. :::tip Хотите увидеть реальный пример интеграции Adapty SDK в мобильное приложение? Посмотрите наши [примеры приложений](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples) — они демонстрируют полную настройку: отображение пейволов, совершение покупок и другие базовые функции. ::: ## Требования \{#requirements\} Для работы Adapty React Native SDK требуется iOS 15.0+. Для сборки под iOS необходим **Swift 6.0** или новее. [Kids Mode](kids-mode-react-native) требует **Swift 6.1** или новее. :::info Начиная с SDK v3.17, Adapty SDK использует Google Play Billing Library v8.0.0 по умолчанию. ::: :::info Установка SDK — это шаг 5 настройки Adapty. Прежде чем покупки заработают в вашем приложении, вам также нужно подключить приложение к сторам, а затем создать продукты, пейвол и плейсмент в дашборде Adapty. [Гайд по быстрому старту](quickstart) описывает все необходимые шаги. ::: ## Установка Adapty SDK \{#install-adapty-sdk\} :::important Начиная с v4, Adapty React Native SDK больше не поддерживает установку нативных зависимостей через CocoaPods. Если вам нужна v4 или более поздняя версия (для [Flow Builder](adapty-flow-builder)), воспользуйтесь инструкцией [Adapty SDK 4.0: enable Swift Package Manager](#adapty-sdk-40-enable-swift-package-manager) ниже. ::: [![Release](https://img.shields.io/github/v/release/adaptyteam/AdaptySDK-React-Native.svg?style=flat&logo=react)](https://github.com/adaptyteam/AdaptySDK-React-Native/releases) 1. Установите Adapty SDK (это также автоматически установит `@adapty/core`): ```sh showLineNumbers title="Shell" # using npm npm install react-native-adapty # or using yarn yarn add react-native-adapty ``` 2. Для iOS установите поды: ```sh showLineNumbers title="Shell" cd ios && pod install ```
Для Android, если ваша версия React Native ниже 0.73.0 (нажмите для раскрытия) Обновите файл `/android/build.gradle`. Убедитесь, что присутствует зависимость `kotlin-gradle-plugin:1.8.0` или более новая: ```groovy showLineNumbers title="/android/build.gradle" ... buildscript { ... dependencies { ... classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0" } } ... ```
### Adapty SDK 4.0: включите Swift Package Manager \{#adapty-sdk-40-enable-swift-package-manager\} React Native SDK 4.0 — который добавляет поддержку [Flow Builder](adapty-flow-builder) — требует **React Native 0.75 или новее**. Установите SDK: ```sh showLineNumbers title="Shell" npm install react-native-adapty@^4.0.0 # or using yarn yarn add react-native-adapty@^4.0.0 ``` v4 подключает нативные iOS SDK (`Adapty`, `AdaptyUI`, `AdaptyPlugin`) через Swift Package Manager вместо зависимостей CocoaPods ([спецификации CocoaPods переходят в режим только чтения в декабре 2026](https://blog.cocoapods.org/CocoaPods-Specs-Repo/)). SPM требует динамических фреймворков — добавьте следующее в таргет вашего `ios/Podfile`, затем переустановите поды: ```ruby showLineNumbers title="ios/Podfile" use_frameworks! :linkage => :dynamic ``` ```sh showLineNumbers title="Shell" cd ios && pod install --repo-update ``` Если ранее вы подключали `Adapty`, `AdaptyUI` или `AdaptyPlugin` как CocoaPods sub-dependencies, сначала удалите все явные строки `pod 'Adapty'`, `pod 'AdaptyUI'` или `pod 'AdaptyPlugin'` из вашего `Podfile`. :::warning Переход со статической линковки по умолчанию на динамические фреймворки может конфликтовать с библиотеками, которые ещё не поддерживают modular headers, а также несовместим с Flipper. Подробнее см. в разделе [Миграция React Native SDK Adapty на v4](migration-to-react-native-sdk-v4). ::: ## Активация модуля Adapty в SDK \{#activate-adapty-module-of-adapty-sdk\} Чтобы получить **Public SDK Key**: 1. Откройте дашборд Adapty и перейдите в [**App settings → General**](https://app.adapty.io/settings/general). 2. В разделе **Api keys** скопируйте **Public SDK Key** (НЕ Secret Key). 3. Замените `"YOUR_PUBLIC_SDK_KEY"` в коде. Или получите его программно с помощью [Adapty CLI](developer-cli): ``` npm install -g adapty adapty auth login adapty apps list ``` Или напрямую: ``` npx adapty auth login adapty apps list ``` - Убедитесь, что для инициализации Adapty вы используете **Public SDK key** — **Secret key** предназначен только для [серверного API](getting-started-with-server-side-api). - **SDK-ключи** уникальны для каждого приложения, поэтому если у вас несколько приложений, выберите нужный ключ. Скопируйте следующий код в `App.tsx`, чтобы активировать Adapty: ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY'); ``` :::important Дождитесь завершения `activate` перед вызовом любых других методов SDK. Подробная последовательность — в статье [Порядок вызовов в React Native SDK](react-native-sdk-call-order). ::: Теперь настройте пейволы в вашем приложении: - Если вы используете [Adapty Paywall Builder](adapty-paywall-builder), следуйте [быстрому старту с Paywall Builder](react-native-quickstart-paywalls). - Если вы создаёте собственный интерфейс пейвола, см. [быстрый старт для кастомных пейволов](react-native-quickstart-manual). :::tip Чтобы избежать ошибок активации в среде разработки, воспользуйтесь [советами](#development-environment-tips). ::: ## Активация модуля AdaptyUI в Adapty SDK \{#activate-adaptyui-module-of-adapty-sdk\} Если вы планируете использовать [Paywall Builder](adapty-paywall-builder), вам понадобится модуль AdaptyUI. Он активируется автоматически вместе с основным модулем — никаких дополнительных действий не требуется. ## Дополнительная настройка \{#optional-setup\} ### Логирование \{#logging\} #### Настройка системы логирования \{#set-up-the-logging-system\} Adapty записывает ошибки и другую важную информацию, чтобы вы понимали, что происходит. Доступны следующие уровни логирования: | Level | Description | | ---------- | ------------------------------------------------------------ | | `error` | Будут записываться только ошибки | | `warn` | Будут записываться ошибки и сообщения от SDK, которые не вызывают критических сбоев, но заслуживают внимания | | `info` | Будут записываться ошибки, предупреждения и различные информационные сообщения | | `verbose` | Будет записываться любая дополнительная информация, которая может быть полезна при отладке: вызовы функций, запросы к API и т. д. | Вы можете задать уровень логирования в приложении до или во время конфигурации Adapty: ```typescript showLineNumbers title="App.tsx" // Set log level before activation // 'verbose' is recommended for development and the first production release adapty.setLogLevel('verbose'); // Or set it during configuration adapty.activate('YOUR_PUBLIC_SDK_KEY', { logLevel: 'verbose', }); ``` ### Политики данных \{#data-policies\} Adapty не хранит личные данные пользователей, если вы явно их не передаёте. Однако вы можете настроить дополнительные политики безопасности данных для соответствия требованиям стора или законодательству конкретной страны. #### Отключение сбора и передачи IP-адресов \{#disable-ip-address-collection-and-sharing\} При активации модуля Adapty установите `ipAddressCollectionDisabled` в значение `true`, чтобы отключить сбор и передачу IP-адресов пользователей. Значение по умолчанию — `false`. Используйте этот параметр для защиты конфиденциальности пользователей, соблюдения региональных требований законодательства о защите данных (например, GDPR или CCPA), а также для сокращения избыточного сбора данных, когда функции на основе IP-адреса не нужны в вашем приложении. ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { ipAddressCollectionDisabled: true, }); ``` #### Отключить сбор и передачу рекламного идентификатора \{#disable-advertising-id-collection-and-sharing\} При активации модуля Adapty установите `ios.idfaCollectionDisabled` (iOS) или `android.adIdCollectionDisabled` (Android) в значение `true`, чтобы отключить сбор рекламных идентификаторов. Значение по умолчанию — `false`. Используйте этот параметр для соблюдения требований App Store/Play Store, чтобы не вызывать запрос App Tracking Transparency, или если ваше приложение не использует атрибуцию рекламы или аналитику на основе рекламных идентификаторов. ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { ios: { idfaCollectionDisabled: true, }, android: { adIdCollectionDisabled: true, }, }); ``` #### Настройте конфигурацию медиакеша для AdaptyUI \{#set-up-media-cache-configuration-for-adaptyui\} По умолчанию AdaptyUI кэширует медиафайлы (изображения и видео) для повышения производительности и снижения сетевой нагрузки. Вы можете настроить параметры кеширования, передав собственную конфигурацию. Используйте `mediaCache`, чтобы переопределить настройки кеша по умолчанию: ```typescript adapty.activate('YOUR_PUBLIC_SDK_KEY', { mediaCache: { memoryStorageTotalCostLimit: 200 * 1024 * 1024, // Optional: memory cache size in bytes memoryStorageCountLimit: 2147483647, // Optional: max number of items in memory diskStorageSizeLimit: 200 * 1024 * 1024, // Optional: disk cache size in bytes }, }); ``` | Параметр | Обязателен | Описание | |-----------|----------|-------------| | memoryStorageTotalCostLimit | нет | Общий размер кэша в памяти в байтах. По умолчанию используется значение, зависящее от платформы. | | memoryStorageCountLimit | нет | Максимальное количество элементов в кэше памяти. По умолчанию используется значение, зависящее от платформы. | | diskStorageSizeLimit | нет | Максимальный размер файлов на диске в байтах. По умолчанию используется значение, зависящее от платформы. | ### Включение локальных уровней доступа (Android) \{#enable-local-access-levels-android\} По умолчанию [локальные уровни доступа](local-access-levels) включены на iOS и отключены на Android. Чтобы включить их на Android, установите `localAccessLevelAllowed` в `true`: ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { android: { localAccessLevelAllowed: true, }, }); ``` ### Очистка данных при восстановлении из резервной копии \{#clear-data-on-backup-restore\} Если `clearDataOnBackup` установлен в `true`, SDK определяет, когда приложение восстановлено из резервной копии iCloud, и удаляет все локально сохранённые данные SDK: кешированную информацию профиля, данные о продуктах и пейволы. После этого SDK инициализируется с чистого состояния. Значение по умолчанию — `false`. :::note Удаляется только локальный кеш SDK. История транзакций Apple и данные пользователя на серверах Adapty остаются без изменений. ::: ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { ios: { clearDataOnBackup: true }, }); ``` ## Советы для среды разработки \{#development-environment-tips\} #### Отложите активацию SDK в целях разработки \{#delay-sdk-activation-for-development-purposes\} При активации SDK Adapty заранее загружает все необходимые данные о пользователе, чтобы обеспечить быстрый доступ к актуальной информации. Однако в симуляторе iOS это может создавать неудобства: в процессе разработки симулятор часто запрашивает аутентификацию. Adapty не управляет процессом аутентификации StoreKit, но может отложить запросы SDK на получение свежих данных о пользователе. Включив свойство `__debugDeferActivation`, вы откладываете вызов активации до следующего обращения к Adapty SDK. Это позволяет избежать лишних запросов аутентификационных данных, если они не нужны. Важно учитывать, что **эта функция предназначена только для разработки**, поскольку не охватывает все возможные сценарии использования. В продакшене откладывать активацию не следует: реальные устройства, как правило, сохраняют аутентификационные данные и не запрашивают учётные данные повторно. Рекомендуемый подход к использованию: ```typescript showLineNumbers title="Typescript" try { adapty.activate('PUBLIC_SDK_KEY', { __debugDeferActivation: isSimulator(), // 'isSimulator' from any 3rd party library }); } catch (error) { console.error('Failed to activate Adapty SDK:', error); // Handle the error appropriately for your app } ``` #### Устранение ошибок активации SDK при Fast Refresh в React Native \{#troubleshoot-sdk-activation-errors-on-react-natives-fast-refresh\} При разработке с Adapty SDK в React Native вы можете столкнуться с ошибкой: `Adapty can only be activated once. Ensure that the SDK activation call is not made more than once.` Это происходит потому, что функция быстрого обновления (fast refresh) в React Native вызывает несколько активаций в процессе разработки. Чтобы этого избежать, используйте опцию `__ignoreActivationOnFastRefresh` со значением `__DEV__` (флаг режима разработки в React Native). ```typescript showLineNumbers title="Typescript" try { adapty.activate('PUBLIC_SDK_KEY', { __ignoreActivationOnFastRefresh: __DEV__, }); } catch (error) { console.error('Failed to activate Adapty SDK:', error); // Handle the error appropriately for your app } ``` #### Настройка mock-режима для локального тестирования \{#set-up-mock-mode-for-local-testing\} Для локальной разработки и тестирования можно включить mock-режим — это позволяет обойтись без аккаунтов в песочнице App Store/Google Play и ускорить итерации. Mock-режим полностью обходит нативные модули Adapty и возвращает симулированные данные. :::important Mock-режим **не** предназначен для тестирования реальных покупок: - **Не открывает** флоу покупок App Store / Google Play и **не создаёт** реальных транзакций. - **Не рендерит** пейволы/онбординги, созданные с помощью **Adapty Paywall Builder (AdaptyUI)**. - Нативные модули Adapty **полностью обходятся** — даже отсутствие нативных файлов SDK в сборке Xcode/Android или неверный API-ключ не вызовут ошибок. - Данные на серверы Adapty не отправляются. Чтобы протестировать реальные покупки и пейволы Paywall Builder, отключите режим мока и используйте аккаунты песочницы. ::: Чтобы включить режим мока, установите `enableMock` в `true`: ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { enableMock: true, }); ``` Когда активен режим mock: - Все методы Adapty возвращают mock-данные без сетевых запросов к серверам Adapty. - По умолчанию исходный mock-профиль не имеет активных подписок. - По умолчанию `makePurchase(...)` симулирует успешную покупку и предоставляет премиум-доступ. Вы можете настроить mock-данные с помощью `mockConfig` при активации. Формат конфига и поддерживаемые параметры описаны [здесь](https://react-native.adapty.io/interfaces/adaptymockconfig). ```typescript showLineNumbers title="App.tsx" try { await adapty.activate('YOUR_PUBLIC_SDK_KEY', { mockConfig: { // Customize the initial mock profile (optional) }, }); } catch (error) { console.error('Failed to activate Adapty SDK:', error); } ``` Если вам нужно вызвать методы SDK до активации (например, `isActivated()` или `setLogLevel()`), используйте `enableMock()` перед `activate()`. Если мост уже инициализирован, этот метод ничего не делает. ```typescript showLineNumbers title="App.tsx" adapty.enableMock(); // Optional: pass mockConfig to customize mock data // Now you can call methods before activation await adapty.activate('YOUR_PUBLIC_SDK_KEY'); ``` ## Устранение неполадок \{#troubleshooting\} #### Ошибка минимальной версии iOS \{#minimum-ios-version-error\} Если вы получаете ошибку минимальной версии iOS, обновите Podfile: ```diff -platform :ios, min_ios_version_supported +platform :ios, '15.0' ``` #### Конфликт манифеста Android Auto Backup \{#android-auto-backup-manifest-conflict\} Некоторые SDK (включая Adapty) поставляются с собственной конфигурацией Android Auto Backup. Если вы используете несколько SDK, каждый из которых определяет правила резервного копирования, слияние манифестов Android может завершиться ошибкой, связанной с `android:fullBackupContent`, `android:dataExtractionRules` или `android:allowBackup`. Типичные симптомы ошибки: `Manifest merger failed: Attribute application@dataExtractionRules value=(@xml/your_data_extraction_rules) is also present at [com.other.sdk:library:1.0.0] value=(@xml/other_sdk_data_extraction_rules)` :::note Эти изменения нужно вносить в директорию Android-платформы (обычно находится в папке `android/` вашего проекта). ::: Чтобы решить проблему, необходимо: - Указать механизму слияния манифестов использовать значения вашего приложения для атрибутов, связанных с резервным копированием. - Создать файлы правил резервного копирования, объединяющие правила Adapty с правилами других SDK. #### 1. Добавьте пространство имён `tools` в манифест В файле `AndroidManifest.xml` убедитесь, что корневой тег `` включает tools: ```xml ... ``` #### 2. Переопределите атрибуты резервного копирования в `` В том же файле `AndroidManifest.xml` обновите тег ``, чтобы ваше приложение предоставляло итоговые значения и указывало механизму слияния манифестов заменять значения библиотек: ```xml ... ``` Если какой-либо SDK также задаёт `android:allowBackup`, включите его в `tools:replace`: ```xml tools:replace="android:allowBackup,android:fullBackupContent,android:dataExtractionRules" ``` #### 3. Создайте объединённые файлы правил резервного копирования Создайте XML-файлы в директории `res/xml/` вашего Android-проекта, объединяющие правила Adapty с правилами других SDK. Android использует разные форматы правил резервного копирования в зависимости от версии ОС, поэтому создание обоих файлов обеспечивает совместимость со всеми версиями Android, которые поддерживает ваше приложение. :::note В примерах ниже в качестве стороннего SDK используется AppsFlyer. Замените или добавьте правила для других SDK, которые используются в вашем приложении. ::: **Для Android 12 и выше** (используется новый формат правил извлечения данных): ```xml title="sample_data_extraction_rules.xml" ``` **Для Android 11 и ниже** (используется устаревший формат полного резервного копирования): ```xml title="sample_backup_rules.xml" #### Покупки не завершаются после возврата из другого приложения на Android \{#purchases-fail-after-returning-from-another-app-in-android\} Если Activity, запускающий флоу покупки, использует нестандартный `launchMode`, Android может некорректно пересоздать или повторно использовать его, когда пользователь возвращается из Google Play, банковского приложения или браузера. Это может привести к тому, что результат покупки будет потерян или расценён как отменённый. Чтобы покупки работали корректно, используйте только режимы запуска `standard` или `singleTop` для Activity, из которой начинается флоу покупки — любые другие режимы недопустимы. В файле `AndroidManifest.xml` убедитесь, что Activity, из которой запускается флоу покупки, имеет режим `standard` или `singleTop`: ```xml ``` #### Ошибки сборки Swift 6 из-за переопределения SWIFT_VERSION в Podfile \{#swift-6-build-errors-caused-by-podfile-swift-version-override\} При сборке React Native-приложения для iOS на pod-таргетах Adapty могут возникать ошибки компиляции Swift 6. Типичные симптомы: несоответствия `@Sendable` в `AdaptyUIBuilderLogic`, отсутствие соответствия `Sendable` в типах Adapty или ошибки изоляции актора. Pod'ы Adapty объявляют `s.swift_version = '6.0'` и требуют Swift 6 для сборки. Ваш собственный код приложения может оставаться на Swift 5 — только pod-таргеты Adapty (`Adapty`, `AdaptyUI`, `AdaptyUIBuilder`, `AdaptyLogger`, `AdaptyPlugin`) должны собираться с Swift 6. Наиболее распространённая причина — хук `post_install` в `ios/Podfile`, который перезаписывает `SWIFT_VERSION` для каждого pod-таргета: ```ruby showLineNumbers title="ios/Podfile" post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['SWIFT_VERSION'] = '5.9' end end end ``` **Исправление**: исключите pod-таргеты Adapty из переопределения: ```ruby showLineNumbers title="ios/Podfile" post_install do |installer| installer.pods_project.targets.each do |target| next if %w[Adapty AdaptyUI AdaptyUIBuilder AdaptyLogger AdaptyPlugin].include?(target.name) target.build_configurations.each do |config| config.build_settings['SWIFT_VERSION'] = '5.9' end end end ``` Затем выполните `pod install` из директории `ios/` и пересоберите проект. Чтобы проверить, откройте `ios/Pods/Pods.xcodeproj`, выберите pod-таргет `Adapty` → **Build Settings** → **Swift Language Version**. Там должно быть указано **Swift 6**. --- # File: react-native-quickstart-paywalls --- --- title: "Включение покупок с помощью Flow Builder в React Native SDK" description: "Краткое руководство по подключению встроенных покупок с помощью Adapty Flow Builder." --- Чтобы подключить встроенные покупки, нужно разобраться с тремя ключевыми понятиями: - [**Продукты**](product) – всё, что пользователи могут купить (подписки, расходуемые покупки, пожизненный доступ) - [**Флоу**](adapty-flow-builder) – последовательности экранов для представления продуктов пользователям, созданные в no-code Flow Builder. SDK получает их через `getFlow`. Если вы предпочитаете строить UI в собственном коде, используйте пейвол — см. [Ручная реализация пейволов](react-native-quickstart-manual). - [**Плейсменты**](placements) – где и когда вы показываете флоу в приложении (например, `main`, `onboarding`, `settings`). Вы привязываете флоу к плейсментам на дашборде, а затем запрашиваете их по ID плейсмента в коде. Это упрощает проведение A/B-тестов и показ разных флоу разным пользователям. Adapty предлагает три способа подключить покупки в вашем приложении. Выберите подходящий в зависимости от требований: | Реализация | Сложность | Когда использовать | |---|---|---| | Adapty Flow Builder | ✅ Просто | Вы [создаёте готовый к покупкам флоу в no-code конструкторе](quickstart-paywalls). Adapty автоматически отображает его и берёт на себя весь сложный процесс покупки, валидацию чеков и управление подписками. | | Пейволы, созданные вручную | 🟡 Средне | Вы реализуете UI пейвола в коде приложения, но всё равно получаете объект флоу от Adapty, сохраняя гибкость в настройке продуктов. См. [гайд](react-native-quickstart-manual). | | Observer mode | 🔴 Сложно | У вас уже есть собственная инфраструктура для обработки покупок и вы хотите её сохранить. Обратите внимание, что observer mode имеет ограничения в Adapty. См. [статью](observer-vs-full-mode). | :::important **Шаги ниже показывают, как реализовать флоу, созданное в Adapty Flow Builder.** Если вы предпочитаете создавать UI пейвола самостоятельно, см. [Реализация пейволов вручную](react-native-quickstart-manual). ::: Чтобы отобразить флоу, созданное в Adapty Flow Builder, в коде приложения нужно выполнить всего несколько шагов: 1. **Получите флоу**: Запросите его из Adapty. 2. **Отобразите его — Adapty возьмёт покупки на себя**: Покажите view в приложении. 3. **Обработайте действия кнопок**: Свяжите действия пользователя с реакцией вашего приложения на них. Например, открывайте ссылки или закрывайте флоу при нажатии кнопок. ## Перед началом работы \{#before-you-start\} Выполните следующие шаги: 1. Подключите приложение к [App Store](initial_ios) и/или [Google Play](initial-android) в дашборде Adapty. 2. [Создайте продукты](create-product) в Adapty. 3. [Создайте пейвол и добавьте в него продукты](create-paywall). 4. [Создайте плейсмент и добавьте пейвол в него](create-placement). 5. [Установите и активируйте Adapty SDK](sdk-installation-reactnative) в коде приложения. :::tip Быстрее всего выполнить эти шаги можно с помощью [quickstart-гайда](quickstart) или создав пейволы и плейсменты через [Developer CLI](developer-cli-quickstart). ::: ## 1. Получите флоу \{#1-get-the-flow\} Флоу привязаны к плейсментам, настроенным в дашборде. Плейсменты позволяют показывать разные флоу разным аудиториям или запускать [A/B-тесты](ab-tests). Чтобы получить флоу, созданный в Adapty Flow Builder, получите объект `flow` по идентификатору [плейсмента](placements) с помощью метода `getFlow`. Флоу содержит элементы интерфейса и стили, необходимые для его отображения. ```typescript showLineNumbers title="React Native" try { const flow = await adapty.getFlow('YOUR_PLACEMENT_ID'); // the requested flow } catch (error) { // handle the error } ``` ## 2. Отображение флоу \{#display-the-flow\} Теперь, когда у вас есть флоу, достаточно добавить несколько строк для его отображения. Чтобы встроить флоу в существующее дерево компонентов, используйте компонент `AdaptyFlowView` непосредственно в иерархии компонентов React Native: ```typescript showLineNumbers title="React Native (TSX)" function MyFlow({ flow }) { const onPurchaseCompleted = useCallback( (result, product) => result.type !== 'user_cancelled', [], ); return ( ); } ``` Чтобы отобразить флоу как отдельный экран, создайте `view` с помощью метода `createFlowView`, задайте обработчики событий, затем вызовите `view.present()`. Каждый `view` можно использовать только один раз. Если вам нужно снова показать флоу, вызовите `createFlowView` ещё раз, чтобы создать новый экземпляр `view`. ```typescript showLineNumbers title="React Native" try { const view = await createFlowView(flow); view.setEventHandlers({ onPurchaseCompleted(result, product) { return result.type !== 'user_cancelled'; }, }); await view.present(); } catch (error) { // handle the error } ``` :::tip Подробнее о том, как отобразить флоу, читайте в нашем [гайде](react-native-present-paywalls). ::: ## 3. Обработка действий кнопок \{#handle-button-actions\} Когда пользователи нажимают кнопки во флоу, React Native SDK автоматически обрабатывает покупки, восстановление, закрытие флоу и открытие URL. Однако у других кнопок есть пользовательские или предопределённые идентификаторы, требующие обработки действий в вашем коде. Или вы можете захотеть переопределить их поведение по умолчанию. Например, ниже показано поведение по умолчанию для кнопки закрытия. Добавлять это в код не нужно, но здесь вы можете увидеть, как это делается при необходимости. For the React component, handle actions directly in the `AdaptyFlowView` component: ```typescript showLineNumbers title="React Native (TSX)" function MyFlow({ flow }) { const onCloseButtonPress = useCallback( () => true, // allow the flow to close [], ); const onCustomAction = useCallback( (actionId) => false, [], ); return ( ); } ``` Для модального представления реализуйте обработчики событий с помощью `setEventHandlers`: ```typescript showLineNumbers title="React Native" const unsubscribe = view.setEventHandlers({ onCloseButtonPress() { return true; // allow the flow to close }, }); ``` :::tip Прочитайте наши гайды по обработке [действий](react-native-handle-paywall-actions) и [событий](react-native-handling-events-1) кнопок. ::: ## Следующие шаги \{#next-steps\} :::tip Есть вопросы или возникли проблемы? Загляните на наш [форум поддержки](https://adapty.featurebase.app/), где можно найти ответы на распространённые вопросы или задать свой. Наша команда и сообщество всегда готовы помочь! ::: Пейвол готов к отображению в приложении. Протестируйте покупки в [песочнице App Store](test-purchases-in-sandbox) или в [Google Play Store](testing-on-android), чтобы убедиться, что тестовая покупка через пейвол проходит успешно. Теперь нужно [проверить уровень доступа пользователей](react-native-check-subscription-status), чтобы показывать пейвол или предоставлять доступ к платным функциям только нужным пользователям. ## Полный пример \{#full-example\} Вот как все шаги из этого гайда можно объединить в вашем приложении. ```javascript showLineNumbers title="React Native (TSX)" export default function FlowScreen() { const [flow, setFlow] = useState(null); const loadFlow = async () => { try { const flowData = await adapty.getFlow('YOUR_PLACEMENT_ID'); setFlow(flowData); } catch (error) { console.warn('Error loading flow:', error); } }; const onCloseButtonPress = useCallback( () => true, [], ); const onPurchaseCompleted = useCallback( (result, product) => result.type !== 'user_cancelled', [], ); useEffect(() => { loadFlow(); }, []); return ( {flow ? ( ) : (