---
title: "Показ пейвола с таргетингом Apple Ads при первом запуске в Kotlin Multiplatform SDK"
description: "Ждите атрибуции Apple Ads перед запросом пейвола в Kotlin Multiplatform с помощью AdaptyProfile.appliedAttributionSources."
---

> **AI agents**: to search Adapty docs faster and with fewer tokens, install the Adapty skill. Claude Code (self-updating via plugin): `claude plugin marketplace add adaptyteam/adapty-skills && claude plugin install adapty-skills@adapty` — other tools: `npx skills add adaptyteam/adapty-skills --all`

Эта статья относится к iOS-сборке вашего приложения. Атрибуция Apple Ads доступна только на iOS.

Apple Ads (AA) атрибуция поступает асинхронно после `Adapty.activate()`. Если вы вызовете `getFlow` слишком рано, атрибуция может ещё не поступить, и Adapty разрешит плейсмент относительно аудитории по умолчанию — минуя ваши пейволы с AA-сегментацией. `AdaptyProfile.appliedAttributionSources` позволяет приложению определить, когда AA-атрибуция применена к профилю, чтобы запрос пейвола подождал корректного разрешения AA-сегментации.

:::important
Это свойство отображает только данные Apple Ads. Атрибуция от других провайдеров отображается в профилях пользователей и доступна в фильтрах сегментов, но пока не здесь.
:::

## Прежде чем начать \{#before-you-start\}

Вам потребуется:
- Adapty Kotlin Multiplatform SDK **4.0** или выше.
- Apple Ads, настроенный для приложения в Adapty. См. [Apple Ads](apple-search-ads).

:::note
В примерах используются названия API из SDK 4.0. В SDK 3.x пейволы получают с помощью `getPaywall`/`getPaywallForDefaultAudience`, которые возвращают `AdaptyPaywall`. См. [Миграция Adapty Kotlin Multiplatform SDK на v4](migration-to-kmp-sdk-v4).
:::

## Как это работает \{#how-it-works\}

После вызова `Adapty.activate()` SDK в фоне запрашивает атрибуцию Apple Ads у Apple и передаёт результат в бэкенд Adapty. Когда AA становится активным источником атрибуции для профиля, SDK доставляет обновлённый `AdaptyProfile` в ваш `OnProfileUpdatedListener`, где в списке `appliedAttributionSources` появляется `"apple_search_ads"`.

Пустой список может означать любое из следующего:

- Атрибуция Apple Ads для этого профиля ещё не была обработана.
- Атрибуция вообще не поступала.
- Атрибуция пришла от другого провайдера, который этот список не отображает.

Даже с пустым списком вызов `getFlow` абсолютно безопасен — Adapty обрабатывает запрос относительно той аудитории, которая соответствует текущему состоянию профиля, как правило это аудитория по умолчанию.

:::important
Ожидание применяется только при **первом запуске**. Как только атрибуция Apple Ads будет записана, она сохраняется в профиле навсегда. При каждом последующем запуске кешированный профиль уже содержит `"apple_search_ads"` в `appliedAttributionSources`, слушатель срабатывает с этим значением немедленно, и `getFlow` возвращает пейвол, сегментированный по Apple Ads, без каких-либо задержек.
:::

## Реализация \{#implementation\}

При первом запуске отслеживайте `"apple_search_ads"` в профиле и установите жёсткий таймаут — если атрибуция Apple Ads так и не придёт, эти пользователи всё равно должны увидеть пейвол.

1. **Активируйте SDK.** См. [Установка и настройка Kotlin Multiplatform SDK](sdk-installation-kotlin-multiplatform).
2. **Подпишитесь на обновления профиля** с помощью `Adapty.setOnProfileUpdatedListener`. Если вы ещё не настроили слушатель, см. [Отслеживание обновлений подписки](kmp-check-subscription-status#listen-to-subscription-updates).
3. **Отслеживайте появление `"apple_search_ads"` в `appliedAttributionSources`.** Когда он появится, запросите пейвол — Adapty вернёт вариант, сегментированный по Apple Ads:

```kotlin
Adapty.setOnProfileUpdatedListener { profile ->
    if ("apple_search_ads" in profile.appliedAttributionSources) {
        // load the paywall via Adapty.getFlow(placementId)
    }
}
```

4. **Запустите таймер на 3–5 секунд параллельно с подпиской.** Если таймер сработает раньше, чем появится `"apple_search_ads"`, запросите пейвол для аудитории по умолчанию с помощью `getFlowForDefaultAudience`. Он возвращает пейвол без ожидания сегментации.

Какой бы путь ни сработал первым, он должен загрузить пейвол; второй путь нужно пропустить. Используйте единый флаг состояния (например, `hasLoadedPaywall`) для дедупликации, чтобы пейвол не запрашивался дважды. Настройте [резервный пейвол](kmp-use-fallback-paywalls) для плейсмента, чтобы пользователь не застрял при сбое сетевого запроса.

`setOnProfileUpdatedListener` принимает только один слушатель. Если в вашем приложении он уже используется для других целей (например, для [отслеживания обновлений подписки](kmp-check-subscription-status#listen-to-subscription-updates)), добавьте проверку в существующий слушатель, а не регистрируйте второй.