---
title: "Порядок вызовов в iOS SDK"
description: "Избегайте потери доступа к премиум-функциям, пропущенной атрибуции и периодических ошибок #2002, вызывая методы Adapty SDK в правильном порядке."
---

`Adapty.activate()` должен завершиться раньше, чем вы вызовете любой другой метод Adapty SDK. До его завершения у SDK нет состояния. Любой вызов, сделанный до или параллельно с `activate()`, завершится ошибкой [`#2002 notActivated`](ios-sdk-error-handling#network-errors).
Если приложение аутентифицирует пользователей и вы получаете customer user ID после запуска, вызовите `Adapty.identify()` в этот момент. Не вызывайте методы, связанные с действиями пользователя, пока `identify` не завершится. Вызовы, которые выполняются параллельно с ним, либо завершаются ошибкой [`#3006 profileWasChanged`](ios-sdk-error-handling#general-errors), либо применяются к анонимному профилю, созданному при активации. В таком случае атрибуция, MMP ID вроде `appsflyer_id` и принадлежность установки не всегда переносятся на идентифицированный профиль. Если приложение не аутентифицирует пользователей, пропустите `identify` и продолжайте работу с анонимным профилем.
MMP и аналитические SDK (AppsFlyer, Adjust, Branch, PostHog) подчиняются тому же правилу. Инициализируйте их первыми и дождитесь коллбэков с UID, прежде чем вызывать `Adapty.activate`. Иначе MMP ID попадёт в краткий анонимный профиль и не всегда переносится в идентифицированный. Подробнее об AppsFlyer — в разделе [AppsFlyer](appsflyer).
## Правильный порядок \{#the-correct-order\}

Ваш путь зависит от двух вещей: когда вы узнаёте идентификатор пользователя (customer user ID) и используете ли вы MMP или аналитический SDK.

- **Шаги 2 и 5**: обязательны для каждого приложения. Активируйте SDK, затем вызывайте его методы.
- **Шаги 1 и 3**: нужны только если вы интегрируете MMP или аналитический SDK (AppsFlyer, Adjust, Branch, PostHog).
- **Шаг 4**: нужен только если ваше приложение аутентифицирует пользователей и получает customer user ID после запуска.
Если ID пользователя известен при запуске приложения, передайте его напрямую в `activate()` (шаг 2a). В этом случае анонимный профиль не создаётся, поэтому шаг 4 не нужен.
| Шаг | Вызов | Когда | Примечания |
|------|---------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------|
| 1    | Инициализируйте ваш MMP или аналитический SDK (AppsFlyer, Adjust, PostHog, Branch)                            | При запуске приложения, первым делом                                                   | Дождитесь коллбэка UID от MMP, например `getAppsFlyerUID`.                                     |
| 2a   | `Adapty.activate(with: config)` с указанным `customerUserId` в конфиге                                        | При запуске приложения, после шага 1, если у вас есть customer user ID                 | Рекомендуется. Анонимный профиль не создаётся.                                                 |
| 2b   | `Adapty.activate(with: config)` без `customerUserId`                                                          | При запуске приложения, после шага 1, если у вас нет customer user ID (или вы его не собираете) | Adapty создаёт анонимный профиль.                                                              |
| 3    | `Adapty.setIntegrationIdentifier(key:value:)` для каждого MMP                                                 | После шага 2, до любого пользовательского вызова                                       | Обязательно, чтобы идентификаторы MMP попали в правильный профиль.                             |
| 4    | `try await Adapty.identify("YOUR_USER_ID")`                                                                   | После шага 3 (или шага 2, если MMP нет), до шага 5 — только на пути 2b с аутентификацией | Всегда используйте `await`. Параллельные вызовы во время `identify` вызывают ошибку `#3006 profileWasChanged`. |
| 5    | `getPaywall`, `getPaywallProducts`, `restorePurchases`, `makePurchase`, `updateAttribution`, `updateProfile`  | После шага 4, если вы вызываете `identify`; иначе после шага 3 (или шага 2, если MMP нет) | Эти вызовы требуют стабильного профиля.                                                        |
:::important
Пропуск этих шагов приводит к потере уровня доступа у вернувшихся пользователей, отсутствию `appsflyer_id` в профилях и показу пейволов для неправильной аудитории.
:::
## Установки через web2app и веб-воронки \{#web2app-and-web-funnel-installs\}

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

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

- [Stripe](stripe)
- [Paddle](paddle)