Получение всех файлов cookie из WKWebView

в то время как получение файлов cookie из UIWebView кажется простым, используя NSHTTPCookieStorage.sharedHTTPCookieStorage() , кажется, что WKWebView хранит файлы cookie в другом месте.

Я провел некоторое исследование, и я смог получить некоторые файлы cookie из захвата его из объекта NSHTTPURLResponse . это, однако, не содержит всех файлов cookie, используемых WKWebView :

 func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void) { if let httpResponse = navigationResponse.response as? NSHTTPURLResponse { if let headers = httpResponse.allHeaderFields as? [String: String], url = httpResponse.URL { let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headers, forURL: url) for cookie in cookies { logDebug(cookie.description) logDebug("found cookie " + cookie.name + " " + cookie.value) } } } } 

Как ни странно, есть класс WKWebsiteDataStore в ios 9, который отвечает за управление куки в WKWebView , однако класс не содержит общедоступный метод для получения данных cookie:

 let storage = WKWebsiteDataStore.defaultDataStore() storage.fetchDataRecordsOfTypes([WKWebsiteDataTypeCookies], completionHandler: { (records) -> Void in for record in records { logDebug("cookie record is " + record.debugDescription) for dataType in record.dataTypes { logDebug("data type is " + dataType.debugDescription) // get cookie data?? } } 

Есть ли способ обхода файлов cookie?

Наконец, httpCookieStore для WKWebsiteDataStore приземлился в iOS 11.

https://developer.apple.com/documentation/webkit/wkwebsitedatastore?changes=latest_minor

Файлы cookie, созданные (созданные) WKWebView , на самом деле правильно хранятся в NSHTTPCookieStorage.sharedHTTPCookieStorage() .

Проблема в том, что WKWebView не сразу записывает файлы cookie. Я думаю, что это делается по собственному графику. Например, когда WKWebView закрыт или может быть периодически.

Поэтому, в конце концов, они в конечном итоге оказываются там, но когда это непредсказуемо.

Вы можете принудительно «синхронизировать» с общим NSHTTPCookieStorage , закрыв WKWebView . Пожалуйста, сообщите нам, если это сработает.

Обновление : я только что вспомнил, что в Firefox для iOS мы вынуждаем WKWebView свои внутренние данные, включая файлы cookie, путем замены его WKProcessPool на новый. Официального API нет, но я уверен, что это самый надежный обходной путь прямо сейчас.

Как отметил Стефан, файлы cookie хранятся в NSHTTPCookieStorage.sharedHTTPCookieStorage()

Однако из моих экспериментов я обнаружил, что cookie сеанса, установленный сервером, не отображается NSHTTPCookieStorage.sharedHTTPCookieStorage() .

Пока каждый WKWebView имеет один и тот же экземпляр WKProcessPool , эти куки сеанса будут переданы на сервер для каждого запроса. Если вы измените пул процессов для WKWebView , вы фактически удалите файлы cookie сеанса для всех будущих запросов.

На практике я нашел в методе «solvePolicyForNavigationResponse», вы можете использовать следующий способ получения файлов cookie, но печально, что это не полный / цельный список для сеанса.

 let response = navigationResponse.response as! NSHTTPURLResponse let headFields = response.allHeaderFields as! [String:String] let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headFields, forURL: response.URL!) 

Этот пост содержит полезную информацию о обработке файлов cookie с помощью WKWebView. В соответствии с этим вы должны иметь возможность устанавливать и извлекать файлы cookie с помощью стандартных NSURLCache и NSHTTPCookie. Он также ссылается на использование WKProccessPool в соответствии с комментарием Стефана.

В NSHTTPCookie.cookiesWithResponseHeaderFields(headers, forURL: url) , что произойдет, если URL-адрес, где установлены файлы cookie, не является URL-адресом ответа на навигацию (URL-адрес, который вызывает навигацию)? Я замечаю, что URL-адрес обратного вызова, где установлены файлы cookie, никогда не вызывается в resolPolicyFor navigationResponse.

 func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) { let response = navigationResponse.response as! HTTPURLResponse let cookies = HTTPCookie.cookies(withResponseHeaderFields: response.allHeaderFields as! [String : String], for: response.url!) } 

Вышеупомянутый делегат никогда не выполняется для URL-адреса обратного вызова, так как сам обратный вызов не вызвал навигацию по страницам.

печенье (withResponseHeaderFields: для 🙂

  • Отключить WKWebView для открытия ссылок для перенаправления на приложения, установленные на моем iPhone
  • Невозможно изменить скорость прокрутки WKWebView на iOS 9 beta / 9.3
  • Метод делегата UIWebView долженStartLoadWithRequest: эквивалент в WKWebView?
  • После деинсталляции webView видео, встроенное в webView, все еще играет - iOS
  • Клавиша «done» нажала кнопку для UIWebView и WKWebView
  • Утечка памяти в WkWebView
  • Ошибка Ajax с HTTP-статусом 0 при использовании плагина Cordova WKWebView на iOS
  • Входной файл HTML в приложении iOS, отключить опцию «взять фотографию»
  • В Xamarin, как обрабатывать событие WKWebView ShouldStartLoad
  • Сбой: WebThread - EXC_BAD_ACCESS KERN_INVALID_ADDRESS
  • Как предотвратить закрытие WKWebView при запуске плагина Cordova
  • Давайте будем гением компьютера.