首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何向WKWebView添加启用cookie

如何向WKWebView添加启用cookie
EN

Stack Overflow用户
提问于 2022-12-01 06:41:36
回答 1查看 33关注 0票数 0

我需要在WKWebView中加载带有url的html内容。我试图用loadHTMLString加载该页面,但是会出现错误,比如需要启用third-party cookiesWKWebView

是否有可能允许Third-Party Cookies在WKWebView

代码语言:javascript
运行
复制
let url =
"https://www.ck12.org/lms-integration-service/prod/gcaddon.html?launch_key=21C8B2B198A2ABAEE5C97228EBD90836F6BFB34BD1E4302F6762FF7D12F8D904CDA084B4737EF781A18FC25E4F17EA34&app=ltiApp&extra=eyJyZWRpcmVjdCI6Imh0dHBzOi8vZmxleGJvb2tzLmNrMTIub3JnL2Nib29rL2NrLTEyLW1pZGRsZS1zY2hvb2wtZWFydGgtc2NpZW5jZS1mbGV4Ym9vay0yLjAvc2VjdGlvbi8xLjEvcHJpbWFyeS9sZXNzb24vc2NpZW50aWZpYy1leHBsYW5hdGlvbnMtYW5kLWludGVycHJldGF0aW9ucy1tcy1lcy8ifQ=="

class WebViewController: UIViewController, WKNavigationDelegate {
    
    private var webView: WKWebView!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        configureWebView()
    }
    
    private func configureWebView() {
        let config = WKWebViewConfiguration()
        config.processPool = WKProcessPool()
        webView = WKWebView(frame: .zero, configuration: config)
        webView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(self.webView)
        
        // We pin the web view to the safe area because some pages break otherwise.
        NSLayoutConstraint.activate([
            view.safeAreaLayoutGuide.leftAnchor.constraint(equalTo: webView.leftAnchor),
            view.safeAreaLayoutGuide.rightAnchor.constraint(equalTo: webView.rightAnchor),
            view.safeAreaLayoutGuide.topAnchor.constraint(equalTo: webView.topAnchor),
            view.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: webView.bottomAnchor)
        ])
        
        webView.navigationDelegate = self
        self.loadRequest()
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        
    }
    
    private func loadRequest() {
        DispatchQueue.main.async {
            let url = URL(string: url)!
            var request =  URLRequest(url: url)
            request.httpShouldHandleCookies = true
            self.webView.load(request)
        }
    }
    
    // Errors
    
    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        showAlert(for: error)
    }
    
    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        showAlert(for: error)
    }
    
    private func showAlert(for error: Error) {
        let alert = UIAlertController(title: "Error", message: "\(error)", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        present(alert, animated: true, completion: nil)
    }
    
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        decisionHandler(.allow)
    }
    
    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
        
        guard let response = navigationResponse.response as? HTTPURLResponse,
              let url = navigationResponse.response.url else {
            decisionHandler(.cancel)
            return
        }
        
        if let headerFields = response.allHeaderFields as? [String: String] {
            let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: url)
            print( "cookies", cookies)
            cookies.forEach { cookie in
                webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)
            }
        }
        decisionHandler(.allow)
    }
}

在上面的代码中,htmlStringurl将从后端获得。从网址获取下面的页面。

EN

回答 1

Stack Overflow用户

发布于 2022-12-01 06:50:32

WKWebView提供WKNavigationDelegate提供的不同回调。可以使用的是func webView(WKWebView, decidePolicyFor: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void).

每次返回响应时,都可以从头字段获取cookie并将其保存到cookie存储中。解决办法如下:

代码语言:javascript
运行
复制
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
  guard let response = navigationResponse.response as? HTTPURLResponse,
    let url = navigationResponse.response.url else {
    decisionHandler(.cancel)
    return
  }

  if let headerFields = response.allHeaderFields as? [String: String] {
    let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: url)
    cookies.forEach { cookie in
      webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)
    }
  }
  
  decisionHandler(.allow)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74637851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档