Потеря файлов cookie в WKWebView

Когда я создаю новый запрос для WKWebView с файлом cookie аутентификации и отправляю запрос, WKWebView правильно загружает защищенную веб-страницу:

let req = NSMutableURLRequest(URL: NSURL(string: urlPath)!)
let headers = NSHTTPCookie.requestHeaderFieldsWithCookies([myAuthCookie]);
req.allHTTPHeaderFields = headers;
webView.loadRequest(req)

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

Мне известно об отсутствующей функциональности WKWebView, упомянутой здесь< /а>.

Заранее спасибо за любую идею.


person jiri.huml    schedule 20.11.2014    source источник
comment
Я боролся с этой самой проблемой в течение нескольких дней. Кажется сбивающим с толку, что хранение/использование файлов cookie будет настолько нарушено в WKWebView. Ждем любых решений по этому поводу.   -  person Chris    schedule 21.11.2014
comment
Возможный дубликат Могу ли я установить файлы cookie используется WKWebView?   -  person Prcela    schedule 08.02.2016


Ответы (3)


Лучше всего сохранить файл cookie в

[NSHTTPCookieStorage sharedHTTPCookieStorage]

Затем каждый раз, когда вы хотите загрузить запрос, вместо этого вызывайте эту функцию:

- (void)loadRequest:(NSURLRequest *)request {
        if (request.URL) {
            NSDictionary *cookies = [NSHTTPCookie requestHeaderFieldsWithCookies:[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL]];
            if ([cookies objectForKey:@"Cookie"]) {
                NSMutableURLRequest *mutableRequest = request.mutableCopy;
                [mutableRequest addValue:cookies[@"Cookie"] forHTTPHeaderField:@"Cookie"];
                request = mutableRequest;
            }
        }

        [_wkWebView loadRequest:request];
}

Он извлекает правильные файлы cookie из общих файлов cookie и включает их в ваш запрос.

person The Windwaker    schedule 09.12.2015
comment
WKWebViews loadRequest возвращает WKNavigation* вместо void: [developer.apple.com/reference /вебкит/вквебвиев/ - person gyimi; 24.10.2016
comment
Вы прокомментировали: Тогда каждый раз, когда вы хотите загрузить запрос, вместо этого вызывайте эту функцию: - (**void**)loadRequest:(NSURLRequest \*)request . LoadRequest WKWebView возвращает **WKNavigation* ** вместо ** void ** . То, что вы написали, отлично работает с UIWebViews, но в первом вопросе упоминается WKWebViews. - person gyimi; 28.10.2016
comment
На самом деле это работает (я использую его в обертке для UIWebview/WkWebview). Он загружает запрос, но мы просто не используем результат - person The Windwaker; 31.10.2016
comment
Мне нужна помощь здесь @TheWindwaker - person Siva; 15.09.2017
comment
? Я не вижу здесь твоей проблемы - person The Windwaker; 22.09.2017

Я предполагаю, что когда вы устанавливаете его в запросе, вы отправляете файл cookie на сервер, но НЕ устанавливаете его в WKWebview. Файлы cookie обычно устанавливаются сервером в заголовке «Set-Cookie», а затем должны сохраняться. Поэтому, если у вас нет проблем с передачей файлов cookie на сервер и обратно, вы можете сделать трюк:

  1. отправить куки в первом запросе
  2. заставить сервер отправить его обратно в заголовке "Set-Cookie"
  3. каждый последующий запрос должен иметь файл cookie

Я еще не пробовал этот подход, но буду очень удивлен, если он не сработает.

Альтернативой, упомянутой Себастьяном, может быть внедрение через javascript. Помните, однако, что вы не можете установить флаг «Только HTTP» таким образом, и файл cookie будет доступен для всех запущенных сценариев (https://www.owasp.org/index.php/HttpOnly).

Я все еще пытаюсь найти естественный способ установить cookie, но я не думаю, что он существует.

Надеюсь, поможет.

person Alex    schedule 02.03.2015
comment
Привет, Алекс, ты не знаешь, изменилось ли что-нибудь здесь? Обрабатываются ли файлы cookie лучше в WKWebView? - person J2N; 10.09.2015
comment
Привет, JLaw, посмотрите здесь разработчик .apple.com/library/prerelease/ios/releasenotes/General/ Я думаю, что они предоставили хороший способ обработки файлов cookie в iOS9, хотя я сам не пробовал. - person Alex; 10.09.2015
comment
Это здорово, как раз то, что мне нужно для моего пользовательского сервера Node.js. Не могу поверить, что я не подумал об этом. Я моделировал процесс использования файлов cookie в обратном порядке. Конечно, сервер должен отправить Set-Cookie, чтобы заставить WKWebView интегрировать его обратно в свое внутреннее (непрозрачное!?! Argh) хранилище файлов cookie. Когда WKWebView включает его в loadRequest, это произвольный заголовок sent. Веб-сервер по умолчанию не видит необходимости повторять «Set Cookie» — он справедливо предполагает, что браузер уже имеет его. - person BaseZen; 05.10.2016

Вы можете ввести некоторый javascript в представление «мы», чтобы загрузить файлы cookie, чтобы запросы, инициированные веб-представлением, также имели ваши файлы cookie. Смотрите ответ на этот вопрос для более подробной информации:

https://stackoverflow.com/a/26577303/251687

person Sebastien Martin    schedule 25.02.2015