WKWebView не обновляет document.cookie при настройке файлов cookie в WKHTTPCookieStore - PullRequest
3 голосов
/ 19 июня 2019

Context

У меня есть приложение iOS Cordova, использующее WKWebView. Мне нужно перехватить WKWebView запросов, что невозможно по схеме http|https (это было возможно при использовании UIWebView, но мне нужно перейти на WKWebView). Поэтому я установил в Кордове config.xml

<content src="xyz://host.domain.com/app" />
<allow-navigation href="xyz://*/*" />

и я настроил WKWebView для обработки (перехвата) xyz:// схема:

[configuration setURLSchemeHandler:self forURLScheme:@"xyz"];

После подключения инспектора Safari к моему iPhone document.origin выводит xyz://host.domain.com.

Предположим, что от GET до https://host.domain.com/app/foo отвечают следующие заголовки:

Set-Cookie: a=1; Domain=host.domain.com; Path=/
Set-Cookie: b=2; Domain=host.domain.com; Path=/; Secure
Set-Cookie: c=3; Domain=host.domain.com; Path=/; Secure; HttpOnly

Используя NSURLSessionDataTask для создания GET до https://host.domain.com/app/foo, я строю NSHTTPCookie объекты из Set-Cookie заголовков ответа выше и сохраняю их в WKHTTPCookieStore моего WKWebView, используя

[wkWebView.configuration.websiteDataStore.httpCookieStore setCookie:cookie completionHandler:^{
    NSLog(@"SET COOKIE\n%@", cookie);
}];

согласно этому ответу . Файлы cookie установлены правильно и могут быть получены с помощью

[wkWebView.configuration.websiteDataStore.httpCookieStore getAllCookies:^(NSArray* cookies) {
    //Print cookies
}];

Интересный бит:

После настройки файлов cookie я прикрепляю инспектор Safari к своему iPhone и:

  • Cookie a=1 показывает в хранилище инспектора Safari
  • Cookie b=2 и c=3 не отображаются в хранилище инспектора Safari
  • document.cookie всегда возвращает "" (JS не имеет доступа к файлам cookie)

Вопрос № 1: Почему в разделе «Хранилище» инспектора Safari отображается только файл cookie a=1?

Я ожидал увидеть всех файлов cookie. Похоже, он связан с флагом Secure, но может быть ошибкой (или функцией) в инспекторе Safari, поскольку при проверке случайного сайта в Google Chrome отображаются все файлы cookie, независимо от флага Secure.

Вопрос № 2: Почему document.cookie всегда возвращает ""?

Даже при выполнении document.cookie="foo=bar; expires=Tue, 14 Oct 2024 20:23:32 GMT; domain=host.domain.com; path=/" непосредственно в инспекторе, document.cookie по-прежнему возвращает "", как будто это только для чтения по некоторым причинам.

Все работало нормально, используя UIWebView, NSHTTPCookieStorage и стандартную https схему. Я в полной растерянности в этом отношении. Единственные похожие вопросы, которые я мог найти, это это и это но не повезло.

Я что-то упускаю здесь действительно очевидное?


TL; DR Приложение iOS Cordova, использующее WKWebView и пользовательскую схему URL, не предоставляет файлы cookie, установленные в собственном коде для JavaScript (document.cookie всегда "").

...