iOS Safari の Preload Top Hit 機能


Preload Top Hit 機能とは

iOS Safari は Preload Top Hit という機能がデフォルトで有効になっています。
トップヒットと言うのは、URL入力欄に文字を入力している時、以前アクセスしたことのあるウェブサイトから候補を挙げてくれる機能です。
Preload Top Hit 機能が有効になっていると、このトップヒットがサジェストされた瞬間に、該当のウェブサイトにGETリクエストが発生します。
これからアクセスするであろうウェブサイトを予測し、ロードしておくことでユーザー体験を向上しようということでしょう。

利用者にとっては一長一短

しかしこの Preload Top Hit 機能は、ご丁寧に(恐らく全ての)リソースのダウンロードを発生させます。
ユーザーは体感的にブラウジング速度が向上しているように感じるかもしれませんが、あくまで予測なので無駄な通信が発生しかねないとも言えます。
もし通信量が気になっている、あるいはSafariが重いと感じている方は、設定をOFFにしたほうがいいかもしれません。

具体的な挙動例

一文字入力するごとに履歴から候補が選ばれ、通信が発生します。

  • http:// まで入力
    • http://www.google.com/ に通信が発生
  • http://www.y まで入力
    • http://www.yahoo.co.jp/ に通信が発生
  • http://www.yo まで入力
    • http://www.youtube.com/ に通信が発生
  • http://www.yod まで入力
    • http://www.yodobashi.com/ に通信が発生
  • ...

JavaScript が実行される

なんとこの機能、JavaScript の実行まで行っているようです。
即時実行で XHR 通信する JavaScript を配置した所、サーバーへリクエストが発生しました。
さらにトップヒット候補が変化すると pagehide イベントが発火しました。
こちらも pagehide のイベントハンドラでXHR通信するコードを配置した所、サーバーへリクエストが発生しました。
(ちなみに window.alert() を配置してみましたが、こちらは実行されませんでした。)

何が問題となるか

実際にはユーザーはページを見ていないにも関わらず、サーバーへは普通のリクエストが発生します。
利用者にとっては上述のように意図しない通信が生じる点が問題になりえますが、どちらかと言うとサイト管理者にデメリットが有り、ページのアクセス解析を行っていたり、広告のインプレッション数などを計測している場合、ノイズになっている可能性が考えられます。
通信を見た限りでは、このプリロードは通常のアクセスと識別することが出来なさそうなので、判定は諦めるしかなさそうです。(強いて頑張るならばスクロールやタップ操作のイベント監視などすれば不可能ではなさそうですが・・・)
URLを手動入力するという機会は、お気に入りやリンクによってブラウジングする回数よりは恐らく少ないでしょうから大問題にはならないかと思いますが、こういったノイズが発生しうるという点は留意しておいたほうが良さそうです。