Как работает SKAdNetwork и фреймворк AppTrackingTransparency в iOS 14

Самой значимой новостью с WWDC 2020 для индустрии мобильной рекламы стало усиление роли SKAdNetwork и AppTrackingTransparency в связи с предстоящими ограничениями поддержки IDFA и других методов отслеживания рекламы. Разбираем в переводе статьи Incipia, как работает механика SKAN и AppTrackingTransparency.

SKAdNetwork

Назначение SKAdNetwork, по словам Apple, — «помочь рекламодателям измерять эффективность рекламных кампаний, при этом сохраняя конфиденциальность пользователей». Фреймворк был представлен вместе с iOS 11.3 в 2018 году, а с iOS 14 будет работать вторая версия SKAdNetwork, которая включает возможность отслеживать события. Исходя из того, что сама сущность платформы полностью относится к рекламе, в нее входят три основных компонента:

  • Рекламные сети: размечают рекламные объявления и получают постбэки об установках, когда происходит конверсия
  • Приложения как источники трафика: показывают объявления из рекламных сетей
  • Рекламируемые приложения

Рекламные сети

Чтобы получать постбэки об установках через API SKAdNetwork, рекламные сети (источники трафика) должны быть зарегистрированы в Apple. При регистрации они указывают свой URL. Регистрация источника трафика происходит путем заполнения формы запроса ID рекламной сети (чтобы увидеть форму, нужно залогиниться под своим Apple ID). После этого сеть предоставляет публичный ключ в формате PKCS#8 для проверки подписи, и ей выдается идентификатор в формате "example123.adnetwork". Этот идентификатор должен находиться в открытом доступе, чтобы разработчики могли использовать его для рекламы через данный источник.

Приложения как источники трафика

Если разработчик хочет показывать рекламу одной из сетей в своем приложении, сначала ему необходимо добавить идентификатор данной сети в свой файл Info.plist. Показ рекламируемого продукта и проверка произошла ли установка, происходят с помощью вызова метода loadProduct(withParamters:completionBlock:), которому нужен ключ рекламной сети, известный как SKStoreProductParameterAdNetworkAttributionSignature.

Рекламные сети используют ключ проверки установки, в качестве метода определяющего запуск приложения. Ключи описывают показ рекламной кампании, а содержащаяся в них информация связывает установку приложения с определенной рекламной кампанией.

Рекламируемые приложения

Две главные задачи рекламируемого приложения — это вызвать метод registerAppForAdNetworkAttribution() при первом запуске приложения, а также при необходимости обращаться к методу updateConversionValue(_:) один или несколько раз в течении определенного периода окна атрибуции (timer logic), которое будет описано далее. Оба этих метода, принадлежат фреймворку StoreKit и способны создавать оповещения об установке. Однако постбэк метода registerAppForAdNetworkAttribution() не содержит данных, относящихся к конверсии.

Последовательность событий

Согласно документации Apple, последовательность событий для гипотетического Приложения А, показывающего рекламу Приложения В, в котором пользователь совершает конверси, выглядит так:

incipia blog

Отслеживание конверсий

Как показано на диаграмме последовательности событий, существует два способа отправлять постбэки о конверсии через API SKAdNetwork:

  • registerAppForAdNetworkAttribution()
  • updateConversionValue(_:)

Обращение к методу registerAppForAdNetworkAttribution() должно происходить сразу же после первого запуска приложения, чтобы связать установку с рекламной кампанией. После первого обращения к методу, последующие не дают никакого результата. Логика окна атрибуции такая:

Логика окна атрибуции постбэка

  1. После первого обращения к registerAppForAdNetworkAttribution() запускается 24-часовой таймер.
  2. В течение 24 часов можно обращаться к updateConversionValue(_:) с использованием 6-битного целого числа, которое соответствует какому-то событию/действию пользователя в приложении
  3. Если 6-битное значение, переданное в updateConversionValue(_:), больше, чем использованное ранее, 24-часовой таймер перезапускается
  4. Как только проходит 24 часа без обращения к updateConversionValue(_:) или если передаем 6-битные значения, но ниже по значению ранее отправленных 6-битных значений, постбэк о конверсии отправляется в течение произвольного отрезка времени от 0 до 24 часов

