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
всегда ""
).