while getting cookies from UIWebView
seems straightforward by using NSHTTPCookieStorage.sharedHTTPCookieStorage()
, it seems WKWebView
stores the cookies somewhere else.
I did some research, and I was able to get some cookies from the grabbing it from NSHTTPURLResponse
object. this, however, does not contain all the cookies used by WKWebView
:
func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void) {
if let httpResponse = navigationResponse.response as? NSHTTPURLResponse {
if let headers = httpResponse.allHeaderFields as? [String: String], url = httpResponse.URL {
let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headers, forURL: url)
for cookie in cookies {
logDebug(cookie.description)
logDebug("found cookie " + cookie.name + " " + cookie.value)
}
}
}
}
Strangely, there's also a class WKWebsiteDataStore
in ios 9 that responsible for managing cookies in WKWebView
, however, the class does not contain a public method to retrieve the cookies data:
let storage = WKWebsiteDataStore.defaultDataStore()
storage.fetchDataRecordsOfTypes([WKWebsiteDataTypeCookies], completionHandler: { (records) -> Void in
for record in records {
logDebug("cookie record is " + record.debugDescription)
for dataType in record.dataTypes {
logDebug("data type is " + dataType.debugDescription)
// get cookie data??
}
}
})
Is there a workaround for getting the cookie data?
Cookies used (created) by the WKWebView
are actually correctly stored in the NSHTTPCookieStorage.sharedHTTPCookieStorage()
.
The problem is that the WKWebView
does not write back the cookies immediately. I think it does this on its own schedule. For example when a WKWebView
is closed or maybe periodically.
So eventually they do end up in there, but when is unpredictable.
You may be able to force a 'sync' to the shared NSHTTPCookieStorage
by closing your WKWebView
. Please let us know if this works.
Update: I just remembered that in Firefox for iOS we force the WKWebView
to flush its internal data, including cookies, by replacing its WKProcessPool
with a new one. There is no official API, but I am pretty sure that is the most reliable workaround right now.