iOS
Swift
WKWebView

WKHTTPCookieStoreのgetAllCookiesのcompletionHandlerが呼ばれない


概要

iOS11から実装された WKHTTPCookieStoregetAllCookiescompletionHandler

呼ばれなくなる不具合に気づいたのでメモ

WKWebsiteDataStore.default().httpCookieStore.getAllCookies { cookies in

// 呼ばれない場合がある
}

WKWebViewConfigurationWKProcessPool を設定して WKWebView を表示し、

その後 WKWebViewaddSubview した UIView がなくなると

getAllCookiescompletionHandler が呼ばれなくなるようです

iOS12.1.2で確認しましたが、他のバージョンでも起きるようです(※ シミュレーターでは再現しませんでした)

https://stackoverflow.com/questions/55565188/wkhttpcookiestore-getallcookies-completionhandler-not-called-in-some-os-versions


原因

下記URLにも書かれていますが、 WkWebView が非表示状態になると、 WKProcessPool が待機状態になり、

HttpCookieStore へのアクセスがブロックされてしまう場合があるようです。

https://bugs.webkit.org/show_bug.cgi?id=188242

URLSessionshared では WKWebsiteDataStore.default() と同じ HttpCookieStore が参照されるため、WebViewのセッションを使ってAPI等にリクエストしている場合は注意が必要です

ちなみに WKProcessPool を使用して WKWebView を表示する前であれば、

getAllCookiescompletionHandler は正常に動作するようです。


対策

CGRect(x: 0, y: 0, width: 0, height: 0) でサイズ0のWebViewを作成し、 addSubview してひとまず回避。

WKWebViewUIScreen のどこかしらに描画されてさえいればいいようです。


参考

https://bugs.webkit.org/show_bug.cgi?id=188242