Руководство по оптимизации ATT в Apple: как повысить показатели согласия на ATT
opoinstall
2026-08-20
5 min read
Как оптимизировать показатели согласия на запросы App Tracking Transparency (ATT)? Повышение эффективности процесса получения разрешений ATT предполагает предоставление понятного контекста на предварительном этапе, составление точного описания в параметре NSUserTrackingUsageDescription, а также выбор подходящего момента в пользовательском сценарии для показа системного запроса авторизации. Влияние на уровень разрешений следует измерять эмпирическим путем.
Идентификатор для рекламодателей (IDFA) — это сбрасываемый идентификатор устройства от Apple, используемый для атрибуции и измерения эффективности маркетинговых кампаний в iOS. В рамках концепции App Tracking Transparency приложения могут получать доступ к IDFA только после получения явного согласия пользователя через запрос авторизации ATTrackingManager.
Фреймворк Apple, требующий получения разрешения пользователя перед отслеживанием его действий в различных приложениях и на сайтах.
ATTrackingManager
Встроенный API AppTrackingTransparency, используемый для запроса разрешения на отслеживание.
Предотвращающий праймер / Пре-праймер
Экономика доступа к IDFA и оптимизации согласий ATT
Роль авторизованного доступа к IDFA в современных измерениях на iOS
Авторизованный доступ к IDFA может поддерживать рабочие процессы атрибуции и измерения на уровне отдельных пользователей, когда использование данных приложением соответствует требованиям ATT и условиям ваших партнеров по измерениям. Если разрешение на отслеживание недоступно, команды, которым по-прежнему необходимы измерения эффективности, могут использовать независимые платформенные подходы, такие как AdAttributionKit или существующие интеграции со SKAdNetwork.
При наличии авторизации IDFA предоставляет детерминированный ключ объединения для поддерживаемых интеграций с рекламными сетями, обеспечивая сопоставление конверсий на уровне кампаний без применения статистического моделирования. Если в авторизации отказано, приложения переводят измерения на нативные фреймворки платформы.
Проблема немедленных запросов при первом запуске
Показ запроса на авторизацию отслеживания сразу при первом запуске технически разрешен Apple, но он может предоставлять меньше контекста для принятия осознанного решения, поскольку пользователь еще не успел оценить функциональность приложения:
Отсутствие доверия к продукту: Новые пользователи еще не успели сформировать уверенность в функциональности приложения, ценности бренда или надежности защиты данных.
Неясный контекст: Нативное системное окно появляется без предварительного объяснения, из-за чего осторожные пользователи по умолчанию выбирают вариант «Просить приложение не отслеживать».
Усталость от разрешений: Одновременный показ нескольких системных запросов (таких как push-уведомления, ATT и доступ к геопозиции) во время первого запуска создает излишний барьер и увеличивает показатель отказов на этапе онбординга. Документация API Apple отмечает, что если системное окно разрешений уже ожидает показа, последующие запросы авторизации появляться не будут.
Эмпирическая оценка эффективности согласий
Достижимый уровень согласий зависит от категории приложения, доверия аудитории, тайминга показа и ясности текстов. Командам следует оценивать варианты оптимизации с помощью контролируемого A/B-тестирования, а не полагаться на фиксированные отраслевые ориентиры.
Смотрите также: IDFA ──> Модель мобильной атрибуции
Доступ к IDFA строго регулируется перечислением ATTrackingManager.AuthorizationStatus:
notDetermined (0): Пользователю еще не показывали диалоговое окно авторизации.
restricted (1): Доступ к устройству ограничен родительским контролем, образовательными профилями конфигурации или корпоративными системами MDM; разрешение на отслеживание не может быть предоставлено, а переключатель в настройках заблокирован.
denied (2): Приложение не получило разрешение на доступ к данным приложения для отслеживания после того, как пользователь отклонил запрос.
authorized (3): Пользователь разрешил отслеживание. На поддерживаемых устройствах iOS и iPadOS это обычно открывает доступ к ненулевому рекламному идентификатору.
Правило однократного системного запроса
Операционная система iOS применяет правило однократного показа для метода ATTrackingManager.requestTrackingAuthorization. Как только пользователь взаимодействует с нативным модальным окном, выбирая «Разрешить» или «Просить приложение не отслеживать», система запоминает определенный статус и больше не отображает этот запрос в течение всего времени установки приложения.
Хотя повторный системный запрос не появится, пользователи могут вручную изменить настройки авторизации отслеживания в любой момент в системных настройках iOS.
Как iOS обеспечивает обнуление идентификатора при отказе в отслеживании
Начиная с iOS 14.5, рекламный идентификатор обычно возвращает одни нули (00000000-0000-0000-0000-000000000000), если разрешение на отслеживание не было предоставлено. Разработчикам следует проверять как статус авторизации ATT, так и возвращаемое значение идентификатора по запросу, а не предполагать, что закэшированная строка остается действительной на протяжении всей работы приложения.
Архитектура UX с высокой конверсией: стратегия предварительных праймеров
Анатомия эффективного контекстного праймера: требования Apple HIG
Согласно Руководству по интерфейсам Apple в сфере конфиденциальности (HIG), приложения могут отображать кастомный предварительный экран перед системным запросом разрешений, если требуется дополнительный контекст. Тем не менее, Apple накладывает строгие правила на дизайн таких предварительных экранов:
Одна кнопка действия: На предварительном экране должна быть только одна кнопка (например, «Продолжить» или «Далее»), которая ведет непосредственно к системному запросу. На нем не должно быть кнопок «Отмена», «Закрыть» или «Не сейчас», которые обходят или откладывают системное уведомление.
Отсутствие имитации интерфейса: Экран-праймер ни в коем случае не должен визуально копировать нативный системный диалог iOS или содержать бутафорские кнопки с надписью «Разрешить».
Отсутствие визуального давления: Интерфейс не должен использовать графику, стрелки или контрастный дизайн, цель которых — манипулировать пользователем или подталкивать его к выбору варианта «Разрешить» в следующем системном запросе.
Соблюдение правила 5.1.2 руководства по проверке приложений App Store
Запрет стимулируемого отслеживания: Приложениям категорически запрещено предлагать финансовые бонусы, виртуальную валюту, премиум-контент или скидки в обмен на согласие на отслеживание по стандарту ATT. Это нарушает правило 5.1.2 и может привести к отклонению приложения.
Запрет блокировки ключевого функционала: Приложения не могут блокировать основные функции, препятствовать созданию аккаунта или ухудшать производительность, если пользователь отклоняет запрос на отслеживание.
Приоритет выбора пользователя: Окончательное решение пользователя об отслеживании всегда должно приниматься исключительно в нативном системном окне Apple.
Этап 1: Онбординг пользователя / Раскрытие ценности продукта
│
▼
Этап 2: Экран контекстного предварительного праймера
(Одно действие «Продолжить» ── Объясняет цель)
│
▼
Этап 3: Нативный системный модальный интерфейс ATTrackingManager в iOS
(Пользователь выбирает «Разрешить» или «Просить приложение не отслеживать»)
│
┌────────────┴────────────┐
▼ ▼
[.authorized] [.denied]
ATT разрешено Плавный переход
(IDFA обычно к API платформы
доступен) (AdAttributionKit / SKAN)
Оптимизация строки NSUserTrackingUsageDescription
Настройка Info.plist для обеспечения прозрачности целей
Ключ NSUserTrackingUsageDescription в файле Info.plist определяет пояснительную строку текста, которая отображается непосредственно в нативном системном оповещении ATT от Apple. Согласно документации Apple, этот текст должен быть лаконичным, конкретным и точно объяснять, как именно используются данные отслеживания.
Тестирование различных формулировок без изменения базового описания
При тестировании вариантов текста каждый проверенный вариант должен точно и полностью описывать реальные практики отслеживания приложения:
Фокус на персонализации: Объясняет, как данные используются для настройки рекомендаций контента и предложений продуктов.
Фокус на релевантности рекламы: Объясняет, как данные используются для демонстрации актуальных предложений и предотвращения повторения рекламы.
Фокус на измерении кампаний: Объясняет, как данные применяются для оценки эффективности маркетинговых партнерств.
Приведенная ниже конфигурация демонстрирует пример NSUserTrackingUsageDescription. Используйте ее только в том случае, если формулировка точно отражает реальные методы сбора данных вашим приложением:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSUserTrackingUsageDescription</key>
<string>Ваши данные будут использоваться для предоставления персональных рекомендаций по продуктам, релевантных промо-предложений и оценки эффективности рекламных кампаний.</string>
</dict>
</plist>
Проектирование оптимального тайминга запроса в жизненном цикле пользователя
Факторы выбора времени показа на пути пользователя
Хотя запрос разрешения ATT при первом запуске разрешен технически, показ диалогового окна после того, как пользователь ощутит ценность продукта, может предоставить более понятный контекст для запроса:
Триггер после онбординга: Показ запроса после завершения настройки аккаунта и первоначальных предпочтений пользователя.
Контекстный триггер по достижении вехи: Показ уведомления после выполнения ключевого действия (например, завершения вводного обучения в игре, сохранения товара в избранное в шопинг-приложении или добавления статьи в закладки в медиа-приложении).
Программная реализация ATTrackingManager на Swift
Управление активным состоянием приложения и потокобезопасностью
Согласно документации API Apple, метод ATTrackingManager.requestTrackingAuthorization отображает модальное окно только тогда, когда приложение находится в состоянии .active. Если другой запрос на разрешение активен или находится в очереди, системное оповещение не появится, а параллельные запросы операционной системой не выстраиваются в очередь.
Приведенный ниже код отделяет логику управления статусом авторизации от демонстрационного кастомного предварительного экрана:
import UIKit
import AppTrackingTransparency
import AdSupport
final class ATTManager {
static let shared = ATTManager()
private init() {}
/// Оценивает текущий статус авторизации
var currentStatus: ATTrackingManager.AuthorizationStatus {
return ATTrackingManager.trackingAuthorizationStatus
}
/// Определяет, можно ли направить запрос на авторизацию
var canRequestAuthorization: Bool {
return currentStatus == .notDetermined
}
/// Запрашивает авторизацию отслеживания с проверкой активного состояния приложения
/// - Parameter completion: Замыкание, возвращающее определенный статус авторизации
func requestAuthorization(completion: @escaping (ATTrackingManager.AuthorizationStatus) -> Void) {
guard canRequestAuthorization else {
completion(currentStatus)
return
}
// Проверяем, что приложение активно перед вызовом requestTrackingAuthorization
guard UIApplication.shared.applicationState == .active else {
print("Запрос ATT пропущен: приложение неактивно. Повторите вызов в активном состоянии, если статус остается notDetermined.")
completion(currentStatus)
return
}
DispatchQueue.main.async {
ATTrackingManager.requestTrackingAuthorization { status in
DispatchQueue.main.async {
switch status {
case .authorized:
// Считываем текущий рекламный идентификатор по запросу; не сохраняем IDFA в кэш.
let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString
print("ATT авторизован - IDFA доступен: \(idfa)")
case .denied:
print("ATT отклонен - Рекламный идентификатор возвращает нули")
case .restricted:
print("ATT ограничен системным профилем")
case .notDetermined:
print("Статус ATT не определен")
@unknown default:
print("Обнаружен неизвестный статус ATT")
}
completion(status)
}
}
}
}
}
/// Демонстрационный кастомный UIViewController для предварительного праймера по стандартам HIG
final class ATTPrimerViewController: UIViewController {
private let continueButton = UIButton(type: .system)
private let titleLabel = UILabel()
private let descriptionLabel = UILabel()
var onContinueTapped: (() -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
view.backgroundColor = .systemBackground
// Предотвращаем закрытие свайпом при модальном отображении для обеспечения единого сценария навигации
isModalInPresentation = true
titleLabel.text = "Помогите нам улучшить вашу работу с приложением"
titleLabel.font = .boldSystemFont(ofSize: 20)
titleLabel.textAlignment = .center
titleLabel.numberOfLines = 0
descriptionLabel.text = "Мы используем данные для настройки рекомендаций продуктов и отправки актуальных промо-предложений. На следующем экране вы увидите стандартный системный запрос Apple для подтверждения вашего выбора."
descriptionLabel.font = .systemFont(ofSize: 15)
descriptionLabel.textAlignment = .center
descriptionLabel.textColor = .secondaryLabel
descriptionLabel.numberOfLines = 0
// Рекомендации Apple HIG требуют наличия единственного действия «Продолжить» или «Далее»
continueButton.setTitle("Продолжить", for: .normal)
continueButton.titleLabel?.font = .boldSystemFont(ofSize: 17)
continueButton.addTarget(self, action: #selector(handleContinue), for: .touchUpInside)
let stack = UIStackView(arrangedSubviews: [titleLabel, descriptionLabel, continueButton])
stack.axis = .vertical
stack.spacing = 20
stack.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stack)
NSLayoutConstraint.activate([
stack.centerXAnchor.constraint(equalTo: view.centerXAnchor),
stack.centerYAnchor.constraint(equalTo: view.centerYAnchor),
stack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 32),
stack.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -32)
])
}
@objc private func handleContinue() {
// Механика отображения и скрытия носит демонстрационный характер и должна адаптироваться под навигационную архитектуру приложения.
dismiss(animated: true) { [weak self] in
self?.onContinueTapped?()
}
}
}
Восстановление после отказа: как направлять пользователей в системные настройки без нарушения правил
Когда внедрять вторичные сценарии через настройки
Когда пользователь выбирает вариант «Просить приложение не отслеживать», статус авторизации принимает значение .denied. Последующие вызовы requestTrackingAuthorization возвращают статус .denied без отображения диалогового окна. Однако, если пользователь позднее запускает функцию, которая явно выигрывает от отслеживания (например, запрашивает параметры персонализированной рекламы в профиле аккаунта), приложение может предложить ненавязчивый переход к настройкам iOS.
Использование UIApplication.openSettingsURLString
Для перехода пользователя к странице настроек приложения используйте UIApplication.openSettingsURLString:
Обратите внимание, что этот API открывает страницу настроек конкретного приложения; он не обеспечивает прямую глубокую ссылку (деп-линк) на глобальный экран «Настройки» > «Конфиденциальность и безопасность» > «Трекинг».
Ограничения правил App Store
Запрет назойливых напоминаний: Не показывайте повторяющиеся баннеры с призывом включить отслеживание в настройках.
Запрет блокировки функций: Никогда не отключайте основные функции из-за того, что отслеживание остается выключенным в настройках.
Сравнительная матрица решений: стратегии предварительных праймеров против запросов при первом запуске
Параметр
Стандартный запрос при первом запуске
Жестко заблокированное модальное окно разрешения
Предварительный праймер по стандартам HIG
Контекст пользователя до запроса
Низкий (нет взаимодействия с продуктом)
Различный (блокирует доступ)
Контекстный (показывается после нужного взаимодействия)
Рекомендации Apple по интерфейсу и разрешениям
Разрешено, если запрос и использование данных соответствуют правилам
Не разрешено, если доступ или вознаграждение зависят от отслеживания
Разрешено при соблюдении ограничений предварительных уведомлений HIG и правил отслеживания
Ограничения интерфейса предварительных уведомлений Apple
Н/Д
Н/Д
Одно действие «Продолжить/Далее»; отсутствие поддельных алертов
Тайминг прерывания запросом
Сразу при запуске
Блокирующий
Контекстная веха
Наблюдаемый уровень согласий
Необходимо измерять эмпирически
Не разрешено
Необходимо измерять эмпирически
Часто задаваемые вопросы (FAQ)
Может ли приложение предлагать внутреннюю валюту или скидки в обмен на предоставление разрешения ATT?
Нет. Правило 5.1.2 Руководства по проверке приложений App Store прямо запрещает предлагать поощрения — такие как виртуальная валюта, дополнительные функции, денежные средства или скидки — в обмен на согласие пользователя на отслеживание. Это нарушает правила платформы и может привести к отклонению приложения.
Может ли приложение показать второй запрос ATT, если пользователь изначально выбрал «Просить приложение не отслеживать»?
Нет. iOS разрешает показ нативного запроса <code>ATTrackingManager.requestTrackingAuthorization</code> только один раз за все время установки приложения. Если пользователь отклоняет разрешение, последующие вызовы возвращают статус <code>.denied</code> без вывода диалогового окна. Чтобы изменить разрешение, пользователь должен вручную обновить свой выбор отслеживания в настройках iOS.
Нарушает ли предварительный праймер правила App Store от Apple?
Apple разрешает использование кастомных экранов с предварительным объяснением, когда требуется дополнительный контекст, при условии соответствия Руководству по интерфейсам (HIG): экран должен содержать единственное действие «Продолжить» или «Далее», ведущее прямо к системному запросу; на нем не должно быть кнопок «Отмена» или «Закрыть», он не должен имитировать нативный системный алерт и не должен содержать формулировки или визуальные подсказки, оказывающие давление на выбор пользователя в пользу «Разрешить».
Резюме и фреймворк принятия решений
Повышение удобства получения разрешений ATT требует четкого раскрытия целей и учета контекста тайминга. Когда требуется дополнительное объяснение, предварительный праймер, соответствующий стандартам HIG, позволяет сформировать контекст перед системным запросом, приводя процесс получения разрешений в соответствие с опубликованными правилами Apple в отношении интерфейсов и отслеживания.
Если после отказа в ATT по-прежнему необходим контекст для атрибуции или онбординга, приложения могут использовать разрешенные независимые механизмы, такие как AdAttributionKit, существующие интеграции со SKAdNetwork или чисто контекстную маршрутизацию силами первой стороны (first-party), которая не выходит за рамки правил отслеживания Apple.
Информацию о контекстной маршрутизации для конкретных продуктов и поведении атрибуции см. в документации OpoInstall и оценивайте реализацию на соответствие применимым требованиям Apple к отслеживанию.