Реклама на YouTube в Safari — неужели это навсегда?
Недавно мы получили много жалоб о пропущенной рекламе на YouTube на устройствах iOS. Что важно, жалобы касались именно просмотра YouTube в браузере Safari. Как выяснилось, YouTube начал использовать новый алгоритм показа рекламы вошедшим в систему пользователям, и это негативно отразилось на качестве блокировки рекламы. По факту, сейчас YouTube загружает рекламные ролики почти так же, как и обычные видео.
Мы нашли решение, которое работает в Safari на iOS, но оно оставляет желать лучшего по сравнению с другими платформами и браузерами. Проще говоря, мы блокируем короткие видео, 99,99% из которых — рекламные.
ДОПОЛНЕНИЕ: как выяснилось, всё же есть более качественное решение! Узнать, как заблокировать YouTube-рекламу в Safari на iOS можно в нашей свежей статье.
Но с таким подходом страдает удобство пользователя — либо видео загружается с заметной задержкой, либо вместо рекламы появляется пустое поле:
Краткое содержание
Несколько месяцев назад YouTube таким же образом показывал рекламу пользователям Chrome, но мы сумели справиться с этим без проблем. Теперь очередь Safari. К сожалению, Safari Content Blocking сильно ограничен по сравнению с полномасштабными блокировщиками контента для других браузеров. Он почти не менялся с момента своего появления в 2015 году.
В зависимости от платформы, вот что можно ожидать:
- На iOS/iPadOS: это лучшее решение из возможных, придётся с этим смириться.
- На macOS:
- Если вы используете AdGuard для Mac, то изменения вас не затронут. Возможно, вы и не видели эту рекламу.
- Если вы используете AdGuard для Safari, убедитесь, что у вас включено расширение «AdGuard Расширенная блокировка» (Safari > Настройки > Расширения). Это расширение восполняет некоторые функции, которых не хватает Safari Content Blocking, но, к сожалению, его нельзя перенести на iOS/iPadOS.
Думаем, что, если Safari хотят оставаться конкурентоспособными, некоторые вещи нуждаются в улучшении. Мы в свою очередь готовы помочь и предоставить любую экспертизу, которая может понадобиться. На самом деле, мы отправили множество отчётов об ошибках и запросов на добавление функций, но безрезультатно.
Ну а если вы хотите узнать, что не так с Safari Content Blocking, читайте дальше. В описании много технических деталей, так что, если вам это неинтересно, просто прокрутите вниз до последнего раздела.
Как работает блокировка контента в Safari
Прежде чем говорить об ограничениях Safari и о том, как мы в AdGuard их смягчаем, лучше сначала узнать, как работает блокировка контента в Safari.
Блокировщик контента представляет собой расширение программы, которое работает в рамках отдельного процесса. По сути это файл JSON
со списком правил блокировки контента, который использует Safari для работы.
Эта схема иллюстрирует работу блокировщиков контента в Safari
Каждое правило блокировки контента — это объект JSON
, который состоит из двух частей: «триггера» и «действия». Триггер определяет, к каким запросам должно быть применено правило, а действие, согласно названию, определяет, что сделает блокировщик контента с соответствующим запросом.
Как выглядит правило блокировки в Safari
Ещё есть косметические правила, которые прячут элементы страницы, совпадающие с указанным CSS-селектором.
Косметическое правило в Safari
Мы только что рассмотрели два типа действий: блокирование запроса и скрытие элемента, но их больше:
- Отключение других совпадающих правил
- Блокирование cookies
- Модернизация соединения, переключение на HTTPS
Теперь, когда мы знаем, что представляет собой блокировка контента в Safari, давайте поговорим о её ограничениях.
Ограничения
Вот короткий список исключений, которые беспокоят нас больше всего. Некоторые из этих ограничений можно уменьшить, но это всё ещё будут обходные пути, а не надлежащие решения.
- Отсутствие инструментов отладки
- Другой синтаксис (частично решается)
- Медленная компиляция
- 50 тысяч правил на блокировщик контента (это боль, но мы научились с ней жить)
- Ограниченная поддержка регулярных выражений
- У блокировки контента низкий приоритет для команды Safari
Давайте проанализируем каждую из этих проблем.
Отсутствие инструментов отладки
Начнём с чего-то простого, но всё ещё не имеющего решения. Чтобы создать эффективные правила фильтрации, разработчикам нужно отлаживать их, а для этого требуются инструменты, которых нет у Safari. Единственный инструмент, который может помочь разработчикам фильтров, — это консоль в браузере, где можно видеть заблокированные запросы. Но понять, какое правило блокирует тот или иной запрос, невозможно, а выяснение может быть очень утомительным.
Консоль в Safari
Это делает разработку фильтров для Safari очень неэффективным процессом, и многие по возможности выбирают вместо Safari другие браузеры, когда дело доходит до создания правила фильтрации. Это, в свою очередь, приводит к низкому качеству фильтров Safari по сравнению с другими браузерами. Замкнутый круг.
Другой синтаксис
Фильтры AdGuard, EasyList и uBlock основаны на оригинальном синтаксисе Adblock Plus. Он был расширен, но его основная часть одинаковая во всех популярных блокировщиках контента.
Анатомия общих правил фильтрации
Как вы видели на предыдущих иллюстрациях, у правил блокировки в Safari нет ничего общего с этим синтаксисом. И это проблема, потому что мы не хотим создавать особенные фильтры «только для Safari». В Safari просто нет достаточно хороших инструментов для разработки подобных фильтров. Мы же хотим использовать старые-добрые фильтры, такие как AdGuard и EasyList.
Наше решение
У проблемы есть очевидное решение — автоматически преобразовывать наши правила в правила блокировки контента Safari. Именно это и сейчас делает AdGuard прямо на вашем устройстве.
Возможное решение для проблем с синтаксисом Safari
Как вы сами понимаете, это лишняя работа, которая не делает блокировщики рекламы более эффективными.
Медленная компиляция
Safari компилирует JSON каждого блокировщика контента в «дерево префиксов», чтобы ускорить поиск.
Но компиляция этого дерева происходит медленно. Например, вы можете увидеть результат работы профайлера: на новом MacBook Pro требуется больше 2 секунд для компиляции JSON
с чуть больше чем 30 тыс. правил (вполне реалистичный размер для фильтра).
Время компиляции в Safari
По сравнению с блокировщиками контента на других платформах, это очень медленно. Приложению AdGuard для Android потебуется меньше секунды, чтобы спарсить и скомпилировать список с больше чем 100 тыс. правил. Очевидная разница в том, что наше приложение для Android использует другой синтаксис: не такой сложный, как регулярные выражения, возможно, не такой гибкий, но специально оптимизированный для сопоставления URL.
Пользователи ничего этого не видят, и напрямую их это не касается, но этот момент на самом деле очень важен, потому что именно он вызывает другие ограничения.
Ограничение в 50 тыс. правил
Узнав, что компиляция довольно медленная, легко понять следующее ограничение. Один блокировщик контента не может содержать больше 50 000 правил — это жёстко закодированное ограничение для Safari. Разработчики Apple подтвердили, что главная причина для этого ограничения — в медленной компиляции. Они могут немного увеличить лимит, поскольку новые устройства быстрее, но это не решит все проблемы волшебным образом.
Пока правила основаны на использовании регулярных выражений, возможности для существенного улучшения отсутствуют. И пусть вас не введёт в заблуждение кажущееся большим число: например, Базовый фильтр AdGuard и EasyList содержат в сумме 100 000 правил, и это только два фильтра. У пользователей других платформ зачастую одновременно 5-10 фильтров, если не больше.
Наше решение
Фактически, тут целый комплекс решений. Увы, даже если комбинировать их, они не дадут желаемый результат, но это лучше чем ничего.
Оптимизация фильтров
Будучи разработчиками фильтров, мы пытаемся оптимизировать фильтры AdGuard специально для Safari. Например, мы объединяем подобные правила скрытия элементов в одно. Как видно на примере, пять разных правил объединены в два.
Оптимизация фильтров в Safari
Это очень помогает, но всё ещё недостаточно.
Удаление устаревших правил
Ещё одна вещь, которой мы занимаемся, — это удаление устаревших и редко используемых правил из оптимизированных версий фильтров. Благодаря пользователям браузерного расширения AdGuard, которые соглашаются делиться анонимизированными данными об использовании фильтров (по умолчанию отключено), мы знаем, какие правила используются реже остальных. Мы делаем версии популярных списков вроде Базового фильтра AdGuard без устаревших и редко используемых правил.
Пометка от разработчика фильтра, подсказывающая AdGuard, что правило не оптимизировано
Да, фильтры становятся меньше, но в конечном итоге цена — более низкое качество блокировки рекламы. Кроме того, этот метод не универсален: по некоторым правилам у нас просто нет статистики, потому что они не используются в браузерном расширении, некоторые разработчики фильтров не будут размещать такие подсказки рядом со своими правилами и т.д.
Несколько блокировщиков контента
Ещё один обходной путь, к которому прибегают почти все разработчики блокировщиков рекламы в Safari, — это разделение приложения на несколько независимых блокировщиков контента.
AdGuard для iOS состоит из 6 блокировщиков контента
Технически, в каждом из них меньше 50 тыс. правил, но в сумме получается гораздо больше. Однако по нескольким причинам в блокировке рекламы 50 тыс., умноженные на 6, не дают 300 тыс.:
- Нередко один фильтр обращается к правилам из другого. Но с таким подходом блокировщики контента в Safari полностью независимы и правила в них не могут влиять друг на друга.
- Если в каком-либо фильтре больше 50 тыс. правил, вы не сможете добавить его.
Мы продолжим резать AdGuard на части, чтобы соответствовать всем ограничениям Safari, но теперь вы видите, почему это не здорово.
Низкий приоритет разработки
Мы приберегли этот пункт напоследок, потому что он весьма показателен. Вот список изменений для Safari Content Blocking API за последние 6 лет:
2015 — Safari Content Blocking реализован
2016 — Добавлена одна новая функция (make-https) и исправлена пара крупных ошибок
2017 — Добавлена ещё одна новая функция (if-top-url), которая практически непригодна для использования, и добавлены блокировщики контента в WKWebView, исправлена пара ошибок
2018 — Исправлена пара ошибок, рефакторинг кода
2019 — Исправлена пара ошибок
2020 — Никаких существенных изменений
Понятно, что такими темпами догнать новейшие технологии вставки рекламы невозможно. Что-то должно измениться. Надеемся, что приоритеты разработчиков Safari сместятся в сторону исправления этих проблем, и готовы оказать любую необходимую помощь.
Что делать
Сообщество блокировки рекламы бьёт тревогу уже несколько лет. Вот всего несколько примеров отчётов об ошибках:
Этот запрос особенно интересный, так как он помог бы исправить проблему с рекламой на YouTube.
- Отзывы разработчиков инструментов блокировки контента о наиболее актуальных проблемах
- Запрос на разрешение блокировки CNAMEs
- Запрос на увеличение лимита правил до 300 тыс.
- Запрос на лучший инструмент отладки
Разумеется, их гораздо больше, здесь только наиболее актуальные вопросы. Будучи частью сообщества, мы верим, что сделали больше, чем достаточно, чтобы привлечь внимание Apple к проблеме. Мы находимся в точке, когда изменения абсолютно необходимы, иначе в проигрыше останутся все — кроме рекламодателей.
UPD: похоже, в этом году всё изменится. Например, лимит в 50 тысяч правил подняли до 150 тысяч, и это ещё не всё.