WKWebViewでプライベートブラウズを実装する方法
Table of Contents
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にもセッションを引き継げる
これで安心ですね!