iOSの広告ブロックの種類

広告ブロックは、動作(仕組み)の部分と、何をブロックするか(フィルター)が組み合わさって機能しますが、今回は仕組みのところのお話です。
次記事(iOSの広告ブロックのセキュリティ | 280blocker)でそのセキュリティについて書きます。間違えていたらtwitterなどで突っ込んでください。

ブラウザでの広告ブロック

iOSのブラウザの種類

iPhoneのブラウザは、Safariとその他のブラウザに大きく別れます。その他ブラウザは使用APIによって、3つに大きく分けることができます。SFSafariView、WKWebView、UIWebViewです。
UIWebViewは昔から一般アプリで使用可能でしたが最近は下火でiOS12で非推奨となりました。WKWebViewは、iOS8から利用可能にUIWebViewより高性能です。
またiOS9からSFSafariViewが使えるようになりました。SFSafariViewは、ほぼSafariと同じ動作をしますがカスタマイズ性に乏しいため、ただwebページを表示するために使われます。twitterアプリやFeedlyの内部ブラウザに使用されています。
ブラウザアプリの多くはUIWebViewもしくはWKWebViewです。最近も開発が行われているものはWKWebViewを使っているものが多く、古いままのアプリはUIWebViewとなっています。

Safari、UISafariViewの広告ブロック

コンテンツブロッカーという仕組みをAppleが用意しています。フィルタはアプリを使って設定します。広告ブロックルールが記載されたjsonファイルを設定するとそれがバイトコードへ変換され、Safariの広告がブロックされます。Appleによって最適化が行われているため、高速に動作し、バッテリー消費はわずかです。Safari以外のアプリについてはUISafariViewを採用しているアプリであれば、コンテンツブロッカーが効果を発揮します。

WKWebViewの広告ブロック

iOS11以前は開発者が内部でJavaScriptを動作させて広告ブロックを実装する方法が用いられていました。iOS11でコンテンツブロッカーが利用できるようになりました。ただ、このコンテンツブロッカーについてはアプリ内で動作を完結させる必要があり、一般にアプリで配布されてるコンテンツブロッカーは効果がありません。各々のアプリ内に広告ブロックするjsonを定義して実装しています。
Smoozブラウザや、ohajikiブラウザなどがこれに該当します。 iOS版のChromeも最近のバージョンではWKWebViewを採用していますので、それらの開発元がその気になれば広告ブロック機能を内蔵させることは可能です。 iOS 11 WKWebViewで広告などのコンテンツブロックをする

UIWebViewでの広告ブロック

アプリの内部で様々な方法で独自に広告ブロック機能を実装しています。動作速度はかなり劣ると考えられます。(iCab Mobileなど)

サーバーを中継する方法

例えば、OperaMiniブラウザはすべての通信リクエストをOperaのサーバを通して通信します。Operaのサーバーで画像圧縮や広告ブロックを行っています。

ShingoFukuyama – Qiita

すべての通信の広告ブロック

そもそもAppleはSafari以外の広告をブロックする事を禁止していますので、すべての通信の広告ブロックする方法は提供されていません。
他の用途でもちいられる機能を流用して広告ブロックが実装されています。 Appleから流用していることを指摘されたアプリは、新しいバージョンを公開できなくなります。ただ古いバージョンは削除されずに公開されたままのことが多いです。
公開が続くのはAppleの恩情ですので、一度指摘を受けたアプリは突然非公開になる可能性があります。

proxyの設定ファイル

iOSのWifi設定でプロキシを設定できます。これにJavascriptを用いたPACファイルを指定して、特定のサーバーへの通信を別サーバへ向けることで広告ブロックが実装できます。この方法でブロックできるのはwifiのみで、LTE/3Gではブロックできません。

VPNで自分のサーバーへつないで広告ブロック

VPNで自宅サーバーへつないでそちらで広告ブロックする方法です。Pi-holeを使う方法やproxyサーバを立てる方法など色々あります。これについては一定以上の技術レベルが必要ですので、行っている数は少ないと考えます。

VPNで広告フィルタするサーバーへつなぐ

すべての通信をアプリ開発元のサーバを介して行い、広告をブロックします。OperaVPN(現在配布停止)がこの方法でした。

VPNで広告ブロックするDNSサーバにつなぐ

wifi接続であればユーザがDNSサーバを指定することができます。iOSのVPN APIを用いてDNSサーバを変更するアプリを作成することが可能です。アプリを使う方法であればすべての通信でDNSを変更できます。
これらの機能を用いて、広告サーバーをブロックする(ローカルループバックアドレスに名前解決する)公開DNSサーバを指定することで広告ブロックが可能です。

VPNでDNSの名前解決の一部を変更する

VPN APIを利用して、DNSの名前解決の一部を書き換えます。何を書き換えるかはアプリ内に設定し、特定のサーバーへの名前解決リクエストが来た場合、ローカルループバックアドレスなどを指定して広告サーバへの通信をブロックします。
一部のアプリは、広告サーバーへのリクエストを自前のサーバーへ名前解決します。
ローカルループバックアドレスに名前解決しているのがFuturemind Adblockや、AdguardPROなどです。自前のサーバーへ名前解決しているのがAdblock Mobileなどです。