Настройка SKAN 4.0 для атрибуции iOS-приложения
SKAdNetwork 4.0 (SKAN 4.0) появился с iOS 16.1 и принёс несколько важных изменений по сравнению с SKAN 2.x/3.x: три постбэка вместо одного, coarse value как дополнение к fine conversion value, а также lockWindow API для явного управления таймером. Если ваше приложение работает с рекламными сетями, поддерживающими SKAN 4.0, — переходить стоит, потому что три постбэка дают принципиально больше информации о жизненном цикле пользователя в первые 35 дней.
Что изменилось в SKAN 4.0
Три постбэка вместо одного
В SKAN 2.x/3.x рекламная сеть получала ровно один постбэк — когда истекал таймер конверсии. SKAN 4.0 вводит три временных окна:
| Постбэк | Временное окно | Что содержит |
|---|---|---|
| Первый | 0–2 дня после установки | fine value (0–63) + coarse value + source identifier |
| Второй | 3–7 дни | coarse value (low/medium/high) |
| Третий | 8–35 дни | coarse value |
Второй и третий постбэки отправляются только если пользователь проявлял активность в соответствующем окне. Это позволяет рекламной сети видеть, остался ли пользователь активным на 7-й и 35-й день — без первого постбэка это было невозможно.
Fine value и coarse value
Fine conversion value — прежние 6 бит (0–63). Остаётся только в первом постбэке и только при высоком crowd anonymity (Apple не раскрывает точный порог, ориентировочно несколько тысяч установок из одной кампании).
Coarse value — новое поле с тремя значениями: low, medium, high. Отправляется во всех трёх постбэках даже при малых объёмах трафика. Менее информативно, но стабильно.
Source identifier
Новое 2–4 значное поле, заменяющее campaign ID. Первые две цифры всегда включены в постбэк, третья и четвёртая — только при достаточном crowd anonymity. Позволяет кодировать не только кампанию, но и ad set или отдельное объявление.
Интеграция SKAN 4.0
Обновление updateConversionValue
В SKAN 4.0 метод принимает три параметра:
import StoreKit
// iOS 16.1+
if #available(iOS 16.1, *) {
SKAdNetwork.updatePostbackConversionValue(
fineValue: 15, // 0–63, только для первого окна
coarseValue: .medium, // .low, .medium, .high
lockWindow: false, // true = немедленно закрыть окно, не ждать таймер
completionHandler: { error in
if let error = error {
print("SKAN update failed: \(error)")
}
}
)
}
Параметр lockWindow: true — новый в SKAN 4.0. Если вызвать с true, Apple немедленно запускает отправку постбэка без ожидания таймера. Полезно когда вы знаете, что пользователь совершил ключевое действие и дальнейшие обновления не нужны.
Backward compatibility
Приложение обязано поддерживать SKAN 3.x для iOS 14.x–16.0 и SKAN 4.0 для iOS 16.1+. Оба API нужно вызывать параллельно:
func trackPurchase(revenue: Double) {
let fineValue = encodeFineValue(revenue: revenue)
let coarseValue: SKAdNetwork.CoarseConversionValue = revenue > 20 ? .high : .medium
if #available(iOS 16.1, *) {
SKAdNetwork.updatePostbackConversionValue(
fineValue,
coarseValue: coarseValue,
lockWindow: false
) { _ in }
} else if #available(iOS 14.0, *) {
SKAdNetwork.updateConversionValue(fineValue)
}
}
Настройка в MMP
AppsFlyer и Adjust уже поддерживают SKAN 4.0, но нужно явно активировать три постбэка в настройках приложения в дашборде. По умолчанию MMP продолжает работать в режиме SKAN 3.x.
В AppsFlyer в разделе iOS App Settings → SKAdNetwork: выбрать SKAN 4.0 mode, задать coarse value mapping для второго и третьего окон.
Проектирование conversion value schema для трёх окон
Для SKAN 4.0 нужно проектировать три независимые схемы — по одной на каждое постбэк-окно:
Первое окно (0–2 дня): детальная информация о первых действиях. Fine value кодирует, например:
- 0–15: регистрация без покупки, уровень вовлечённости
- 16–31: добавил в корзину, категория продукта
- 32–63: совершил покупку, revenue bucket
Второе окно (3–7 дней): coarse value отражает retention статус:
-
low— не вернулся -
medium— открыл приложение, но без ключевого события -
high— повторная покупка или высокая вовлечённость
Третье окно (8–35 дней): аналогично второму, но для 2-го месяца жизненного цикла.
Ограничения и реальность
Crowd anonymity означает, что для небольших приложений (менее 1000–2000 установок с конкретной кампании) fine value в первом постбэке Apple заменяет на null. Coarse value приходит всегда. Это нужно учитывать при анализе: отсутствие fine value — не ошибка интеграции, а защита приватности.
Что входит в работу
- Аудит текущей SKAN-интеграции и версии SKAdNetwork в Info.plist
- Проектирование трёхуровневой conversion value schema
- Реализация
updatePostbackConversionValueс поддержкой iOS 14–16.1+ - Настройка SKAN 4.0 в AppsFlyer / Adjust
- Верификация постбэков через тестовый трафик
Сроки
3–5 дней. Большую часть времени занимает проектирование схемы и согласование с рекламной командой, не сам код. Стоимость рассчитывается индивидуально.







