AdGuard 4.5.1 для iOS: неожиданная проблема на iOS 17 и её решение
Представляем вашему вниманию не простое обновление, но релиз с историей, которая началась, когда мы обнаружили неожиданную ошибку на iOS 17. Эта ошибка существенно ограничивает количество правил блокировки контента…
Apple, вы сказали, что мы можем использовать до 150 тысяч правил блокировки контента в Safari. Что случилось?
Проблема
Итак, всё началось, когда мы пытались решить проблему на iOS 17, связанную с бесконечными попытками обновления фильтров. При нажатии на иконку 🔄 в правом верхнем углу главного экрана AdGuard запускалась непрерывная анимация вращения, но ничего не происходило. В некоторых случаях это заканчивалось ошибкой обновления фильтра.
Причина
Сначала мы пытались найти ошибки в коде приложения, как сделал бы любой ответственный разработчик. Но чем больше времени мы проводили в поисках, тем яснее становилось, что проблема возникает только на новой версии iOS, которая, по идее, должна быть наиболее отлаженной и оптимизированной. Эта деталь и растущее количество отзывов пользователей привели нас к выводу, что корень проблемы кроется в iOS 17.
Также мы выяснили, что фильтры успешно обновлялись в зависимости от включённых (или, скорее, не включённых) пользователем фильтров. Это, в свою очередь, помогло нам понять, что загрузка правил в Safari иногда достигает предела памяти. Раньше таких проблем не было.
Apple предоставляет возможность внедрять в приложения блокировщики контента Safari, благодаря которым, как видно из названия, можно блокировать нежелательный контент. Очевидно, что это незаменимый инструмент для блокировщиков рекламы на iOS, поскольку он позволяет применять правила фильтрации к сайтам, открываемым в Safari. В настоящее время, согласно документации Safari Content Blocking API, в одном блокировщике контента может быть до 150 тысяч правил (а в одном приложении может быть несколько блокировщиков контента).
Противоречие
В общем, внезапно мы очутились в дивном новом мире, где использование стандартных блокировщиков контента со 150 тысячами правил фильтрации вдруг стало приводить к сбоям на iOS 17. Оказалось, что Safari больше не принимает файлы, превышающие определённый размер: даже наличие 40-60 тысяч правил в блокировщике контента Safari (что в 3 раза меньше 150 тысяч) иногда давало сбой.
В связи с этим возникает простой вопрос к Apple: как так получилось, что блокировщик контента с 40 тысячами правил аварийно завершает работу, если Safari официально разрешает 150 тысяч правил?
Поскольку это очевидная ошибка в iOS 17, мы уже сообщили о ней на форуме Apple. Будем признательны, если вы проголосуете за наш отчёт, нажав Me too. Кроме того, вот идентификатор тикета в Ассистенте обратной связи Apple: FB13282146.
Обходной путь
Нам потребовалось больше недели, чтобы придумать временную меру: мы ограничили размер JSON-файлов и оптимизировали основные фильтры таким образом, чтобы они могли втиснуться в требования этой новой реальности. Если блокировщик рекламы всё ещё слишком велик для iOS (окончательный размер зависит от того, сколько и каких фильтров включены пользователем), мы автоматически уменьшаем его размер, чтобы в Safari применялась хотя бы часть правил, удовлетворяющих требованию по размеру.
Поэтому, несмотря на то, что сейчас у большинства пользователей всё должно работать нормально, мы очень надеемся, что Apple исправит свою ошибку как можно скорее.
Обновлённые библиотеки SafariConverterLib, Scriptlets и TSUrlFilter
Спасибо, что позволили выпустить пар… Теперь можно рассказать о более приятных вещах, которые были сделаны к релизу версии 4.5.1. Например, мы обновили библиотеки SafariConverterLib, Scriptlets и TSUrlFilter. Обновление этих трёх компонентов и их взаимная работа позволяют поддерживать высокое качество фильтрации, то есть эффективную работу и актуальность правил блокировки.
SafariConverterLib конвертирует правила фильтрации AdGuard в правила блокировки контента Safari, что в принципе позволяет использовать всю мощь наших фильтров в AdGuard для iOS. Scriptlets и TSUrlFilter не менее важны, поскольку помогают реализовать функцию Расширенной блокировки в AdGuard for iOS.
Переработанные DnsLibs
В версии 2.3 DnsLibs, нашего движка DNS-фильтрации, мы провели серьёзную доработку, которая позволила значительно повысить производительность и стабильность работы AdGuard в режиме DNS-over-HTTP/3.
Также были исправлены некоторые недочёты, в том числе проблема, из-за которой AdGuard не открывался на iOS 13.x.
Надеемся, вам понравится улучшенный AdGuard для iOS. Если у вас возникнут мысли или предложения по поводу последнего обновления, озвучьте их здесь или поделитесь ими в социальных сетях.
Полный список изменений версии 4.5.1 можно найти на Github.
Предложить новую функцию или рассказать об ошибке можно в разделе Github issues.