Загуба на бисквитки в WKWebView

Когато създам нова заявка за WKWebView с бисквитка за удостоверяване и изпратя заявката, WKWebView правилно зарежда защитена уеб страница:

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

Проблемът е, че когато потребител щракне върху която и да е връзка в уеб страницата, с нова заявка WKWebView губи бисквитката за удостоверяване и се пренасочва към страницата за влизане. Домейнът и пътят на бисквитката са попълнени и правилни.

Наясно съм с липсващата функционалност на WKWebView, спомената тук.

Благодаря предварително за всяка идея.


person jiri.huml    schedule 20.11.2014    source източник
comment
От дни се боря точно с този проблем. Изглежда объркващо, че съхранението/използването на бисквитки ще бъде толкова повредено в WKWebView. Очакваме с нетърпение да чуем всякакви решения за това.   -  person Chris    schedule 21.11.2014
comment
Възможен дубликат на Мога ли да настроя бисквитките да бъдат използвани от WKWebView?   -  person Prcela    schedule 08.02.2016


Отговори (3)


Най-доброто нещо, което можете да направите, е да съхраните бисквитката си в

[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];
}

Той извлича правилните бисквитки от споделени бисквитки и ги включва във вашата заявка

person The Windwaker    schedule 09.12.2015
comment
loadRequest на WKWebViews връща WKNavigation* вместо void: [developer.apple.com/reference /webkit/wkwebview/ - 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

Предполагам, че когато го зададете в заявката, вие изпращате бисквитката до сървъра, но НЕ я задавате в WKWebview. Бисквитките обикновено се задават от сървъра в заглавката "Set-Cookie" и след това трябва да бъдат запазени. Така че, ако нямате проблем с предаването на бисквитките до сървъра и обратно, можете да направите един трик:

  1. изпрати бисквитката в първата заявка
  2. накарайте сървъра да го изпрати обратно в заглавката "Set-Cookie".
  3. всяка следваща заявка трябва да има бисквитката

Все още не съм пробвал подхода, но ще бъда много изненадан, ако не проработи.

Алтернативата, както спомена Себастиен, може да бъде да го инжектирате чрез javascript. Имайте предвид обаче, че не можете да зададете флаг „Само HTTP“ по този начин и бисквитката ще бъде достъпна от всички изпълнявани скриптове (https://www.owasp.org/index.php/HttpOnly).

Все още се опитвам да намеря естествен начин за настройка на бисквитката, но не мисля, че съществува.

Дано помогне.

person Alex    schedule 02.03.2015
comment
Здравей Алекс, знаеш ли дали нещо се е променило тук? По-добре ли се обработват бисквитките в WKWebView? - person J2N; 10.09.2015
comment
Здравей JLaw, погледни тук разработчик .apple.com/library/prerelease/ios/releasenotes/General/ Мисля, че са предоставили добрия начин за обработка на бисквитки в iOS9, въпреки че не съм го пробвал сам - person Alex; 10.09.2015
comment
Това е страхотно, точно това, което ми трябваше за моя персонализиран сървър Node.js. Не мога да повярвам, че не се сетих за това. Моделирах процеса на приемане на бисквитки в обратен ред. Разбира се, сървърът трябва да изпрати Set-Cookie, за да накара WKWebView да го интегрира обратно в своето вътрешно (непрозрачно!?! Argh) хранилище за бисквитки. Когато WKWebView го включва в loadRequest, това е произволно sent заглавие. Уеб сървърът по подразбиране не вижда необходимост да повтаря „Задаване на бисквитка“ - той правилно приема, че браузърът вече го има. - person BaseZen; 05.10.2016

Можете да инжектирате някакъв javascript в изгледа we, за да заредите бисквитките, така че заявките, инициирани от уеб изгледа, също да имат вашите бисквитки. Вижте отговора на този въпрос за повече подробности:

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

person Sebastien Martin    schedule 25.02.2015