Место хранения файлов 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)