Swift 4 WKWebView файлы cookie извлекают и удаляют проблему синхронизации - PullRequest
0 голосов
/ 01 марта 2019

Я создаю приложение, которое принимает решение о входе / выходе пользователя и других действиях на основе файлов cookie WkWebView.В большинстве случаев все работает нормально.Иногда не удается получить файлы cookie при успешном входе в систему.И не удается удалить куки, когда пользователь вышел из системы.Даже когда я быстро захожу или выхожу из системы, он показывает неверный / предыдущий токен сеанса.

Моя реализация выглядит так:

    func loadWebView () {

    let webConfiguration = WKWebViewConfiguration()
    webView = WKWebView(frame:  UIScreen.main.bounds, configuration: webConfiguration )
    webView.customUserAgent = APP_IDENTITY.appending("|") + Utility.deviceID().appending("|") + PSUserDefaults.getFCMToken()

    webView.navigationDelegate = self
    webView.uiDelegate = self
    webView.load(DOMAIN_URL)
  }

extension WKWebView {
func load(_ urlString: String) {
    if let url = URL(string: urlString) {
        let request = URLRequest(url: url)
        load(request)
    }
}

func cleanAllCookies() {
    HTTPCookieStorage.shared.removeCookies(since: Date.distantPast)
    print("All cookies deleted")

    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")
        }
    }
}

func refreshCookies() {
    self.configuration.processPool = WKProcessPool()
}

func removeCookies(){
    let cookie = HTTPCookie.self
    let cookieJar = HTTPCookieStorage.shared

    for cookie in cookieJar.cookies! {
        cookieJar.deleteCookie(cookie)
        print("removeCookies")
    }
 }
  }

И делегат:

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
 // i am getting the cookies here most of the time. Sometimes , it failed to sync the cookies from here. 
     if #available(iOS 11.0, *) {
        print(webView.configuration.websiteDataStore.httpCookieStore.getAllCookies({ (webViewCookies) in

            let wkHttpCookieStorage = WKWebsiteDataStore.default().httpCookieStore;

            wkHttpCookieStorage.getAllCookies { (cookies) in
                // Nothing comes here sometimes !
                for cookie in cookies { 
                  }
 }

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    print("decidePolicyFor navigationAction : \(navigationAction.request.url!)")
   // Each URl navigation is happen properly on time 
   }

// I was checking the HTTPCookieStorage with a timer when it fails to get cookies in didFinish (wkwbeview ...) delegate method.  
func checkHTTPCookieStorage (){

        let cookieJar = HTTPCookieStorage.shared
        for cookie in cookieJar.cookies! {
              }
  }

I also check the print(webView.configuration.websiteDataStore.httpCookieStore.getAllCookies({ (webViewCookies) in {} values with a timer when it fails to fetch cookies. Nothing works sometimes. 

Выйдя из системы, я удаляю куки вручную из метода расширения всеми способами:

         self.webView.cleanAllCookies()
         self.webView.removeCookies()

Замечание: В большинстве случаев он получает файлы cookie при входе в систему и может удалять файлы cookie при выходе из системы.Иногда это занимает 3 ~ 10 секунд, и я получаю куки, когда я применяю таймер для получения куки.Иногда это полностью провалилось.Мне нужно перезапустить приложение, тогда оно получит куки.Это раздражительно!

Я видел какой-то блог, отчет, сообщение о проблемах с файлами cookie в wkWebview, но мне ничего не помогло.

Мой вопрос:

  1. Как я могу постоянно получать / удалять файлы cookie?
  2. Что-то не так с моей реализацией?

Спасибо всем.

...