Простой способ понять логику работы таймера в паре с updateConversionValue(_:) — это представить игру с линейным сюжетом. Допустим, каждому уровню присвоено соответствующее номеру значение конверсии (например, уровень №1 равен 1, уровень №2 равен 2):

  1. Пользователь установил приложение, идет обращение к registerAppForAdNetworkAttribution() и запускается 24-часовой таймер; значение конверсии (conversion value) в этот момент еще не передаётся;
  2. Если пользователь в течение 24 часов проходит первый уровень, идет обращение к updateConversionValue(_:) со значением 1, и 24-часовой таймер перезапускается;
  3. 24-часовой таймер будет перезапускаться и дальше, пока пользователь будет проходить каждый новый уровень в течение 24 часов после прохождения предыдущего — для каждого пройденного уровня будет идти обращение к updateConversionValue(_:) со значением последнего пройденного уровня;
  4. Это будет происходить до тех пор, пока пользователь проходит новые уровни в течение 24 часов после запуска таймера, или если пользователь достигнет 65 уровня. В таком случае updateConversionValue(_:) будет содержать максимально возможное значение 64 (т.е. возможно отправить до 64х 6-битных значений, которые соответствуют событиям, которым их присвоите). Примечание: как только произойдет одно из этих событий, запустится второй таймер со случайным значением от 0 до 24 часов, и только по его истечению будет отправлен постбэк.

Запрос постбэка

Рекламная сеть получит постбэк в таком JSON-формате:

{ "version": "2.0", "ad-network-id": "com.example", "campaign-id": 42, "transaction-id": "6aafb7a5-0170-41b5-bbe4-fe71dedf1e28", "app-id": 525463029, "attribution-signature": "MDYCGQCsQ4y8d4BlYU9b8Qb9BPWPi+ixk\\/OiRysCGQDZZ8fpJnuqs9my8iSQVbJO\\/oU1AXUROYU=" "redownload": 1, "source-app-id": 1234567891 "conversion-value": 20 }

Отслеживание событий

Как указано выше, поле со значением conversion-value должно иметь 6-битное значение (только числа без символов), и рекламная сеть несет ответственность за его интерпретацию. Основываясь на логике окна атрибуции — а больше на том факте, что наибольшее 6-битное значение равно 64 — это поле вовсе не предназначено для сбора агрегированных событий. Скорее, его функция — зафиксировать единственное наиболее значимое событие, которое пользователь выполняет в течение 24-часов с момента установки и запуска приложения.

Отслеживание кампаний

Согласно Apple, поле идентификатора кампании (campaign-id) связано с ключом SKStoreProductParameterAdNetworkCampaignIdentier, который используется рекламными сетями для определения ID кампаний. По требованиям Apple, «поле должно быть целым числом от 1 до 100». Это означает, что теперь одна из сторон будет дополнительно ответственна за присвоение ID от 1 до 100 каждой кампании рекламной сети, но еще и что в любой момент времени отслеживаться будут только 100 активных кампанийдля каждой рекламной сети.

AppTrackingTransparency

До iOS 14 IDFA можно было отключить, только специально зайдя в раздел “Реклама” настроек конфиденциальности (Settings — Privacy — Advertising) и включив ограничение трекинга (Limit Ad Tracking — LAT).

Обратите внимание на дополнительную надпись ниже тумблера: Откажитесь от получения целевой рекламы, подбираемой в соответствии с вашими интересами. Вы и дальше будете получать то же самое количество объявлений, но они будут менее релевантны для вас.

Обнаружить данную настройку довольно непросто, а непредвзятое сообщение от Apple для некоторых пользователей звучит как совет не включать ее. По этим двум причинам (в основном, из-за первой), всего 15,6% пользователей в мире включили ограничение трекинга в этом году.

Кроме того, до iOS 14 ограничение трекинга распространялось на все приложения; однако с обновлением операционной системы этот параметр не только будет находиться на уровне приложения, но теперь всем пользователям необходимо будет показывать новое диалоговое окно, если у разработчиков есть желание получить к нему доступ. Это делается через новый фреймворк AppTrackingTransparency с помощью обращения к методу requestTrackingAuthorization(completionHandler:)

Чтобы разработчики могли получить доступ к IDFA пользователя, пользователь должен выбрать опцию «Разрешить отслеживание» при отображении этого диалогового окна; диалоговое окно может отображаться только один раз при каждой установке приложения. Если пользователь выберет «Запретить приложению отслеживать», возможности показать это окно снова для этого приложения не будет.

