【问题标题】:WkWebView unable to reset CookiesWkWebView 无法重置 Cookie
【发布时间】:2021-02-23 04:08:15
【问题描述】:

decidePolicyFor navigationAction 中的自定义 cookie 过期或丢失后,我无法重置或更新自定义 cookie。我尝试在decidePolicyFor navigationAction函数中重置cookie,似乎没有更新或无法设置cookie。

这是我的一些代码,

@IBOutlet weak var customWebView: UIView!
var webView : WKWebView!
var liveURL = "myLiveUrl"
let cookie = HTTPCookie(properties: [
        .domain: "myLiveDomain",
        .path: "/",
        .name: "some name",
        .value: "some value",
        .secure: "TRUE",
        .expires: NSDate(timeIntervalSinceNow: 10)
])
var isCookieReset : Bool = true
var urlrequestCurrent: URLRequest?

override func viewDidLoad() {
   super.viewDidLoad()
   self.addWebView()
}

private func addWebView(){
    webView = WKWebView(frame: customWebView.bounds)
    webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie!)
    webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    webView.translatesAutoresizingMaskIntoConstraints = false
    webView.uiDelegate = self
    webView.navigationDelegate = self
    customWebView.addSubview(webView)

    DispatchQueue.main.async {
         self.webView.load(URLRequest.init(url: URL.init(string: self.liveURL)!))
    }
}


func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

   webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
           
   self.isCookieReset = true
            
   for cookie in cookies {
      if cookie.name.contains("some name") {
           self.isCookieReset = false
         }
   }
          
   if(self.isCookieReset == true) {
               
      if let currentrequest = self.urlrequestCurrent {
         if currentrequest == navigationAction.request {
            self.urlrequestCurrent = nil
            decisionHandler(.allow)
            return
         }
      }

      decisionHandler(.cancel)
                
      var customRequest = navigationAction.request
      webView.configuration.websiteDataStore.httpCookieStore.setCookie(self.cookie!)
      self.urlrequestCurrent = customRequest
      self.webView.load(customRequest)
      return
   } else {
         decisionHandler(.allow)
   }
  }
}

【问题讨论】:

    标签: ios swift wkwebview


    【解决方案1】:

    使用以下方法在您的决定策略中获取 cookie 字符串。你需要解析和存储。

    self.web.configuration.websiteDataStore.httpCookieStore.getAllCookies{ cookies in
    //  print("==igcookies==: ", cookies)
    for data in cookies {
       print(data)
    }
    }
    

    如果您想从 webview 中删除所有 cookie。尝试以下方法将清除您 WKWebView 中的所有 cookie。

    if #available(iOS 14.0, *) {
        HTTPCookieStorage.shared.removeCookies(since: Date.distantPast)
        WKWebsiteDataStore.default().fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in
            records.forEach { record in
                WKWebsiteDataStore.default().removeData(ofTypes: record.dataTypes, for: [record], completionHandler: {})
                print("Cookie ::: \(record) deleted")
            }
        }
        print("All cookies deleted")
    }else{
        let cookieJar = HTTPCookieStorage.shared
        if let cookies = cookieJar.cookies{
            for cookie in cookies {
                cookieJar.deleteCookie(cookie)
            }
        }
        HTTPCookieStorage.shared.removeCookies(since: Date.distantPast)
    }
    

    如果你想清除特定的cookie。这里需要将cookie值设置为空白。

    if #available(iOS 11.0, *) {
                    for cookie in (cookiestring!.split(separator: ";")) {
                        let data = cookie.split(separator: "=")
                        let userCookie = HTTPCookie(properties: [
                            .version:1,
                            .domain: "www.yourhost.com",
                            .path: "/",
                            .name: data[0],
                            .value: "",
                            .secure: "TRUE",
                            .expires: NSDate(timeIntervalSinceNow: 31556926)
                        ])!
                          print("==userCookie== ", userCookie)
                        self.web.configuration.websiteDataStore.httpCookieStore.setCookie(userCookie)
                    }
                }
    

    希望它有助于解决您的问题。请看一下,如果有任何遗漏,请告诉我。

    【讨论】:

    • 假设我想清除一个特定的 cookie,我是否应该只设置相同的 cookie 名称和值和新的到期日期?另外,我应该在哪里放置您建议的代码?在我的decidePolicyFor 方法中?而且,cookiestring是从哪里来的?
    • @Drew 看看我更新的答案。当您想更改/重置 cookie 时,只需使用我建议的代码。
    猜你喜欢
    • 2018-12-01
    • 2017-11-18
    • 2021-11-23
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多