WKWebViewで最初に読み込んだページに戻る

WKWebViewの最初に読みこんだページ(URL)に戻りたいことがあったので、いろいろ調べたらwebView.goToBackForwardListItem(item: WKBackForwardListItem)で実現できました。

let webView = WKWebView()

let count = webView.backForwardList.backList.count
guard let rootItem = webView.backForwardList.itemAtIndex(-count) else { return }
webView.goToBackForwardListItem(rootItem)

解説

backForwardListで戻る履歴の数を取得します。わざわざ履歴の数を取得するのは、最初のページのWKBackForwardListItemを取得するwebView.backForwardList.itemAtIndex(index: Int)で指定するindexが現在のページからの相対値になるので、履歴数をマイナスで指定する必要があります。 取得したらそのWKBackForwardListItemをgoToBackForwardListItemに渡すだけです。

loadRequestではだめな理由

この方法を使う以外だと、最初に読み込んだURLを保存しておいて、そのURLをloadRequestで読み込むという方法が思い付きました。 ですが、今回はUIとしてあくまで「履歴の最初に戻る」というイメージが持てるような動作にしたいという要件がありました。 loadRequestの場合、履歴のスタックに最新の履歴として、そのリクエストが載ってしまい要件が満たせません(goBackで戻れてしまう)。

まとめ

  • goToBackForwardListItem(rootItem)
    • 戻る履歴は「0」になる(履歴の最初に戻るので)
    • 進む履歴は維持される
    • イメージ:
      • ■□□□□□□□
  • loadRequest(firstPageRequest)
    • 履歴の先頭にfirstPageRequestが載るため、戻る履歴は維持される
    • このリクエストが履歴の先頭になるので、進む履歴は無い
    • イメージ:
      • □□□□□□□□■
      • goToBackForwardListItem(rootItem)の場合より、履歴の数は1つ多くなる