2017-06-15 118 views
2

我向url1发送了请求。 url1将通过cookie重定向到url2。 url2用于授权。我得到代码“302找到”,这是正确的。 但是当url2重定向回url1时,cookie丢失了。这导致我的请求保持重定向到url2,循环直到失败。当使用代码302重定向时,WKWebView无法设置Cookie

有没有人遇到过这样的问题并且知道解决方案?提前致谢。

这是一个WKWebView问题。 UIWebView将正常工作。但不知何故,我需要改变使用WKWebView。

我已经尝试了很多解决方案,例如Can I set the cookies to be used by a WKWebView?。这些方法可以处理同一个域中的cookie。我的问题是url1和url2有不同的域名。重定向时,Cookie丢失,导致授权失败,导致url1和url2之间循环。

有没有人遇到这个问题,并找到了解决方法?提前致谢。

+0

看起来像一个副本https://stackoverflow.com/questions/40659341/wkwebview-cant-carry-cookie-for-302-redirect 虽然没有解决! –

回答

2

如果需要从“URL2”的后续请求有自己的cookies设置,你可以在文档尝试使用“WKUserScript”来通过JavaScript编程设定的值开始像这样:如果你

WKUserContentController* userContentController = WKUserContentController.new; 
WKUserScript * cookieScript = [[WKUserScript alloc] 
    initWithSource: @"document.cookie = 'TeskCookieKey1=TeskCookieValue1';document.cookie = 'TeskCookieKey2=TeskCookieValue2';" 
    injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO]; 
// again, use stringWithFormat: in the above line to inject your values programmatically 
[userContentController addUserScript:cookieScript]; 
WKWebViewConfiguration* webViewConfig = WKWebViewConfiguration.new; 
webViewConfig.userContentController = userContentController; 
WKWebView * webView = [[WKWebView alloc] initWithFrame:CGRectMake(/*set your values*/) configuration:webViewConfig]; 

然而,要求你的cookies要在初始加载请求设置,你可以把它们放在NSMutableURLRequest像这样:

WKWebView * webView = /*initialization stuff*/ 
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"YOUR URL"]]; 
[request addValue:@"TestCookieKey1=TestCookieValue1;TestCookieKey2=TestCookieValue2;" forHTTPHeaderField:@"Cookie"]; 
// use stringWithFormat: in the above line to inject your values programmatically 
[webView loadRequest:request]; 

你可以结合以上两种技术从天然环境中转移Cookie值的WebView环境。

您可以参考此link获取有关cookie的更多高级信息。

+0

谢谢。如何在随后的请求url2中注入cookie?在“navigationAction”或“navigationResponse”中写入此用户脚本?我在其他堆栈溢出中看到类似的答案。我很困惑哪个委托方法会更新cookie?你可以告诉我吗? –

+0

@ T.W你可以看看这个代码的github回购。 https://github.com/haifengkao/YWebView。它是一个带有持久cookie的自定义WKWebview类。 – tek3

+2

@ tek2对不起。你的答案和github回购都不能解决这个重定向问题。我在发布这个问题之前已经尝试过。 –

2

不幸的是,在WKWebView中没有官方支持来处理302重定向响应。我也遇到过同样的问题。有一种方法可以解决,但可能会带来一些风险并且不够优雅。

  1. 覆盖WKWebView.load(_ request: URLRequest)并改用URLSession来发出请求。
  2. 确保你的URLSession可以自己处理302重定向,这意味着你需要实现func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void)来指定你不希望URLSession自动处理302重定向。
  3. 一旦使用URLSession得到302响应,附加的cookie将自动设置为HTTPCookieStorage.shared。然后用这些cookie和响应标题字段LocationWKWebView本身发出新请求。

的代码示例是Here。我的子类WKWebView在最情况下还应对饼干包括你的302重定向case.If它为你工作,请给我一个明星THX!

这是一种真正的黑客方式,要小心如果你想在产品中使用它。

+0

您的WKWebView完美适用于从UIWebView到WKWebView的迁移。自从您发布该代码后,是否遇到过有关此代码的任何问题?谢谢! –

+0

非常感谢! –

+0

@Justin Domnitz在iOS9以下的请求将被发送两次,而不是在css/js不工作的情况下调用'loadHTMLString'(也在源代码中注释)。我不确定它是否适合您的情况。 – Xingxing