Порядок вызовов в Kotlin Multiplatform SDK

Adapty.activate() должен завершиться до того, как вы вызовете любой другой метод Adapty SDK. Пока он не выполнен, SDK не имеет состояния. Любой вызов, сделанный до или параллельно с activate(), завершится ошибкой активации. См. Обработка ошибок в Kotlin Multiplatform SDK. Если ваше приложение аутентифицирует пользователей и вы получаете customer user ID после запуска, вызовите Adapty.identify() в этот момент. Не вызывайте методы, зависящие от действий пользователя, до завершения identify. Вызовы, конкурирующие с ним, либо вернут ошибку, либо попадут в анонимный профиль, созданный при активации. В этом случае атрибуция, 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 в момент запуска приложения, передайте его в AdaptyConfig.Builder до вызова activate() (шаг 2a). В этом случае анонимный профиль никогда не создаётся, поэтому шаг 4 не нужен. | Шаг | Вызов | Когда | Примечания | |------|---------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------| | 1 | Инициализируйте MMP или аналитический SDK (AppsFlyer, Adjust, PostHog, Branch) | При запуске приложения, первым делом | Дождитесь колбэка UID от MMP, например getAppsFlyerUID. | | 2a | Adapty.activate(configuration = AdaptyConfig.Builder("KEY").withCustomerUserId(...).build()) | При запуске приложения, после шага 1, если у вас есть customer user ID | Рекомендуется. Анонимный профиль не создаётся. | | 2b | Adapty.activate(configuration = AdaptyConfig.Builder("KEY").build()) без withCustomerUserId | При запуске приложения, после шага 1, если у вас нет customer user ID (или он вам не нужен) | Adapty создаёт анонимный профиль. | | 3 | Adapty.setIntegrationIdentifier("appsflyer_id", uid) для каждого MMP | После шага 2, до любых пользовательских вызовов | Обязательно — чтобы ID MMP попали в нужный профиль. | | 4 | Adapty.identify("YOUR_USER_ID").onSuccess { ... }.onError { ... } | После шага 3 (или шага 2, если MMP нет), до шага 5 — только при пути 2b с аутентификацией | Дождитесь onSuccess перед любыми пользовательскими вызовами. Параллельные вызовы во время identify могут попасть на анонимный профиль. | | 5 | getPaywall, getPaywallProducts, restorePurchases, makePurchase, updateAttribution, updateProfile | После шага 4, если вызываете identify; иначе после шага 3 (или шага 2, если MMP нет) | Этим вызовам нужен стабильный профиль. |

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

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

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

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