SafariでのYouTube広告表示の対策とこれからについて
最近、iOSでYouTubeの広告が表示されてしまうという苦情が増えていました。
重要なのは、SafariブラウザでYouTubeを視聴した際の広告のことであったことです。
これは、YouTubeが新しいアルゴリズムを採用して、YouTubeにログインしているユーザーに広告を表示するようにしたため、広告ブロックの品質に悪影響を与えたためです。
事実上、現在YouTubeは、広告動画を通常の動画とほぼ同じように読み込んでいます。
私たちは、iOSのSafariで通用するソリューションを見つけましたが、他のプラットフォームやブラウザと比較すると大いに不満があります。
簡単に言えば、短い動画(その99.99%は広告)をブロックする対策です。
追記:もっといい方法を見つけました。iOSのSafariでYouTube広告をブロックする方法はこちらのさらに新しい記事をご覧ください。
しかし、このようなブロック方法では、ユーザーエクスペリエンスが大きく損なわれます。
動画が読み込まれるまでに目立つ遅延が発生するか、動画広告の代わりにプレースホルダーが表示されてしまいます。
あらすじ
数ヶ月前、YouTubeはChromeユーザーに動画広告を表示する際に同じ方法を使い始めましたが、私たちはそれほど問題なく対応することができました。
Safariの場合、何が違うのか?
残念ながら、Safariのコンテンツブロッキングは、他のブラウザの本格的なコンテンツブロッキングに比べて大きく制限されています。Safari Content Blocking APIは、2015年に導入されて以来、あまり大きな変更はありません。
お使いのOSにもよりますが、以下のようになります。
- iOS/iPadOSの場合: 現在のソリューションは、状況下で現在提供できる最善のソリューションです。Appleが劇的な変化を遂げない限り、私たちはそれに耐えなければなりません(詳細は後述)。
- macOSの場合:
- スタンドアロンのAdGuard for Macアプリを使用している場合は、全く影響ないので、すり抜ける広告も出ません。
- AdGuard for Safariを使用している場合は、「AdGuard高度なブロック」拡張機能が環境設定で有効になっていることを確認してください。この拡張機能は、Safari Content Blockingに欠けている機能の一部を補います。残念ながら、iOS/iPadOSには移植できません。
Safariがコンテンツブロッキングの観点から関連性を維持するためには、いくつかの点を改善する必要があります。
私たちは、それに必要とされる可能性のある専門知識を提供し、支援する準備があります。
というどころか、私たちはここ数年、数々のバグレポートや機能リクエストをSafari開発者へ提出しています。
さて、Safariのコンテンツブロッキングの何が問題なのかを知りたい方は、この先をお読みください。
※技術的な知識が必要なので、興味がない方や詳しくない方は、最後の章までスクロールして結構です。
Safariコンテンツブロッキングの仕組み
Safariの制限と、それをAdGuardがどのように緩和しているかを説明する前に、まずSafariコンテンツブロッキングがそもそもどのように機能しているかを知っておいた方がいいと思います。
コンテンツブロッカーは、基本的に、アプリケーションの拡張機能であり、個別のプロセスで実行され、この拡張機能の唯一の目的は、コンテンツブロッキングルールのリストを含むJSON
ファイルを提供することです。
これらのルールは、Safariが実際に「ブロック」を行う際に使用されます。
この図は、Safariでのコンテンツブロッカーの動作を示しています。
各コンテンツブロッキングルールは JSON
オブジェクトであり、"trigger" と "action"という2つの部分から構成されています。
"trigger"の部分は、ルールがどのリクエストに対して適用されるべきかを定義します。
そして、"action"の部分は、その名の通り、マッチしたリクエストに対して何をすべきかを定義します。
Safariでのブロックルールのイメージ
また、指定されたCSSセレクタに一致するページ要素を隠すコスメティックルールもあります:
Safariでのコスメティックルール
ここでは、「リクエストのブロック」と「要素の非表示」の2種類のアクションについて取り上げましたが、他にもアクションの種類がいくつかあります:
- 他のマッチングルールを無効にできるもの
- Cookieをブロックするもの
- 接続をHTTPSにアップグレードするためのもの
さて、Safari Content Blockingがどのようなもので、どのように機能するかがわかったところで、その制限について説明します。
Safari Content Blockingの制限事項
ここでは、私たち(広告ブロックコミュニティ)が最も気になっている制限事項を簡単に紹介します。
これらのうちのいくつかは、ある程度軽減することができますが、あくまでも回避策であり、完全に解決されるとは言えません。
- デバッグツールがない
- 異なる構文 (一部解決可能)
- コンパイルが遅い
- コンテンツブロッカーごとに5万ルールの制限(これは本当に痛く、我慢しています)
- 正規表現の限られたサポート
- コンテンツブロッキング関連はSafari開発チームにとって優先度が低い
これらの問題をそれぞれ分析してみましょう。
デバッグツールがない
まず最初に、シンプルでありながら解決策のない問題について説明します。
効果的なフィルタリングルールを作成するには、開発者はデバッグする必要があり、そのためにはデバッグツールが必要です。
現在、Safariのコンテンツブロッキングには、デバッグ用のツールが付属していません。
フィルタ開発者にとって役立つ唯一のツールは、ブラウザコンソールで、どのリクエストがブロックされたかを確認することができます。
どのルールがこのリクエストをブロックしているのかを理解することは不可能であり、それを特定するのは非常に面倒な作業だったりします。
また、コスメティックルールをデバッグする適切な方法もありません。
Safariのブラウザコンソール
このため、Safari用のフィルタ開発は非常に非効率的なプロセスとなっており、多くのフィルタのメンテナ(開発者)は、フィルタリングルールを作成する際に、可能であればSafariよりも他のブラウザを優先しています。
この制限は、他のブラウザと比較して、Safariのフィルタリストの品質を低下させています。
異なる構文
AdGuardのフィルター、EasyList、uBlockのフィルターは、いずれもAdblock Plusのオリジナルのコア構文をベースにしています。
その構文は拡張されましたが、「コア」の部分は全ての人気なコンテンツブロッカーの間で共通しています。
一般的なフィルタリングルールの"解剖"
前述の図で見たように、Safariのブロックルールは、この構文とは何の共通点もありません。
これが問題である理由は、わざわざ「Safari専用」のフィルタリストを作るのは余計な手間がかかるからです。
怠け者というわけではありません。Safariには、このようなリストを作成するための十分なツールが単にないのです。
私たちが求めているのは、AdGuardフィルターやEasyListのような古き良き伝統的なフィルターリストを使うことです。
解決策
明白な解決策は、私たちの一般ルールをSafariのコンテンツブロッキングルールに自動的に変換することです。
AdGuardはまさにそれをユーザーのデバイス上でリアルタイムに行います。
Safariの構文問題の解決策案
もちろん、これは広告ブロッカーの効率化にはつながらない余計な作業であることは想像に難くありません。
遅いコンパイル
Safariは各コンテンツブロッカーの JSON
を「prefix tree」にコンパイルして、lookupを高速化しています。
しかし、このprefix treeのコンパイルには時間がかかります。
例えば、プロファイラの出力を見ると、新しいMacBook Proでは、3万ルール強(フィルタとしては現実的サイズ)のJSON
をコンパイルするのに2秒以上かかっています。
Safariでのコンパイル時間
これは遅いです。
他のプラットフォームのコンテンツブロッカーと比較すると、例えばAdGuard for Androidアプリが10万以上のルールを持つリストを解析してコンパイルするのに1秒もかかりません。
しかし、明らかな違いは、当社のAndroidアプリでは、正規表現ほど複雑ではなく、柔軟性もないかもしれませんが、URLのマッチングに特化して最適化された異なる構文を使用していることです。
ユーザーはこのようなことを目にすることはなく、直接影響を受けることはありませんが、この点が他の制限の原因となるチョークポイントとなるため、実際にはかなり大きな問題となります。
5万ルールの制限
コンパイルにかなりの時間がかかることがわかったので、次の制限を理解するのは簡単です。
1つのコンテンツブロッカーには50,000以上のルールを含めることができません。
これはSafariのハードコーディングによる制限です。Appleの開発者によると、この制限の主な理由は、コンパイルに時間がかかることだそうです。新しいデバイスはより高速になっているので、Appleはルール数を少し増やすかもしれませんが、だからといって魔法のようにすべての問題が解決するわけではありません。
正規表現を利用したルールである限り、大幅な改善の余地はありません。
例えば、AdGuardベースフィルターとEasyListの合計ルール数は100,000であり、これはたった2つのフィルターに過ぎません。
他のプラットフォームでは、同時に5~10個のフィルターを持つユーザーも珍しくありませんし、それ以上の数になることもあります。
AdGuardによる解決策
実際には、様々な解決策があります。
残念ながら、それらを組み合わせても、期待した結果は得られません。しかし、それらが全く無意味というわけでもありません。
フィルターの最適化
フィルター開発者として、私たちはSafariに特化したフィルターの最適化に努めています。
そのひとつが、類似した要素の非表示ルールをひとつにまとめることです。下の例では、5つの異なるルールが2つにまとめられています:
Safariにおけるフィルター最適化
これでかなり改善されましたが、まだ十分ではありません。
廃止されたルールの削除
もう1つは、最適化されたバージョンのフィルタから、廃止されたルールやあまり使用されていないルールを削除することです。
AdGuardブラウザ拡張機能のユーザーがボランティアで匿名のフィルタ使用統計を共有してくれているおかげで(デフォルトではこの共有機能は無効になっています)、どのルールが他のルールよりも使用頻度が低いかがわかります。
人気のあるリスト(AdGuardベースフィルタなど)の特別バージョンを構築し、そこで廃止されたルールやあまり使用されていないルールを除去しています。
フィルタのメンテナ(開発者)は、特別な「ヒント」を使って、「最適化」プロセスにもかかわらず、どのルールを残すべきかをコントロールすることができます。
確かにフィルターは小さくなりますが、その代償として広告ブロックの品質が低下します。
また、この方法は万全ではありません。ブラウザ拡張機能で使用されていないために統計が取れないルールがあったり、フィルタ開発者の中にはルールの横にヒントを記載しない人がいたりします。
複数のコンテンツブロッカー
Safari広告ブロッカーの開発者のほとんどが採用しているもう一つの回避策は、広告ブロッカーを複数の独立したコンテンツブロッカーに分割することです。
AdGuard for iOSは、6つのコンテンツブロッカーで構成されています。
技術的には、それぞれのルールは5万未満ですが、合計するとより多くのルールを行使しています。
しかし、広告ブロックでは、いくつかの理由から、50,000×6=300,000というストレートな計算にはなりません:
- 1つのフィルタが他のフィルタのルールに対応することはよくあることです。しかし、この複数コンテンツブロッカーのアプローチだと、異なるSafariコンテンツブロッカーは完全に独立しており、その中のルールが互いに影響し合うことはできません。
- 5万以上のルールを持つフィルタがあった場合、そのフィルタを追加することはできません。
今後もSafariの制限に合わせてAdGuardを分割していく予定ですが、なぜそれが楽しくないのかは上記の説明でお分かりいただいたと思います。
開発の優先度が低い
これは非常に分かりやすいので、最後に残しておきました。
ここでは、過去6年間のSafari Content Blocking APIの変更履歴を紹介します。
2015年 - Safari Content Blockingを実装
2016年 - 1つの新機能(make-https)を追加し、いくつかの大きなバグを修正
2017年 - 新機能を1つ追加(if-top-url) (ほとんど使えない機能ですが)、WKWebViewにコンテンツブロッカーを追加、いくつかのバグを修正
2018年 - いくつかのバグを修正、コードのリファクタリング
2019年 - いくつかのバグを修正
2020年 - 大きな変更なし
このペースでは、最新の広告挿入技術に追いつくことができないのは明らかです。
何らかの変化がなければなりません。私たちは、Safari開発者の優先順位がこれらの問題を修正する方向にシフトすることを望んでおり、必要な支援を提供する準備ができています。
(Safari Content Blocking APIにおいて)何をすべきか
広告ブロックのコミュニティは、何年も前から警鐘を鳴らしています。
今まで提出されている機能要求の例を挙げてみましょう:
これは、YouTube広告の問題を解決するに大変役立つのもので、特に興味深いものです。
- コンテンツブロックツール開発者による最も差し迫った問題についてのフィードバック
- CNAMEによるブロッキングを可能にしてほしいという機能要求
- ルールの上限を30万にしてほしいという機能要求
- より良いデバッグツールの要求
他にもたくさんありますが、これらは最も差し迫った問題の一部です。
このコミュニティの一員として、私たちはAppleの注意を喚起するのに十分すぎるほどのことをしたと信じています。
もし、さらなる支援が必要であれば、私たちはできる限りの支援を提供したいと思っています。
私たちは今、絶対に変化が起きなければならない段階にいます。
そうでなければ、(広告提供者を除いて)誰もが損をすることになります。
追記: 2021年に向けて、状況は変わりつつあるようです。例えば、ルール5万本の上限が15万本に引き上げられまして、それだけではありません。