Установка и настройка Adapty React Native SDK в проекте Expo

Этот гайд описывает установку и настройку Adapty React Native SDK в проекте Expo.

Если вы используете чистый React Native (без Expo), следуйте гайду по установке для React Native.

Adapty SDK включает два ключевых модуля для бесшовной интеграции в ваше React Native приложение:

  • Core Adapty: Этот модуль необходим для корректной работы Adapty в вашем приложении.
  • AdaptyUI: Этот модуль нужен, если вы используете Adapty Paywall Builder — удобный no-code инструмент для создания кросс-платформенных пейволов. AdaptyUI активируется автоматически вместе с основным модулем.

Если вам нужен полный туториал по реализации встроенных покупок в приложении на React Native, ознакомьтесь с этим материалом.

Хотите увидеть реальный пример интеграции Adapty SDK в приложение на Expo? Посмотрите наши примеры:

Для полного пошагового руководства по реализации вы также можете посмотреть видео:

Требования

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, но при необходимости вы можете принудительно использовать более позднюю версию, вручную добавив зависимость. В Expo это можно сделать во время prebuild или через config plugin.

Установка SDK — это шаг 5 настройки Adapty. Прежде чем покупки заработают в вашем приложении, вам также нужно подключить приложение к сторам, а затем создать продукты, пейвол и плейсмент в дашборде Adapty. Гайд по быстрому старту описывает все необходимые шаги.

Установка Adapty SDK

Release

Для использования Adapty в проекте Expo необходим Expo Dev Client (пользовательская сборка для разработки).

Expo Go не поддерживает кастомные нативные модули, поэтому с ним можно работать только в режиме mock для разработки UI и логики (без реальных покупок и без рендеринга AdaptyUI/Paywall Builder).

  1. Установите Adapty SDK (это также автоматически установит @adapty/core):

    npx expo install react-native-adapty
    npx expo prebuild
  2. Соберите приложение для разработки с помощью EAS или локальной сборки:

  3. Запустите dev-сервер:

    npx expo start --dev-client

Активация модуля Adapty в Adapty SDK

Чтобы получить Public SDK Key:

  1. Откройте дашборд Adapty и перейдите в App settings → General.
  2. В разделе Api keys скопируйте Public SDK Key (не Secret Key).
  3. Замените "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.

Теперь настройте пейволы в своём приложении:

Чтобы избежать ошибок активации в среде разработки, воспользуйтесь советами.

Активация модуля 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, // Опционально: размер кэша в памяти в байтах
    memoryStorageCountLimit: 2147483647,            // Опционально: максимальное количество элементов в памяти
    diskStorageSizeLimit: 200 * 1024 * 1024,       // Опционально: размер дискового кэша в байтах
  },
});
ПараметрОбязательныйОписание
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
   },
});

Советы по среде разработки

Настройте mock mode для Expo Go / Expo Web

В средах Expo Go и Expo Web нет доступа к нативным модулям Adapty. Чтобы избежать ошибок во время выполнения и при этом иметь возможность собирать и тестировать UI приложения и логику пейволов, Adapty предоставляет mock mode.

Mock mode — это не инструмент для тестирования реальных покупок:

  • Он не открывает экраны покупок App Store / Google Play и не создаёт реальные транзакции.
  • Он не рендерит пейволы/онбординги, созданные с помощью Adapty Paywall Builder (AdaptyUI).
  • Нативные модули Adapty полностью обходятся — даже отсутствующие нативные файлы SDK в сборке Xcode/Android или неверный API-ключ не вызовут ошибок.

Для тестирования реальных покупок и пейволов Paywall Builder используйте Expo Dev Client или production-сборку, в которой mock-режим автоматически отключён.

По умолчанию SDK автоматически определяет среды Expo Go и веб и включает режим моков. Настраивать ничего не нужно, если только вы не хотите изменить mock-данные.

Когда режим моков активен:

  • Все методы Adapty возвращают mock-данные, не обращаясь к серверам Adapty.
  • По умолчанию исходный mock-профиль не имеет активных подписок.
  • По умолчанию makePurchase(...) симулирует успешную покупку и предоставляет доступ уровня premium. Вы можете настроить mock-данные с помощью 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');

Задержка активации SDK для разработки

Adapty заранее загружает все необходимые данные пользователя при активации SDK, что обеспечивает более быстрый доступ к актуальным данным.

Однако в симуляторе iOS это может создавать проблемы: во время разработки он часто запрашивает аутентификацию. Adapty не управляет процессом аутентификации StoreKit, но может откладывать запросы SDK на получение свежих данных пользователя.

Если включить свойство __debugDeferActivation, вызов активации будет приостановлен до следующего обращения к Adapty SDK. Это позволяет избежать лишних запросов аутентификационных данных, если в них нет необходимости. Важно учитывать, что эта функция предназначена только для разработки: она не охватывает все возможные пользовательские сценарии. В продакшене не стоит откладывать активацию, поскольку реальные устройства обычно сохраняют данные аутентификации и не запрашивают учётные данные повторно.

Рекомендуемый подход:

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. Это происходит из-за того, что функция быстрого обновления (fast refresh) в 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
}

Устранение неполадок

Ошибка минимальной версии iOS

При сборке под iOS может возникнуть ошибка о минимальной версии iOS или deployment target — особенно если вы используете пейволы, созданные в Adapty Paywall Builder, которые требуют iOS 15.0+.

Поскольку Expo генерирует iOS-проект (включая Podfile) в процессе expo prebuild, редактировать Podfile напрямую не следует. Вместо этого настройте deployment target через config plugin expo-build-properties.

  1. Установите плагин:
  2. npx expo install expo-build-properties
  3. Обновите конфиг Expo (app.json или app.config.js), чтобы задать минимальную версию iOS:
{
    "expo": {
        // ...other Expo config...
        "plugins": [
            [
                "expo-build-properties",
                {
                    "ios": {
                        // Используйте "13.0" только для базовых функций Adapty,
                        // или "15.0", если используете пейволы, созданные в Paywall Builder.
                        "deploymentTarget": "15.0"
                    }
                }
            ],
        ]
    }
}
  1. Пересоздайте нативный iOS-проект и выполните пересборку:
npx expo prebuild --clean
npx expo run:ios      # or `eas build -p ios` on your CI

Конфликт Auto Backup в манифесте Android

При использовании 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:

{
  "expo": {
    "plugins": [
      ["react-native-adapty", { "replaceAndroidBackupConfig": true }],
      ["expo-secure-store", { "configureAndroidBackup": false }]
    ]
  }
}

Опция replaceAndroidBackupConfig по умолчанию имеет значение false. При включении она позволяет плагину Adapty управлять правилами резервного копирования Android. Добавьте "configureAndroidBackup": false, если используете expo-secure-store, чтобы избежать предупреждений — настройка резервного копирования SecureStore теперь будет выполняться через Adapty.

Эта настройка учитывает только требования к резервному копированию для Adapty, AppsFlyer и expo-secure-store. Если другие библиотеки в вашем проекте определяют собственные правила резервного копирования, вам нужно настроить их вручную.