我正在尝试将现有的应用程序从UIWebView切换到WKWebView.当前应用程序管理Web视图之外的用户登录/会话,并将身份验证所需的cookie设置为NSHTTPCookieStore.不幸的是,新的WKWebView不使用NSHTTPCookieStorage中的cookie.还有另一种方法来实现这一目标吗?
虽然UIWebView通过使用来获取cookie 似乎很简单NSHTTPCookieStorage.sharedHTTPCookieStorage(),但它似乎WKWebView将cookie存储在其他地方.
我做了一些研究,然后我从NSHTTPURLResponse对象中抓取了一些饼干.但是,这并不包含以下所用的所有Cookie 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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是WKWebsiteDataStore,ios 9中还有一个负责管理cookie WKWebView的类,但是,该类不包含检索cookie数据的公共方法:
let storage = WKWebsiteDataStore.defaultDataStore() …Run Code Online (Sandbox Code Playgroud) 我有多个ViewControllers,每个都有一个嵌入的WKWebView.应用程序启动一个初始视图控制器,用于访问服务器中的内容,WKWebView应为其存储会话信息.当用户单击TabBarController中的选项卡时,将启动一个带有嵌入式WKWebView的新视图控制器.这个新的WKWebView实例为同一域中的不同页面加载新的URL请求.但是,似乎会话在WebView的不同实例之间保持不变,因为页面未正确显示.我已经通过强制从原始视图控制器强制加载同一页面并且该页面正确呈现来验证它是WKWebView问题.此外,我使用iOS Safari浏览器打开了同一个站点,它正确显示页面.
我已经尝试了几种不同的方法来解决这个问题,而不是传递一个WKWebView实例.我首先尝试传递一个持久的WKProcessPool实例,但是没有用.我检查了视图控制器中每个加载请求的WKWebSiteDataStore对象,它是内存位置上的相同对象.我也试过传递一个持久的WKWebViewConfiguration对象,但是效果不好!
如何在单独的WKWebView实例之间保持会话存储?
我想从WKWebView获取所有cookie.为什么?我已经启动了一个使用基于Web的身份验证的项目.因此,我应该拦截cookie以确保用户已登录并用于其他目的.另一种情况 - 想象一下,如果用户登录,而不是"杀死"应用程序 - 由于存储此cookie会话的一些延迟将丢失:(.
问题似乎是cookie被缓存而不是立即保存到文件中.
(@Kemenaran从这里 - 下面的第5页)
我试图抓住他们的地方 -
webView:decidePolicyForNavigationResponse:decisionHandler:,
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 {
NSHTTPCookieStorage.shared.set(cookie)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但并非所有请求都是导航,因此跳过一个cookie(在我的情况下),请参阅下面的详细信息
关于我试过的其他选项的几句话......
WKHTTPCookieStore提到.但我的项目应该支持iOS 9+我100%肯定,在登录后5-10秒,所需的cookie将保存到NSHttpCookieStorage(至少我几天的所有测试都确认)
我尝试使用提供的观察者NSHTTPCookieManagerCookiesChangedNotification,但它只为内部的cookie提供回调webView:decidePolicyForNavigationResponse:decisionHandler
我也尝试使用这里提到的一些JS来获取cookie …