Порядок вызовов в iOS 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, затем вызывайте его методы.
- Шаги 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 нет) | Эти вызовы требуют стабильного профиля. |
Пропуск этих шагов приводит к потере уровня доступа у вернувшихся пользователей, отсутствию appsflyer_id в профилях и показу пейволов для неправильной аудитории.
Установки через web2app и веб-воронки
Если пользователь совершает покупку через веб-чекаут (Stripe, Paddle, FunnelFox), а затем устанавливает нативное приложение, первый вызов activate() на устройстве создаёт новый анонимный профиль. Этот профиль не связан с веб-профилем. Если вы можете определить пользовательский ID до запуска приложения (из вашего auth-флоу или install referrer) — передайте его напрямую в activate(). В противном случае веб-покупка останется невидимой на устройстве, пока вы не вызовете identify("YOUR_USER_ID"), а затем restorePurchases.
Какие метаданные передавать при каждом веб-чекауте, смотрите здесь: