Синхронизировать WKWebView Cookie с NSHTTPCookieStorage
WKWebView
может управлять своим собственным файлом cookie в WKHTTPCookieStorage
, независимо от NSHTTPCookieStorage
, Как я могу синхронизировать cookie с WKHTTPCookieStore
в NSHTTPCookieStorage
,
Моя цель - синхронизировать куки с WKHTTPCookieStore
а также NSHTTPCookieStorage
,
Я пытаюсь синхронизировать cookie с помощью метода наблюдателя. WKHTTPCookieStoreObserver
,
- (void)cookiesDidChangeInCookieStore:(WKHTTPCookieStore *)cookieStore {
[cookieStore getAllCookies:^(NSArray<NSHTTPCookie *> *array) {
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *nsHttpCookies = cookieStorage.cookies;
//add new Cookie from wkWebView
[array enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL *stop) {
if(![nsHttpCookies containsObject:cookie]){
[cookieStorage setCookie:cookie];
}
}];
//add old Cookie from wkWebView
[nsHttpCookies enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL *stop) {
if(![array containsObject:cookie]){
[cookieStorage deleteCookie:cookie];
}
}];
}];
}
Это правильный способ синхронизировать куки из WKWebView
в NSHTTPCookieStorage
?
1 ответ
Как ответил Бен в комментарии, вам нужно извлечь куки из заголовка ответа и установить их вручную в HTTPCookieStorage
,
Свифт 4:
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Swift.Void) {
guard
let response = navigationResponse.response as? HTTPURLResponse,
let url = navigationResponse.response.url
else {
decisionHandler(.cancel)
return
}
if let headerFields = response.allHeaderFields as? [String: String] {
let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: url)
cookies.forEach { (cookie) in
HTTPCookieStorage.shared.setCookie(cookie)
}
}
decisionHandler(.allow)
}
Objective-C:
NSHTTPURLResponse * resp = (NSHTTPURLResponse*)[navigationResponse response];
NSDictionary *diction = [resp allHeaderFields];
NSArray * cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:diction forURL:[resp URL]];
for (NSHTTPCookie *cookie in cookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
return decisionHandler(YES);