WKWebViewでプライベートブラウズ(シークレットモード)を実装する方法を紹介します。 後半は、WebView同士のセッション引き継ぎについても紹介。

使い所

  • アプリをKillしたらCookieを消したい
  • アプリからログアウトしたらCookieを消したい(ガワネイティブ案件)
  • セキュリティ(?)の理由から、サンドボックスにさえもデータを残したくない

いろいろ消す処理を独自で実装するくらいなら、いっそWebViewをプライベートブラウズにするのはいかがでしょうか?

基本的な実装

超シンプル。

let config = WKWebViewConfiguration()
config.websiteDataStore = .nonPersistent()  // これだけ!!

let webView = WKWebView(frame: .zero, configuration: config)
...

WKWebsiteDataStoreを不使用(というよりは永続化しない、その場限りの使用)にすることで、プライベートブラウズは実現します。

詳しくは、Apple Developerの当該項目を参照してください。
nonPersistent() - WKWebsiteDataStore | Apple Developer Documentation

応用的な実装 - 他のWebViewにセッションを引き継ぐ

target="_blank"のリンクを踏むなど、他のWebViewにセッションを引き継ぎたい場合もあります。 そんなときは、WKProcessPoolのインスタンスを共有します。

まずは、WKProcessPoolのシングルトンインスタンスを作ります。
(どこのサイトを参考にしたか忘れてしまった……申し訳ない)

extension WKProcessPool {
    static var shared = WKProcessPool()

    // セッションを消去したいときに呼ぶよ
    func reset() {
        WKProcessPool.shared = WKProcessPool()
    }
}

あとは、そのWKProcessPoolのインスタンスを、事前に双方のWKWebViewに持たせておくだけ。

let config = WKWebViewConfiguration()
config.websiteDataStore = .nonPersistent()
config.processPool = WKProcessPool.shared  // これだけ!!

let webView = WKWebView(frame: .zero, configuration: config)
...

これで、プライベートブラウズの状態でも、WebView同士でセッションを引き継げるようになりました。

まとめ

  • WKWebViewのWebsiteDataStoreを.nonPersistent()に指定することで、プライベートブラウズを実現
  • .nonPersistent()を指定しても、WebViewインスタンスが生きている間、DataStoreは普通に使える
  • さらに、WKProcessPoolを同一インスタンスにしておくと、他のWebViewにもセッションを引き継げる

これで安心ですね!