概要
iOS11から実装された WKHTTPCookieStore
の getAllCookies
の completionHandler
が
呼ばれなくなる不具合に気づいたのでメモ
WKWebsiteDataStore.default().httpCookieStore.getAllCookies { cookies in
// 呼ばれない場合がある
}
WKWebViewConfiguration
に WKProcessPool
を設定して WKWebView
を表示し、
その後 WKWebView
を addSubview
した UIView
がなくなると
getAllCookies
の completionHandler
が呼ばれなくなるようです
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
URLSession
の shared
では WKWebsiteDataStore.default()
と同じ HttpCookieStore
が参照されるため、WebViewのセッションを使ってAPI等にリクエストしている場合は注意が必要です
ちなみに WKProcessPool
を使用して WKWebView
を表示する前であれば、
getAllCookies
の completionHandler
は正常に動作するようです。
対策
CGRect(x: 0, y: 0, width: 0, height: 0)
でサイズ0のWebViewを作成し、 addSubview
してひとまず回避。
WKWebView
が UIScreen
のどこかしらに描画されてさえいればいいようです。