IT業界で気づいたことをこっそり書くブログ

くすぶってるアプリエンジニアが、日々気づいたことを適当に綴っていきます(受託→ベンチャー→フリー→大企業→ベンチャー→起業)

UIWebViewからWKWebViewに移行する際にハマること(特にCookie周り)

Qiitaに書こうかと思ったんですが、完全に理解できていない情報が多いため、ログとして残します。

 

Cookie周りが非常に厄介

UIWebViewとUIWebViewはCookieやSessionが同期されます。
iOS11以降において、WKWebViewとWKWebViewも同期されます(?)
iOS10以下において、WKWebViewとWKWebViewは同期されません。
iOS11以降においても、UIWebViewとWKWebViewは同期されません。

同期するためにおそらくこちらの方法を使うと思いますが未検証です。

WKWebViewでのSessionの共有 - Qiita

同期されるのかされないのか問題は未だ非常に曖昧です。
同期される条件やタイミングなど。

 

参考

WKProcessPoolが違ってもWKWebView同士のcookieを同期されていた - しめ鯖日記

 

バージョンアップでセッションが切れる

当然、UIWebViewをWKWebViewに移行すると、Sessionが切れるため対応が必要です。
対応方法は未検証。

 

iOS10以下ではCookieの取り出しが困難

これは調べると結構でてきます。ただ取り出し方はこれだというサンプルコードがありません。javascriptを使い強制的に取るしか無いようです。

 

Cookieの設定タイミングが妙

webページ読み込み終了した後Cookieを取ろうとして取れないことがありました。UIWebViewとタイミングが違う可能性があります。要検証。

 

Cookieの削除が厄介

普通に消えないようです。
ここが非常に詳しい。

[Swift]Cookieの削除|杏z学習帳

 

認証関係で少しハマる

ググれば出てきますが、Basic認証SSL

func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)

こちらを使用する場合、UIWebViewのときとは処理の方法が少し変わります。

特に何もしない場合は

completionHandler(.performDefaultHandling)

を呼んでやります。呼ばないと落ちます(やめて!)

 

WKWebView操作に関するキーワード

WKNavigationDelegate ほとんどこれです
NSKeyValueObserving 上とこの2つがメインです
NSURLConnectionDelegate Auth関係で使う場合があります
WKHTTPCookieStoreObserver(これは動くのか不明、私が未検証なのではなく公式的に曖昧)

 

 

罠だらけ!

WebViewアプリはiOS13,14対応で一回血反吐吐くかもしれませんねこれ。

 

何故こんなに厄介なのか?

おそらくですが、UIWebViewと、WKWebView(iOS10まで)と、WKWebView(iOS11から)の情報が混ざってるからです。

 

 

追記:2019/11/26

 

メモ:WKWebViewの特徴


Cookieをセットしてcompletionが呼ばれてもセットされていない
・例えWKWebViewから該当のCookieを取得できてもセットされていない
・WKWebView1に反映したのに、別のWKWebView2に反映される
・アプリ削除して再インストールしてもCookieが消えていないことがある(大抵消えます)