Установка и настройка Adapty SDK в проекте на чистом React Native
Это руководство применимо только к чистым проектам React Native (без Expo). Если вы используете Expo, следуйте руководству по установке для Expo.
Adapty SDK включает два ключевых модуля для бесшовной интеграции в ваше приложение React Native:
- Core Adapty: Этот модуль необходим для работы Adapty в вашем приложении.
- AdaptyUI: Этот модуль нужен, если вы используете Adapty Paywall Builder — удобный no-code инструмент для создания кроссплатформенных пейволов. AdaptyUI активируется автоматически вместе с основным модулем.
Хотите посмотреть на реальный пример интеграции Adapty SDK в мобильное приложение? Загляните в наши примеры приложений — они демонстрируют полную настройку: отображение пейволов, совершение покупок и другой базовый функционал.
Требования
Adapty React Native SDK поддерживает iOS 13.0+, однако использование пейволов, созданных в Adapty Paywall Builder, требует iOS 15.0+.
Adapty совместим с Google Play Billing Library версий до 8.x включительно. По умолчанию Adapty работает с Google Play Billing Library v.7.0.0, но если вам нужна более поздняя версия, вы можете вручную добавить зависимость.
Установка SDK — это шаг 5 настройки Adapty. Прежде чем покупки заработают в вашем приложении, вам также нужно подключить приложение к сторам, а затем создать продукты, пейвол и плейсмент в дашборде Adapty. Гайд по быстрому старту описывает все необходимые шаги.
Установка Adapty SDK
- Установите Adapty SDK (при этом автоматически установится
@adapty/core):# using npm npm install react-native-adapty # or using yarn yarn add react-native-adapty - Для iOS установите pods:
cd ios && pod install
Для Android, если ваша версия React Native ниже 0.73.0 (нажмите, чтобы развернуть)
Обновите файл /android/build.gradle. Убедитесь, что зависимость kotlin-gradle-plugin:1.8.0 или более новая версия присутствует:
...
buildscript {
...
dependencies {
...
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0"
}
}
...Активация модуля Adapty SDK
Чтобы получить Public SDK Key:
- Откройте дашборд Adapty и перейдите в App settings → General.
- В разделе Api keys скопируйте Public SDK Key (не Secret Key).
- Замените
"YOUR_PUBLIC_SDK_KEY"в коде на скопированный ключ.
- Используйте Public SDK key для инициализации Adapty. Secret key предназначен только для серверного API.
- SDK keys уникальны для каждого приложения, поэтому при наличии нескольких приложений убедитесь, что выбрали правильный ключ.
Скопируйте следующий код в App.tsx для активации Adapty:
adapty.activate('YOUR_PUBLIC_SDK_KEY');
Дождитесь завершения activate перед вызовом любых других методов Adapty SDK. Подробнее о полной последовательности вызовов см. в разделе Порядок вызовов в React Native SDK.
Теперь настройте пейволы в вашем приложении:
- Если вы используете Adapty Paywall Builder, следуйте быстрому старту с Paywall Builder.
- Если вы создаёте собственный интерфейс пейвола, смотрите быстрый старт для кастомных пейволов.
Чтобы избежать ошибок активации в среде разработки, воспользуйтесь советами.
Активация модуля AdaptyUI из Adapty SDK
Если вы планируете использовать Paywall Builder, вам понадобится модуль AdaptyUI. Он активируется автоматически при активации основного модуля — никаких дополнительных действий не требуется.
Дополнительная настройка
Логирование
Настройка системы логирования
Adapty логирует ошибки и другую важную информацию, чтобы помочь вам разобраться в происходящем. Доступны следующие уровни логирования:
| Уровень | Описание |
|---|---|
error | Будут логироваться только ошибки |
warn | Будут логироваться ошибки и сообщения от SDK, которые не вызывают критических ошибок, но заслуживают внимания |
info | Будут логироваться ошибки, предупреждения и различные информационные сообщения |
verbose | Будет логироваться любая дополнительная информация, которая может быть полезна при отладке: вызовы функций, запросы к API и т. д. |
| Вы можете задать уровень логирования в приложении до или во время настройки Adapty: |
// 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',
});
Политики обработки данных
Adapty не хранит персональные данные пользователей, если вы явно их не передаёте. При необходимости можно настроить дополнительные политики безопасности данных для соответствия требованиям стора или законодательства конкретной страны.
Отключение сбора и передачи IP-адресов
При активации модуля Adapty установите ipAddressCollectionDisabled в значение true, чтобы отключить сбор и передачу IP-адресов пользователей. Значение по умолчанию — false.
Используйте этот параметр для защиты конфиденциальности пользователей, соблюдения региональных законов о защите данных (например, GDPR или CCPA) или сокращения сбора лишних данных, если функции на основе IP-адресов не нужны вашему приложению.
adapty.activate('YOUR_PUBLIC_SDK_KEY', {
ipAddressCollectionDisabled: true,
});
Отключение сбора и передачи рекламного идентификатора
При активации модуля Adapty установите ios.idfaCollectionDisabled (iOS) или android.adIdCollectionDisabled (Android) в значение true, чтобы отключить сбор рекламных идентификаторов. Значение по умолчанию — false.
Используйте этот параметр для соответствия требованиям App Store/Play Store, чтобы не вызывать запрос App Tracking Transparency, или если ваше приложение не требует рекламной атрибуции или аналитики на основе рекламных идентификаторов.
adapty.activate('YOUR_PUBLIC_SDK_KEY', {
ios: {
idfaCollectionDisabled: true,
},
android: {
adIdCollectionDisabled: true,
},
});
Настройка кэширования медиа для AdaptyUI
По умолчанию AdaptyUI кэширует медиафайлы (изображения и видео) для повышения производительности и снижения сетевой нагрузки. Вы можете настроить параметры кэша, передав собственную конфигурацию.
Используйте mediaCache для переопределения стандартных настроек кэша:
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)
По умолчанию локальные уровни доступа включены на iOS и отключены на Android. Чтобы включить их и на Android, установите localAccessLevelAllowed в true:
adapty.activate('YOUR_PUBLIC_SDK_KEY', {
android: {
localAccessLevelAllowed: true,
},
});
Очистка данных при восстановлении из резервной копии
Когда clearDataOnBackup установлен в true, SDK обнаруживает восстановление приложения из резервной копии iCloud и удаляет все локально хранящиеся данные SDK, включая кэшированную информацию профиля, сведения о продуктах и пейволы. После этого SDK инициализируется в чистом состоянии. Значение по умолчанию — false.
Удаляется только локальный кэш SDK. История транзакций в Apple и пользовательские данные на серверах Adapty остаются без изменений.
adapty.activate('YOUR_PUBLIC_SDK_KEY', {
ios: {
clearDataOnBackup: true
},
});
Советы для среды разработки
Отложить активацию SDK для нужд разработки
При активации SDK Adapty заранее загружает все необходимые данные пользователя, что обеспечивает более быстрый доступ к актуальной информации.
Однако в симуляторе iOS это может создавать неудобства: во время разработки симулятор нередко запрашивает аутентификацию. Adapty не может управлять процессом аутентификации StoreKit, но может отложить запросы, которые SDK отправляет для получения свежих данных пользователя.
Включив свойство __debugDeferActivation, вызов активации откладывается до следующего обращения к SDK Adapty. Это позволяет избежать лишних запросов на аутентификацию, если они не нужны.
Важно учитывать, что эта функция предназначена только для разработки, поскольку не охватывает все возможные пользовательские сценарии. В продакшене откладывать активацию не стоит: реальные устройства, как правило, запоминают данные аутентификации и не запрашивают учётные данные повторно.
Рекомендуемый способ использования:
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
При разработке с Adapty SDK в React Native вы можете столкнуться с ошибкой: Adapty can only be activated once. Ensure that the SDK activation call is not made more than once.
Это происходит потому, что функция быстрого обновления React Native вызывает несколько активаций в процессе разработки. Чтобы избежать этого, используйте параметр __ignoreActivationOnFastRefresh со значением __DEV__ (флаг режима разработки React Native).
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 для локального тестирования
Для локальной разработки и тестирования можно включить режим mock, чтобы не использовать аккаунты песочницы App Store/Google Play и ускорить итерации. Режим mock полностью обходит нативные модули Adapty и возвращает симулированные данные.
Режим mock не предназначен для тестирования реальных покупок:
- Не открывает флоу покупок App Store / Google Play и не создаёт реальных транзакций.
- Не отображает пейволы/онбординги, созданные с помощью Adapty Paywall Builder (AdaptyUI).
- Нативные модули Adapty полностью обходятся — даже отсутствующие нативные файлы SDK в сборке Xcode/Android или неверный API-ключ не вызовут ошибок.
- Данные на серверы Adapty не отправляются.
Чтобы протестировать реальные покупки и пейволы Paywall Builder, отключите mock-режим и используйте аккаунты песочницы.
Чтобы включить mock-режим, установите enableMock в true:
adapty.activate('YOUR_PUBLIC_SDK_KEY', {
enableMock: true,
});
Когда включён режим мока:
- Все методы Adapty возвращают моковые данные без сетевых запросов к серверам Adapty.
- По умолчанию исходный моковый профиль не имеет активных подписок.
- По умолчанию
makePurchase(...)симулирует успешную покупку и предоставляет доступ уровня premium.
Вы можете настроить моковые данные с помощью mockConfig при активации. Формат конфига и поддерживаемые параметры описаны здесь.
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(). Если бридж уже инициализирован, этот метод ничего не делает.
adapty.enableMock(); // Optional: pass mockConfig to customize mock data
// Now you can call methods before activation
await adapty.activate('YOUR_PUBLIC_SDK_KEY');
Устранение неполадок
Ошибка минимальной версии iOS
Если вы получаете ошибку минимальной версии iOS, обновите Podfile:
-platform :ios, min_ios_version_supported
+platform :ios, '13.0' # For core features only
# OR
+platform :ios, '15.0' # If using paywalls created in the paywall builder
Конфликт манифеста Android Auto Backup
Некоторые 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)
Эти изменения нужно вносить в директорию Android-платформы (обычно находится в папке android/ вашего проекта).
Чтобы решить проблему, необходимо:
-
Указать механизму слияния манифестов использовать значения вашего приложения для атрибутов, связанных с резервным копированием.
-
Создать файлы правил резервного копирования, объединяющие правила Adapty с правилами других SDK.
1. Добавьте пространство имён tools в манифест
В файле AndroidManifest.xml убедитесь, что корневой тег <manifest> включает tools:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.app">
...
</manifest>
2. Переопределите атрибуты резервного копирования в <application>
В том же файле AndroidManifest.xml обновите тег <application>, чтобы ваше приложение предоставляло итоговые значения и указывало механизму слияния манифестов заменять значения библиотек:
<application
android:name=".App"
android:allowBackup="true"
android:fullBackupContent="@xml/sample_backup_rules"
android:dataExtractionRules="@xml/sample_data_extraction_rules"
tools:replace="android:fullBackupContent,android:dataExtractionRules">
...
</application>
Если какой-либо SDK также задаёт android:allowBackup, включите его в tools:replace:
tools:replace="android:allowBackup,android:fullBackupContent,android:dataExtractionRules"
3. Создайте объединённые файлы правил резервного копирования
Создайте XML-файлы в директории res/xml/ вашего Android-проекта, объединяющие правила Adapty с правилами других SDK. Android использует разные форматы правил резервного копирования в зависимости от версии ОС, поэтому создание обоих файлов обеспечивает совместимость со всеми версиями Android, которые поддерживает ваше приложение.
В примерах ниже в качестве стороннего SDK используется AppsFlyer. Замените или добавьте правила для других SDK, которые используются в вашем приложении.
Для Android 12 и выше (используется новый формат правил извлечения данных):
<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
<cloud-backup>
<exclude domain="sharedpref" path="appsflyer-data"/>
<exclude domain="sharedpref" path="appsflyer-purchase-data"/>
<exclude domain="database" path="afpurchases.db"/>
<exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>
</cloud-backup>
<device-transfer>
<exclude domain="sharedpref" path="appsflyer-data"/>
<exclude domain="sharedpref" path="appsflyer-purchase-data"/>
<exclude domain="database" path="afpurchases.db"/>
<exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>
</device-transfer>
</data-extraction-rules>
Для Android 11 и ниже (используется устаревший формат полного резервного копирования):
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="sharedpref" path="appsflyer-data"/>
<exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>
Покупки завершаются ошибкой после возврата из другого приложения на Android
Если Activity, из которой запускается флоу покупки, использует нестандартный launchMode, Android может некорректно пересоздать или повторно использовать её при возврате пользователя из Google Play, банковского приложения или браузера. Это может привести к потере результата покупки или его ошибочной обработке как отмены.
Чтобы покупки работали корректно, используйте только режимы запуска standard или singleTop для Activity, из которой запускается флоу покупки, и избегайте любых других режимов.
В файле AndroidManifest.xml убедитесь, что для Activity, из которой запускается флоу покупки, установлен режим standard или singleTop:
<activity
android:name=".MainActivity"
android:launchMode="standard" />
Ошибки сборки Swift 6, вызванные переопределением SWIFT_VERSION в Podfile
При сборке React Native приложения для iOS могут возникать ошибки компиляции Swift 6 в pod-таргетах Adapty. Типичные симптомы: несоответствия @Sendable в AdaptyUIBuilderLogic, отсутствие Sendable-совместимости для типов Adapty или ошибки изоляции акторов.
Поды Adapty объявляют s.swift_version = '6.0' и требуют Swift 6 для сборки. Код вашего приложения может оставаться на Swift 5 — Swift 6 нужен только для таргетов подов Adapty (Adapty, AdaptyUI, AdaptyUIBuilder, AdaptyLogger, AdaptyPlugin).
Чаще всего проблема возникает из-за хука post_install в ios/Podfile, который перезаписывает SWIFT_VERSION для всех таргетов подов:
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 из переопределения:
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, выберите цель пода Adapty → Build Settings → Swift Language Version. Должна быть указана Swift 6.