Порядок вызовов в Flutter SDK

Adapty().activate() должен завершиться до вызова любых других методов Adapty SDK. До его завершения 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, например getAppsFlyerUID.
2aAdapty().activate(configuration: ...) с withCustomerUserId в конфигурацииЗапуск приложения, после шага 1, если у вас есть customer user IDРекомендуется. Анонимный профиль не создаётся.
2bAdapty().activate(configuration: ...) без withCustomerUserIdЗапуск приложения, после шага 1, если у вас нет customer user ID (или вы его вообще не собираете)Adapty создаёт анонимный профиль.
3Adapty().setIntegrationIdentifier(key: ..., value: ...) для каждого MMPПосле шага 2, до любого пользовательского вызоваОбязательно, чтобы ID из MMP попали на правильный профиль.
4await Adapty().identify(customerUserId)После шага 3 (или шага 2, если MMP нет), до шага 5 — только при пути 2b с аутентификациейВсегда await. Параллельные вызовы во время identify вернут #3006 profileWasChanged.
5getPaywall (getFlow в SDK v4), getPaywallProducts, restorePurchases, makePurchase, updateAttribution (updateExternalAttribution в SDK 4.1), updateProfileПосле шага 4, если вызываете identify; иначе после шага 3 (или шага 2, если MMP нет)Эти вызовы требуют стабильного профиля.
Important

Пропуск этих шагов приведёт к потере уровня доступа у вернувшихся пользователей, отсутствию appsflyer_id в профилях и к тому, что пейволы будут показываться не той аудитории.

Установки через web2app и веб-воронки

Если пользователи совершают покупку через веб-чекаут (Stripe, Paddle), а затем устанавливают нативное приложение, первый вызов activate() на устройстве создаёт новый анонимный профиль. Этот профиль не связан с веб-профилем. Если вы можете определить customer user ID до запуска приложения (через авторизацию или install referrer), передайте его напрямую в activate(). В противном случае веб-покупка будет недоступна на устройстве, пока вы не вызовете identify("YOUR_USER_ID"), а затем restorePurchases.

Сведения о метаданных, которые нужно передавать при каждом веб-чекауте, смотрите здесь: