【AdGuard for iOS v4.5.1】iOS 17 のルール数制限バグへの対策
このアップデートにはちょっとしたストーリーがあります。
iOS 17 でコンテンツブロッカーのルール数が実質的に制限されているという予期せぬバグを発見した話です。
このバグの回避策に加えて、v4.5.1 にはアプリのパフォーマンスと安定性に有用な改善と修正もいくつか含まれています。
Appleさん、Safariで最大15万のコンテンツブロックルールを使えるって言ってたけど、どうしたの?
問題
この話は、iOS 17でフィルターが実際に更新されることなく永遠に更新しつづける問題の解決策を見つけようとしたところから始まりました。
そうです、AdGuardのメイン画面の右上にある🔄アイコンをタップすると、何も起こらず、アニメーションが無限回転するだけという現象が起きていました。
場合によっては、フィルター更新エラーことになることもありました。
起因
当初、私たちは自分たちのアプリのコードに問題を見つけようとしていました(責任ある開発者なら誰でもそうすると思いますが)。
しかし、試せば試すほど、この問題が最も最適化されているはずの最新iOSでのみ発生するという事実が発覚しました。
この点とユーザーから増えるフィードバックにより、問題の根源はアップデートされたiOSにあることに気づきました。
次に、ユーザーが有効にしている(というか、むしろ有効にしていない)フィルターの数・種類によっては、フィルターが正常に更新されることがあって、その結果、Safariへのルール読み込みがメモリ制限にヒットしてしまうことがあることがあわかりました。
Appleは開発者に対し、Safari コンテンツブロッカー機能をアプリに実装する可能性を提供しており、これにより開発者はコンテンツブロック機能をユーザーに提供することができます。もちろんのこと、これはSafariでアクセスしたページにフィルタリングルールを適用する手口であるため、iOS用広告ブロックアプリにとっては不可欠なツールであります。現在、Safari Content Blocking APIのドキュメンテーションによると、1つのコンテンツブロッカーで最大15万のルールを使用できます(1つのアプリで複数のコンテンツブロッカーを仕様することも可能)。
矛盾
AdGuardが15万フィルタリングルールを含む定番Safariコンテンツブロッカーを使用すると、iOS 17では突然クラッシュが発生するようになっているという驚くべき現実に直面しました。
それは、Safariが特定のサイズ以上のファイルを受け付けなくなったからよいうことがわかりました。
4万~6万件のルール(これは15万件制限の3倍減少)を持つコンテンツブロッカーでさえ、含まれるルールによってはクラッシュすることがありました。
Safariが公式に15万のルールを許可しているのに、どうして4万ルールのコンテンツブロッカーもクラッシュすることがあるのか?
これは明らかにiOS 17のバグなので、すでにAppleのフォーラムで報告しました。
そちらで「Me too」を押してアップヴォートしていただけると助かります。
また、AppleのフィードバックアシスタントでのチケットIDはこちら: FB13282146
回避策
この新しい"サイズ要件"に収まるように、AdGuardコンテンツブロッカーのJSONファイルのサイズを制限し、主要フィルター(AdGuard ベースフィルタ等)も全部最適化しました。
コンテンツブロッカーがiOSからしてまだ大きすぎる場合(最終的なサイズは、ユーザーが有効にしているフィルタの数と種類に依存します)、AdGuardは自動的にそのサイズを削減し、サイズ要件を満たすルールの少なくとも一部がSafariで適用されるようにします。
そのため、現時点ではほとんどのユーザーにとって問題なく動作するはずではありますが、Appleが早急にこのバグを修正してくれることを心待ちにしています。
SafariConverterLib、Scriptlets、TSUrlFilter の更新
v4.5.1 には問題対策だけでなく、改善もあります。
例えば、SafariConverterLib、Scriptlets、TSUrlFilterの依存関係を更新しました。
これら3つのコンポーネントの更新と相互接続により、高いフィルタリング品質、つまりブロックルールの最新状態と効率的なパフォーマンスを維持することができます。
SafariConverterLibは、AdGuardのフィルタリングルールをSafariのコンテンツブロックルールに変換するライブラリで、AdGuard for iOS でフィルタのフルパワーを使用することを可能にします。
ScriptletsとTSUrlFilterも、AdGuard for iOS の「高度な保護機能」の実装に役立つので、重要なものです。
DnsLibs の改新
DnsLibs (AdGuardのDNSフィルタリングエンジン) v2.3では、AdGuardのDNS-over-HTTP/3のパフォーマンスと安定性を大幅に改善するいくつかの重大な手直しと調整を行いました。
また、iOS 13.xでAdGuardが開かない問題も修正いたしました。
このアップデートについてご意見、ご感想がございましたら、以下にコメントを残していただいたり、SNSでお寄せください。
AdGuard for iOS v4.5.1 の完全な変更履歴は、Github にあります。
また、Github issues経由のフィードバックも大歓迎しております。