Единственная настраиваемая часть показанного выше диалогового окна — дополнительный текст: «Ваши данные будут использоваться для показа вам персонализированной рекламы». Разработчики могут настроить NSUserTrackingUsageDescription для замены текста по умолчанию на сообщение, объясняющее пользователю, почему приложение запрашивает разрешение на использование данных для отслеживания пользователя или устройства.

Заключение

Одна из наиболее интересных идей, которую я обнаружил при исследовании ожиданий от выхода iOS 14 — использование битовой маски для отслеживания как можно большего количества информации с помощью 6-битного значения конверсии, отправляемого по API SKAdNetwork. Об этом говорится в видео Shamanth Rao. В общих чертах, идея представляет собой простую оптимизацию на основе воронки по следующей схеме:

  • Присвойте 3х битным значения ключевые события, применяющиеся как логическое “или” (а, б, в) или объедините их (г):

а) 001: регистрация

б) 010: подписка

в) 100: поделиться

г) 011: регистрация и подписка

  • Присвойте 3х битному значению (8 дней) чтобы закодировать дни, прошедшие с момента установки

Я не сомневаюсь, что некоторые, если не многие издатели приложений действительно воспользуются подобным подходом, пытаясь получить представление о действиях пользователей. Мне кажется, что это довольно находчивое использование 6-битного значения конверсии в постбэке установки. Однако в конечном итоге, я думаю, что общее направление, в котором все двигается, печально. Будущие попытки связать пользователей и их активность с кампаниями станут намного более сложными и ограниченными.

Мою точку зрения подтверждает непростой подход с использованием битовой маски. Выходит, что каждый раз, когда идет обращение к updateConversionValue(_:), оно должно содержать более высокое значение, чем последнее, и это добавит к логике совершенно новое измерение (например, "011" будет преобразовываться в меньшее значение, чем "100", поэтому первые биты должны учитывать создание общего более высокого числа для отражения комбинированных событий, и это может помешать их использованию для записи дней с момента установки).

Eric Seufert написал отличный пост, описывающий улучшения, которые потенциально могут быть внедрены Apple. Три самых важных момента:

  • Возможность отслеживать значимость и частоту событий
  • Увеличение лимита отслеживания 100 кампаний на большее и более адекватное число, например до 1000 (текущее ограничение до 100 id слишком мало, чтобы обеспечить адекватную сегментацию и возвращает стратегию управления кампаниями примерно к 2014-2015 году)
  • Предоставление рекламодателям возможности получать данные атрибуции своих приложений напрямую через API SKAdNetwork, в отличие от текущего предоставления first-party данных только рекламным сетям.

Наряду с наблюдением за тем, что Apple сделает в ближайшие месяцы с точки зрения корректировок API, многие люди также ожидают, что сами приложения будут развиваться — например, они, вероятно, станут применять схемы UX, которые будут ориентированы на вовлечение пользователей в события с высокой ценностью в кратчайшие сроки. Это может привести к ухудшению пользовательского опыта, из-за агрессивных продаж на первых шагах использования приложения.

Привет, меня зовут Герман Капнин. Если вам интересно узнавать больше про системы мобильной аналитики, новости из мира мобайла, давайте знакомиться лично https://www.facebook.com/gr.kapnin или подписывайтесь на канал про мобайл, чтобы не пропустить и обсудить новые статьи https://t.me/mobile_analytics

0
3 комментария
Егор Жуланов

Самое главное привязать дату к таймсерверу, потому что, если пользователь в приложении будет мотать дату телефона, для получения ачивок или обновления контента, встроенного внутрь приложения и завязанного/открывающегося каждые n-часов, то все эти 24 часовые таймеры слетят, после первой перемотки

Ответить
Развернуть ветку
Григорий Крутеев

Хороший разбор. Спасибо!

Ответить
Развернуть ветку
Анатолий Кант

Правильно я понял, что метод registerAppForAdNetworkAttribution() вызывается автоматически после первого запуска приложения при нажатии рекламного банера или я могу запустить его, условно, через два дня, когда пользователь, например, авторизуется?

Ответить
Развернуть ветку
0 комментариев
Раскрывать всегда