Место хранения файлов cookie WKWebView

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

Есть ли что-то, что мне нужно активировать, чтобы WKWebView правильно использовал файлы cookie?

Ответ 1

В настоящее время WKWebView и UIWebView не взаимодействуют должным образом вместе из-за того, что не используют одно и то же пространство для хранения файлов cookie. Это подробно обсуждается в следующем ответе. Как получить файл с помощью WKWebView?

Давайте надеемся, что Apple исправит это в обновляющемся обновлении.

Ответ 2

Совместное использование файлов cookie, полученных в собственном коде (с использованием NSURLConnection/NSURlsession), в UIWebview было выполнено путем сохранения файлов cookie в NSHTTPCookieStorage, а UIwebview использовали эти куки для всех сетевых запросов. Однако метод WKwebview не работает.

Однако мы можем передавать файлы cookie из собственного кода в WKWebview следующим образом:

При загрузке NSURLRequest мы можем загружать файлы cookie как заголовок в URLRequest, а затем загружать запрос с помощью WKwebview.

и если вы хотите, чтобы все последующие вызовы AJAX из WKWebview также использовали этот файл cookie, вы можете захотеть вставить эти файлы cookie в WKWebview при загрузке URLRequest. Это подробно объясняется в следующем ответе. Могу ли я установить файлы cookie, которые будут использоваться WKWebView?

Ответ 3

Вы можете прочитать все файлы cookie из NSHTTPCookieStorage и установить эти файлы cookie для WKWebview с помощью WKHTTPCookieStore (представленного в iOS 11). подробнее о WKWebview: https://developer.apple.com/videos/play/wwdc2017/220/

Если вы хотите поддерживать более ранние версии, обратитесь к этому ответу. Могу ли я установить файлы cookie, которые будут использоваться WKWebView?

 // get the cookie store (WKHTTPCookieStore) from the webview
let cookieStore =webview.configuration.websiteDataStore.httpCookieStore
//create a cookie
let cookie = HTTPCookie(properties: [ HTTPCookiePropertyKey.domain: "canineschool.org", HTTPCookiePropertyKey.path: "/",HTTPCookiePropertyKey.secure: true,HTTPCookiePropertyKey.name: "ssoToken", HTTPCookiePropertyKey.value: "******"])

// set the cookie to cookieStore
cookieStore.setCookie(cookie!){ 
     //load the request. 
}

Важно: setCookie - это асинхронный запрос. Обработчик завершения будет вызывается, как только cookie установлен. https://developer.apple.com/documentation/webkit/wkhttpcookiestore/2882007-setcookie

Ответ 4

let webConfiguration = WKWebViewConfiguration()
webConfiguration.processPool = webProcessPool!

Инициировать каждый WKWebView с помощью WKWebViewConfiguration, может быть неожиданным для вас!

let webview = WKWebView(frame:rect, configuration:webConfiguration)