Порядок вызовов в Unity SDK
Adapty.Activate() должен завершиться до вызова любого другого метода Adapty SDK. Пока не сработает callback завершения, SDK не имеет состояния. Любой вызов, сделанный до или параллельно с Activate(), завершится ошибкой #2002 notActivated.
Если ваше приложение аутентифицирует пользователей и вы получаете customer user ID после запуска, вызовите Adapty.Identify() в этот момент. Не вызывайте методы, требующие действий пользователя, пока не сработает колбэк Identify. Вызовы, конкурирующие с ним, либо завершаются ошибкой #3006 profileWasChanged, либо применяются к анонимному профилю, созданному при активации. В таком случае атрибуция, MMP ID (например, appsflyer_id) и принадлежность установки не всегда переносятся на идентифицированный профиль. Если ваше приложение не аутентифицирует пользователей, пропустите Identify и продолжайте работу с анонимным профилем.
MMP и аналитические SDK (AppsFlyer, Adjust, Branch, PostHog) подчиняются тому же правилу. Сначала инициализируйте их и дождитесь коллбэков с UID, а затем вызывайте Adapty.Activate. Иначе MMP ID попадёт в кратковременный анонимный профиль и не всегда переносится в идентифицированный. Подробнее об особенностях AppsFlyer см. в разделе AppsFlyer.
Правильный порядок
Ваш путь зависит от двух вещей: когда вы узнаёте customer user ID и используете ли вы MMP или аналитический SDK.
- Шаги 2 и 5: Обязательны для каждого приложения. Активируйте SDK, затем вызывайте методы SDK.
- Шаги 1 и 3: Нужны только если вы интегрируете MMP или аналитический SDK (AppsFlyer, Adjust, Branch, PostHog).
- Шаг 4: Нужен только если ваше приложение аутентифицирует пользователей и получает customer user ID после запуска.
Если у вас есть customer user ID при запуске приложения, передайте его напрямую в Activate() (шаг 2a). В этом случае анонимный профиль не создаётся, поэтому шаг 4 не нужен.
| Шаг | Вызов | Когда | Примечания |
|---|---|---|---|
| 1 | Инициализируйте MMP или аналитический SDK (AppsFlyer, Adjust, PostHog, Branch) | При запуске приложения, первым | Дождитесь колбэка с UID от MMP, например getAppsFlyerId. |
| 2a | Adapty.Activate(builder.Build(), ...) с SetCustomerUserId на билдере | При запуске приложения, после шага 1, если у вас есть customer user ID | Рекомендуется. Анонимный профиль не создаётся. |
| 2b | Adapty.Activate(builder.Build(), ...) без SetCustomerUserId | При запуске приложения, после шага 1, если у вас нет customer user ID (или вы его не собираете) | Adapty создаёт анонимный профиль. |
| 3 | Adapty.SetIntegrationIdentifier(key, value, callback) для каждого MMP | После шага 2, до любых вызовов, инициированных действиями пользователя | Необходимо, чтобы ID из MMP попали в правильный профиль. |
| 4 | Adapty.Identify("YOUR_USER_ID", callback) | После шага 3 (или шага 2, если нет MMP), до шага 5 — только при пути 2b с аутентификацией | Дождитесь колбэка завершения. Конкурентные вызовы во время Identify приводят к ошибке #3006 profileWasChanged. |
| 5 | GetPaywall (GetFlow в SDK v4), GetPaywallProducts, RestorePurchases, MakePurchase, UpdateAttribution (UpdateExternalAttribution в SDK 4.1), UpdateProfile | После шага 4, если вызывается Identify; иначе после шага 3 (или шага 2, если нет MMP) | Эти вызовы требуют стабильного профиля. |
Пропуск этих шагов приведёт к потере уровня доступа у вернувшихся пользователей, отсутствию appsflyer_id в профилях и отображению пейволов для неправильной аудитории.
Установки через web2app и веб-воронки
Если пользователь совершает покупку через веб-чекаут (Stripe, Paddle) и затем устанавливает нативное приложение, первый вызов Activate() на устройстве создаёт новый анонимный профиль. Этот профиль не связан с веб-профилем. Если вы можете получить customer user ID до запуска приложения (из потока аутентификации или реферера установки) — передайте его напрямую в Activate(). В противном случае веб-покупка останется невидимой на устройстве до тех пор, пока вы не вызовете Identify("YOUR_USER_ID"), а затем RestorePurchases.
Подробнее о метаданных, которые нужно передавать при каждом веб-чекауте, читайте здесь: