Safariのコンテンツブロッカーアプリを作るために、ドキュメントを読んだので要約
- Safairに対して、ブラウザの中のコンテンツをブロックするルールを与えることができる
- hiding elements(要素を消す)
- blocking loads(ロードしない)
- stripping cookies(クッキーを取り除く)
- containing app(app extensionを使うためのアプリ)をApp Storeに出すことでこの機能が使える
- user actionに応答してリクエストを送ることで、extensionを提供したり初期化するcontextを定義する
- アプリが起動すると、shared resourcesを通してcontaining appとやり取りしたり、直接Safariをやり取りをする
アプリは事前にどういうコンテンツをブロックするかをSafariに伝える
- Safariはページをロードするときにはアプリとやり取りしないし、Xcodeがコンテンツブロッカーをバイトコードにコンパイルしているから
- Content Blockerはユーザのヒストリーとかは見れないよ
Extension targetをcontaining appに追加する
- File > New > Target -> Content Blocker Extension
コンテンツブロッカーの挙動は上記でつけた名前のフォルダに規定されている
- action request completionHandler
- JSONファイル
- trigger,actionのdictionaryでルールを定義している
- action: triggerがマッチしたときにどうするかをSafariに伝える
- trigger: Safariにいつ関連するアクションを行うか伝える
- property listファイル
- entitlementsファイル
JSONファイルの編集
JSONファイル例
[
{
"trigger": {
...
},
"action": {
...
}
},
{
"trigger": {
...
},
"action": {
...
}
}
]
triggerの設定
- url-filter keyが必須
- URLに対してパターンマッチさせる
- 他のkeysはオプショナル
例
"trigger": {
"url-filter": ".*",
"resource-type": ["image", "style-sheet"],
"unless-domain": ["your-content-server.com", "trusted-content-server.com"]
}
パターン
- .* すべてのstingにマッチ
- . 何かのキャラクター
- . .文字と一致
- [a-b] アルファベットキャラクターの範囲で一致
- (abc) 特定のキャラクターのグループに一致
- + 前のtermが一回以上
- * 前のキャラクターが0回以上
- ? 前のキャラクターが0か1回
Trigger Field
- url-filter-is-case-sensitive Booleanの値、デフォルトはfalse
- if-domain URLドメインのstring配列. 特定ドメインのリストでアクションが動く.値は小文字のASCIIかnon-ASCIIのためのpunycode. subdomainとdomainにマッチさせるには先頭に*を追加する. unless-domainと同時には使えない
- unless-domain URLドメインのstring配列.これ以外のドメインでアクションが動く.以下はif-domainと同じ. id-domainと同時に使えない
- resource-type ブラウザがどうやって使うかを示すリソースタイプを示す.指定しないとすべてのタイプにマッチする
- 有効なタイプ
- document
- image
- style-sheet
- script
- font
- raw(Any untyped load)
- svg-document
- media
- popup
- load-type 相互に排他な2つの値のうち1つを含むstring配列.指定しなければすべてのロードタイプにマッチ.
- first-party リソースがメインページと同じスキーマ、ドメイン、ポートの場合動作
- third-party メインページと異なるスキーマ、ドメイン、ポートの場合動作
- if-top-url メインドキュメントの完全なURLのstring配列.アクションを特定のURLパターンに限定する.値は小文字のASCIIかnon-ASCIIのためのpunycode.unless-top-urlと同時に使えない
- unless-top-url 上記の逆.if-top-urlと同時には使えない
Action
- Safariはすべてのトリガーを評価して順に実行する.同じアクションはskipされる
- パフォーマンスを良くするために、似たアクションはグループ化する
- 1つ目のcontentsのロードをブロックするルール、次にcookiesをブロックするルール等
- トリガーの評価は別のアクションを指定している最初のルールから続けられる
- 2つのフィールドのみを持つ
- type: 必須
- selector: タイプがcss-display-noneのときのみ必須.ほかはオプショナル
"action": {
"type": "css-display-none",
"selector": "#newsletter, :matches(.main-page, .article) .news-overlay"
}
- typeフィールド
- block リソースのロードを止める.キャッシュがあったとしても無視する
- block-cookies サーバに送信する前にクッキーを止める.Safariのプライバシーポリシーが受け入れられているクッキーだけがブロックできる.ignore-previous-rulesと組み合わせても、ブラウザのプライバシーセッティングは上書きできない
- css-display-none CSSセレクターを指定して、要素を隠す.selectorフィールドはselector listを持つ.マッチしたelementはdisplay propertyがnoneになる
- ignore-previous-rules 前のトリガーアクションを無効にする
- make-https urlをhttpsに変える.ポート指定のURLやhttp以外のプロトコルには影響しない
- selector field selector listを定義するstringを指定する.
- typeがcss-display-noneのとき必須.それ以外のときはSafariに無視される
- ,で分けて、個々のselector valueとして、CSSの識別子を指定する.SafariとWebKitのすべてのCSSセレクターをブロッキングルールに使える
クラス
-
- アプリからコンテンツブロッカーエクステンションとやり取りするためのクラス
-
- コンテンツブロッカーエクステンションのstate
とりあえず不明
JSONファイル以外がどういう役割なのかよくわからなかった。ここは触りながらやろう - action request completionHandler - property listファイル - entitlementsファイル