Порядок вызовов в Android SDK
Adapty.activate() должен завершиться до того, как вы вызовете любой другой метод Adapty SDK. До его завершения SDK не имеет состояния. Любой вызов, выполненный до или параллельно с activate(), завершится ошибкой ADAPTY_NOT_INITIALIZED.
Если ваше приложение аутентифицирует пользователей и вы получаете customer user ID после запуска, вызовите Adapty.identify() в этот момент. Не вызывайте пользовательские методы до срабатывания колбэка завершения identify. Вызовы, которые идут параллельно с ним, либо возвращают ошибку в своём колбэке, либо применяются к анонимному профилю, созданному при активации. В таком случае атрибуция, MMP-идентификаторы вроде appsflyer_id и данные об установке не всегда переносятся на идентифицированный профиль. Если ваше приложение не аутентифицирует пользователей, пропустите identify и продолжайте работу с анонимным профилем.
MMP и аналитические SDK (AppsFlyer, Adjust, Branch, PostHog) подчиняются тому же правилу. Сначала инициализируйте их и дождитесь колбэков с UID, и только после этого вызывайте Adapty.activate. Иначе MMP ID попадёт в кратковременный анонимный профиль и не всегда переносится в идентифицированный. Подробнее об особенностях AppsFlyer см. в разделе AppsFlyer.
Правильный порядок
Ваш путь зависит от двух вещей: когда вы узнаёте customer user ID и используете ли вы MMP или аналитический SDK.
- Шаги 2 и 5: обязательны для каждого приложения. Активируйте SDK, затем вызывайте его методы.
- Шаги 1 и 3: нужны только при интеграции MMP или аналитического SDK (AppsFlyer, Adjust, Branch, PostHog).
- Шаг 4: нужен только если ваше приложение аутентифицирует пользователей и получает customer user ID после запуска.
Если вы знаете customer user ID в момент запуска приложения, передайте его в AdaptyConfig.Builder до вызова activate() (шаг 2a). В этом случае анонимный профиль не создаётся, поэтому шаг 4 не нужен.
| Шаг | Вызов | Когда | Примечания |
|---|---|---|---|
| 1 | Инициализируйте MMP или аналитический SDK (AppsFlyer, Adjust, PostHog, Branch) | При запуске приложения, первым | Дождитесь callback с UID от MMP, например getAppsFlyerUID. |
| 2a | Adapty.activate(context, AdaptyConfig.Builder("KEY").withCustomerUserId(...).build()) | При запуске приложения, после шага 1, если у вас есть customer user ID | Рекомендуется. Анонимный профиль не создаётся. |
| 2b | Adapty.activate(context, AdaptyConfig.Builder("KEY").build()) без customerUserId | При запуске приложения, после шага 1, если у вас нет customer user ID (или он не используется) | Adapty создаёт анонимный профиль. |
| 3 | Adapty.setIntegrationIdentifier(AdaptyIntegrationIdentifier.appsflyerId(uid)) { error -> ... } | После шага 2, до любых вызовов, связанных с действиями пользователя | Обязательно, чтобы ID из MMP попали в нужный профиль. Передайте список идентификаторов, чтобы задать несколько MMP за один вызов. |
| 4 | Adapty.identify("YOUR_USER_ID") { error -> ... } | После шага 3 (или шага 2, если MMP нет), до шага 5 — только при пути 2b с аутентификацией | Используйте completion callback. Параллельные вызовы во время identify могут попасть на анонимный профиль. |
| 5 | getPaywall, getPaywallProducts, restorePurchases, makePurchase, updateExternalAttribution, updateProfile | После шага 4, если вызывается identify; иначе после шага 3 (или шага 2, если MMP нет) | Этим вызовам нужен стабильный профиль. |
Пропуск этих шагов приводит к потере уровня доступа у вернувшихся пользователей, отсутствию appsflyer_id в профилях и показу пейволов не той аудитории.
Получение плейсмента сразу после updateProfile
Если вы вызываете updateProfile для установки кастомных атрибутов и затем запрашиваете плейсмент (getPaywall) в той же сессии, дождитесь завершения updateProfile перед запросом. Если запустить их одновременно, SDK может вычислить хеш сегмента плейсмента по атрибутам, которые ещё не успели примениться, — это добавит лишний retry-запрос перед получением ответа. Если retry завершится ошибкой, см. Обработка ошибок в Android SDK.
Установки через web2app и веб-воронки
Если пользователь совершил покупку через веб-чекаут (Stripe, Paddle) и затем установил нативное приложение, первый вызов activate() на устройстве создаёт новый анонимный профиль. Этот профиль не связан с веб-профилем. Если вы можете получить customer user ID до запуска приложения (из процесса авторизации или install referrer), передайте его напрямую в AdaptyConfig.Builder. В противном случае веб-покупка останется невидимой на устройстве до тех пор, пока вы не вызовете identify("YOUR_USER_ID"), а затем restorePurchases.
Какие метаданные передавать при каждом веб-чекауте, смотрите здесь: