当使用代码302重定向时,WKWebView无法设置cookie

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

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

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

我已经尝试了很多解决方案,例如我可以设置WKWebView使用的cookie吗? 。 这些方法可以处理同一域中的cookie。 我的问题是url1和url2有不同的域名。 重定向时,cookie丢失,导致授权失败,导致url1和url2之间的循环。

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

不幸的是,没有官方支持在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和响应头字段的url创建一个新请求由WKWebView本身定位。

代码示例是Here .I子类WKWebView并且在大多数情况下也处理cookie,包括你的302重定向情况。如果它适合你,请给我一个明星thx!

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

如果您需要来自’url2’的后续请求来设置其Cookie,您可以尝试使用’ 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]; 

但是,如果您需要在初始加载请求中设置cookie,则可以在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值从Native环境传输到WebView环境。

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

另一个解决方案对我有用:

采用WKNavigationDelegateWKNavigationDelegate webView.navigationDelegate = self ,然后:

 func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { /// Cancel the navigation action decisionHandler(.cancel) /// Navigate yourself let request = NSMutableURLRequest(url: url) request.allHTTPHeaderFields = HTTPCookie.requestHeaderFields(with: Auth.getAuthCookies()) webView.load(request as URLRequest) } 

这就是我的简单案例所需要的全部内容,但我想其他人可能还需要复制存储在navigationAction.request的其他请求信息,例如navigationAction.request.allHTTPHeaderFields

我想iOS 11的正确解决方案是使用WKHTTPCookieStore 。 根据本主题演讲,它旨在解决这个问题。