AdGuard v4.5.1 iOS版:处理 iOS 17 上难以预料的规则上限问题
这次更新还包含一个背景故事。解决软件问题时,我们突然发现了一个 iOS 17 的错误。系统基本上限制了内容拦截规则的数量。除了该错误的解决方案,我们还进行了一些改进和修复让应用程序运行更稳定。
Apple!不是说好在 Safari 中可以用15万内容拦截规则吗?
问题
这个故事始于我们试图找到一个解决方案来解决 iOS 17 上过滤器会不断“更新”而不真的更新的问题。当时,点击 AdGuard 主屏幕右上角的 🔄 图标导致软件一直显示正在更新状态。不过,有时,不断进行更新的流程以过滤器更新错误的状态结束。
问题的原因
起初,我们试图从自己应用程序的代码中找出问题。但我们尝试解决问题后,就注意到了一个现象:该问题只出现在最新的 iOS 系统上,而它应该是最完善、最优化的系统。这一细节和越来越多的用户反馈让我们意识到,问题的根源在于更新后的 iOS 系统。
然后我们发现,过滤器仍会根据用户启用(或未启用)的过滤器成功更新,这反过来帮助我们发现,在 Safari 中加载规则有时会遇到内存限制,而这是我们以前从未遇到过的问题。
Apple 公司为开发者提供了在应用程序中实施 Safari 内容拦截器的能力,这让开发者能够为用户提供内容拦截功能。这是 iOS 上广告拦截程序不可或缺的工具,因为 Safari 内容拦截器让我们得以将过滤规则用于 Safari 浏览器。目前,根据 Safari 内容拦截 API 文档,一个内容拦截器最多可包含 15 万个规则(一个应用程序可拥有多个内容拦截器)。
矛盾
总之,我们遇到了一个令人惊讶的情况:在 iOS 17 上,使用具有15万过滤规则的标准 Safari 内容拦截程序会突然导致崩溃。原来,Safari 不再接受超过一定大小的文件,即使是带有4万~6万规则(比15万限制低 3 倍)的内容拦截程序有时也会崩溃(取决于它们所包含的规则)。
由此,我们要向 Apple 公司提出一个简单的问题:为什么 Safari 浏览器允许15万个规则,而4万个规则的内容拦截器却会崩溃?
由于这是 iOS 17 中的一个明显错误,我们已经在 Apple 论坛上进行了报告。如果有用户能为我们的报告投上宝贵的一票(点击《Me too》),我们将不胜感激。此外,这是 Apple 反馈助手中的票据 ID: FB13282146。
解决方案
我们花了好几个星期才想出了一个临时解决方案:我们限制了 JSON 文件的大小,并优化了主要过滤器,使它们能适应新的"大小要求"。如果一个内容拦截器对于 iOS 来说还是有点太大(最终大小取决于用户启用了多少个过滤器和哪些过滤器),我们就会自动减小大小,这样至少有一部分符合大小要求的规则会应用到 Safari 中。
因此,虽然目前大多数用户都能正常使用软件,但我们非常希望 Apple 公司能尽快解决这个问题。
SafariConverterLib、Scriptlets 和 TSUrlFilter 的更新
现在让我们说一下 v4.5.1 中的其他改进。例如,我们更新了 SafariConverterLib、Scriptlets 和 TSUrlFilter。这三个组件的更新以及它们之间的相互连接有助于保持较高的过滤质量,即拦截规则的高效和最新性能。
SafariConverterLib 可将 AdGuard 过滤规则转换为 Safari 内容拦截规则,因此基本上可以在 AdGuard iOS 版中使用我们过滤器的全部功能。Scriptlets 和 TSUrlFilter 也非常重要,因为它们有助于实现 AdGuard iOS 版中的高级拦截功能。
DnsLibs 升级
在 DnsLibs(DNS 过滤引擎)v2.3 更新中,我们做了一些重要的调整,大大提高了 AdGuard 的 DNS-over-HTTP/3 性能和稳定性。
除此之外,我们还修复了其他一些问题,其中是 AdGuard 无法在 iOS 13.x 上启动的问题。
希望大家会享受 iOS 版 AdGuard 的新使用体验。如果有用户对本次更新有任何想法,请随时在下面留言或在社交媒体上联系我们。
完整的 v4.5.1 更新日志可在 Github 上查看。
也欢迎大家在 Github issues 上提出任何反馈意见。