在WKWebView中丢失Cookies

10
当我使用身份验证cookie创建新的WKWebView请求并发送请求时,WKWebView正确加载受保护的网页。
let req = NSMutableURLRequest(URL: NSURL(string: urlPath)!)
let headers = NSHTTPCookie.requestHeaderFieldsWithCookies([myAuthCookie]);
req.allHTTPHeaderFields = headers;
webView.loadRequest(req)

问题在于,当用户在网页中点击任何链接时,使用新请求WKWebView会丢失身份验证 cookie 并被重定向到登录页面。Cookie 域和路径已填写正确。
我知道这里提到了WKWebView缺少的功能。
提前感谢您的任何想法。

我已经为这个问题苦苦挣扎了好几天了。看起来在WKWebView中,cookie的存储和使用如此不稳定,这让人感到困惑。期待听到任何解决方案。 - Chris
可能是Can I set the cookies to be used by a WKWebView?的重复问题。 - Krešimir Prcela
3个回答

8

最好的做法是将您的cookie存储在

[NSHTTPCookieStorage sharedHTTPCookieStorage]

每次想要加载请求时,请调用此函数:
- (void)loadRequest:(NSURLRequest *)request {
        if (request.URL) {
            NSDictionary *cookies = [NSHTTPCookie requestHeaderFieldsWithCookies:[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL]];
            if ([cookies objectForKey:@"Cookie"]) {
                NSMutableURLRequest *mutableRequest = request.mutableCopy;
                [mutableRequest addValue:cookies[@"Cookie"] forHTTPHeaderField:@"Cookie"];
                request = mutableRequest;
            }
        }

        [_wkWebView loadRequest:request];
}

它从共享的cookies中提取正确的cookies,并将其包含在您的请求中。


WKWebView的loadRequest方法返回WKNavigation对象而不是void类型:[https://developer.apple.com/reference/webkit/wkwebview/1414954-loadrequest] - gyimi
1
你的评论是:“那么每次你想要加载请求时,调用这个函数而不是 -(void)loadRequest:(NSURLRequest*)request。” WKWebView 的 loadRequest 返回的是 WKNavigation* 而不是 void。你写的内容在 UIWebView 上运行得很完美,但是该问题是关于 WKWebView 的。 - gyimi
它实际上是有效的(我在 UIWebview/WkWebview 的包装器中使用它)。它加载请求,但我们只是不使用结果。 - The Windwaker
我需要在这里寻求帮助 @TheWindwaker - Siva
我这里看不到你的问题。 - The Windwaker

2

我猜想当您在请求中设置cookie时,您将cookie发送到服务器但没有在WKWebview中设置它。通常,服务器通过“Set-Cookie”标头设置cookie,然后应该持久化。因此,如果您不需要处理cookie传递到服务器并返回的问题,则可以使用以下技巧:

  1. 在第一个请求中发送cookie
  2. 让服务器在“Set-Cookie”标头中将其发送回来
  3. 每个随后的请求都应该有cookie

我还没有尝试过这种方法,但如果它不起作用,我会非常惊讶。

如Sebastien所提到的,另一种方法是通过JavaScript注入cookie。请注意,您不能以这种方式设置“HTTP-Only”标志,并且所有运行脚本都可以使用cookie(https://www.owasp.org/index.php/HttpOnly)。

我仍在努力寻找自然地设置cookie的方法,但我认为它不存在。

希望对您有所帮助。


嗨Alex,你知道这里有没有什么变化吗?在WKWebView中处理cookie是否更好了? - J2N
嗨JLaw,看这里https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/Objective-C/WebKit.html 我认为他们提供了在iOS9中处理cookies的好方法,尽管我自己还没有尝试过。 - Alex
这真是太棒了,正是我需要的Node.js自定义服务器。简直不敢相信我居然没有想到。我一直在反向建模cookie获取过程。当然,服务器需要发送Set-Cookie以使WKWebView将其集成回其内部(不透明?!?啊)cookie存储器中。当WKWebView在loadRequest中包含它时,它是一个任意已发送标题。Web服务器默认情况下不需要回显'Set Cookie'--因为它正确地假设浏览器已经有了它。 - BaseZen

0

您可以将一些JavaScript注入到Web视图中,以加载Cookie,这样由Web视图发起的请求也将具有您的Cookie。有关更多详细信息,请参见此问题的答案:

https://dev59.com/Tl8d5IYBdhLWcg3wpzr4#26577303


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接