Capacitor — установка и настройка Adapty SDK
Adapty SDK включает два ключевых модуля для интеграции в ваше Capacitor-приложение:
- Core Adapty: этот модуль необходим для работы Adapty в вашем приложении.
- AdaptyUI: этот модуль нужен, если вы используете Adapty Paywall Builder — удобный no-code инструмент для создания кросс-платформенных пейволов. AdaptyUI активируется автоматически вместе с основным модулем.
Хотите увидеть реальный пример интеграции Adapty SDK в мобильное приложение? Посмотрите наши примеры приложений, в которых показана полная настройка: отображение пейволов, совершение покупок и другие базовые функции.
Требования
Adapty Capacitor SDK имеет следующие требования к версиям:
| Версия Adapty SDK | Версия Capacitor | Версия iOS |
|---|---|---|
| 3.16.0+ | 8 | 15.0+ |
| 3.15 | 7 | 14.0+ |
Capacitor версии 6 и ниже не поддерживается.
Adapty совместима с Google Play Billing Library версий до 8.x включительно. По умолчанию Adapty использует Google Play Billing Library v.7.0.0, но если вы хотите использовать более позднюю версию, можно вручную добавить зависимость.
Установка SDK — это шаг 5 настройки Adapty. Прежде чем покупки заработают в вашем приложении, вам также нужно подключить приложение к сторам, а затем создать продукты, пейвол и плейсмент в дашборде Adapty. Гайд по быстрому старту описывает все необходимые шаги.
Установка Adapty SDK
Установите Adapty SDK:
npm install @adapty/capacitor
npx cap sync
Активация модуля Adapty в SDK
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 уникальны для каждого приложения, поэтому при наличии нескольких приложений убедитесь, что выбрали правильный ключ.
Скопируйте следующий код в любой файл приложения для активации Adapty:
try {
await adapty.activate({
apiKey: 'YOUR_PUBLIC_SDK_KEY',
params: {
// подробное логирование рекомендуется в процессе разработки и для первого релиза
logLevel: 'verbose',
// в среде разработки используйте эту переменную, чтобы избежать ошибок повторной активации. Установите значение переменной своей среды разработки
__ignoreActivationOnFastRefresh: true,
}
});
console.log('Adapty activated successfully!');
} catch (error) {
console.error('Failed to activate Adapty SDK:', error);
}
Дождитесь завершения activate перед вызовом любых других методов Adapty SDK. Полная последовательность описана в Порядок вызовов в Capacitor SDK.
Чтобы избежать ошибок активации в среде разработки, воспользуйтесь советами.
Теперь настройте пейволы в вашем приложении:
- Если вы используете Adapty Paywall Builder, следуйте быстрому старту с Paywall Builder.
- Если вы создаёте собственный UI пейвола, см. быстрый старт для кастомных пейволов.
Активация модуля AdaptyUI
Если вы планируете использовать Paywall Builder, вам понадобится модуль AdaptyUI. Он активируется автоматически при активации основного модуля — дополнительных действий не требуется.
Опциональная настройка
Логирование
Настройка системы логирования
Adapty записывает ошибки и другую важную информацию, чтобы вы могли понять, что происходит. Доступны следующие уровни логирования:
| Уровень | Описание |
|---|---|
error | Будут записываться только ошибки |
warn | Будут записываться ошибки и сообщения от SDK, которые не вызывают критических ошибок, но заслуживают внимания |
info | Будут записываться ошибки, предупреждения и различные информационные сообщения |
verbose | Будет записываться любая дополнительная информация, которая может быть полезна при отладке: вызовы функций, API-запросы и т. д. |
| Вы можете установить уровень логирования в приложении до или во время настройки Adapty: |
// Set log level before activation
adapty.setLogLevel({ logLevel: 'verbose' });
// Or set it during configuration
await adapty.activate({
apiKey: 'YOUR_PUBLIC_SDK_KEY',
params: {
logLevel: 'verbose',
}
});
Политики обработки данных
Adapty не хранит персональные данные пользователей, если вы явно их не передаёте, но вы можете настроить дополнительные политики безопасности данных для соответствия требованиям стора или законодательства отдельных стран.
Отключение сбора и передачи IP-адресов
При активации модуля Adapty установите ipAddressCollectionDisabled в значение true, чтобы отключить сбор и передачу IP-адресов пользователей. Значение по умолчанию — false.
Используйте этот параметр для защиты конфиденциальности пользователей, соблюдения региональных законов о защите данных (например, GDPR или CCPA) или для сокращения сбора данных, если возможности на основе IP-адреса не нужны вашему приложению.
await adapty.activate({
apiKey: 'YOUR_PUBLIC_SDK_KEY',
params: {
ipAddressCollectionDisabled: true,
}
});
Отключить сбор и передачу рекламного идентификатора
При активации модуля Adapty установите ios.idfaCollectionDisabled (iOS) или android.adIdCollectionDisabled (Android) в значение true, чтобы отключить сбор рекламных идентификаторов. Значение по умолчанию — false.
Используйте этот параметр для соблюдения политик App Store/Play Store, чтобы не вызывать запрос App Tracking Transparency, или если ваше приложение не требует атрибуции рекламы или аналитики на основе рекламных идентификаторов.
await adapty.activate({
apiKey: 'YOUR_PUBLIC_SDK_KEY',
params: {
ios: {
idfaCollectionDisabled: true,
},
android: {
adIdCollectionDisabled: true,
},
}
});
Настройка конфигурации медиакэша для AdaptyUI
По умолчанию AdaptyUI кэширует медиафайлы (изображения, видео) для повышения производительности и снижения сетевой нагрузки. Вы можете настроить параметры кэша, передав собственную конфигурацию.
Используйте mediaCache, чтобы переопределить настройки кэша по умолчанию:
await adapty.activate({
apiKey: 'YOUR_PUBLIC_SDK_KEY',
params: {
mediaCache: {
memoryStorageTotalCostLimit: 200 * 1024 * 1024, // Опционально: размер кэша в памяти в байтах
memoryStorageCountLimit: 2147483647, // Опционально: максимальное количество элементов в памяти
diskStorageSizeLimit: 200 * 1024 * 1024, // Опционально: размер кэша на диске в байтах
},
}
});
| Параметр | Обязательный | Описание |
|---|---|---|
| memoryStorageTotalCostLimit | необязательный | Общий размер кэша в памяти в байтах. По умолчанию используется значение, зависящее от платформы. |
| memoryStorageCountLimit | необязательный | Максимальное количество элементов в памяти. По умолчанию используется значение, зависящее от платформы. |
| diskStorageSizeLimit | необязательный | Максимальный размер файлов на диске в байтах. По умолчанию используется значение, зависящее от платформы. |
Включение локальных уровней доступа (Android)
По умолчанию локальные уровни доступа включены на iOS и отключены на Android. Чтобы включить их и на Android, установите localAccessLevelAllowed в true:
await adapty.activate({
apiKey: 'YOUR_PUBLIC_SDK_KEY',
params: {
android: {
localAccessLevelAllowed: true,
},
}
});
Очистка данных при восстановлении из резервной копии
Если clearDataOnBackup установлено в true, SDK определяет, что приложение восстановлено из резервной копии iCloud, и удаляет все локально сохранённые данные SDK: кешированную информацию о профиле, детали продуктов и пейволы. После этого SDK инициализируется с чистого состояния. Значение по умолчанию — false.
Удаляется только локальный кеш SDK. История транзакций в Apple и данные пользователя на серверах Adapty остаются без изменений.
await adapty.activate({
apiKey: 'YOUR_PUBLIC_SDK_KEY',
params: {
ios: {
clearDataOnBackup: true,
},
}
});
Советы по среде разработки
Устранение ошибок активации SDK при live-reload в Capacitor
При разработке с Adapty SDK в Capacitor вы можете столкнуться с ошибкой: Adapty can only be activated once. Ensure that the SDK activation call is not made more than once.
Это происходит потому, что функция live-reload в Capacitor вызывает несколько активаций во время разработки. Чтобы этого избежать, используйте опцию __ignoreActivationOnFastRefresh, установив её в флаг режима разработки Capacitor — конкретное значение зависит от используемого бандла.
try {
await adapty.activate({
apiKey: 'YOUR_PUBLIC_SDK_KEY',
params: {
// Set your development environment variable
__ignoreActivationOnFastRefresh: true,
}
});
} catch (error) {
console.error('Failed to activate Adapty SDK:', error);
// Handle the error appropriately for your app
}
Устранение неполадок
Ошибка минимальной версии iOS
Если возникает ошибка минимальной версии iOS, обновите Podfile:
-platform :ios, min_ios_version_supported
+platform :ios, '14.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 выполните npx cap sync android, чтобы Capacitor подхватил обновлённые ресурсы при следующей пересборке платформы.
Покупки не проходят после возврата из другого приложения на 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
При сборке приложения на Capacitor для iOS могут появляться ошибки компиляции Swift 6 в pod-таргетах Adapty. Типичные симптомы: несоответствия @Sendable в AdaptyUIBuilderLogic, отсутствие conformance Sendable у типов Adapty или ошибки изоляции акторов.
Поды Adapty объявляют s.swift_version = '6.0' и требуют Swift 6 для сборки. Ваш собственный код приложения может оставаться на Swift 5 — только целевые поды Adapty (Adapty, AdaptyUI, AdaptyUIBuilder, AdaptyLogger, AdaptyPlugin) должны собираться с Swift 6.
Наиболее частая причина — хук post_install в ios/App/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
Затем выполните npx cap sync ios и пересоберите проект.
Для проверки откройте ios/App/Pods/Pods.xcodeproj, выберите таргет пода Adapty → Build Settings → Swift Language Version. Там должно быть указано Swift 6.