WKWebView, получить все куки
Я хочу получить все куки из WKWebView. Зачем? Я был запущен проект, который использует веб-аутентификацию. В результате я должен перехватить куки, чтобы быть уверенным, что пользователь вошел в систему и для каких-то других целей. Другой случай - представьте, вошел ли пользователь в систему и чем он "убил" приложение - из-за некоторой задержки при сохранении этого сеанса cookie будет потеряно:(.
Кажется, проблема в том, что куки кэшируются, а не сохраняются в файл сразу.
(@Кеменаран отсюда - стр.5 ниже)
Точка, где я пытаюсь их поймать -
webView:decidePolicyForNavigationResponse:decisionHandler:
,
func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void) {
if let httpResponse = navigationResponse.response as? NSHTTPURLResponse {
if let headers = httpResponse.allHeaderFields as? [String: String], url = httpResponse.URL {
let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headers, forURL: url {
for cookie in cookies {
NSHTTPCookieStorage.shared.set(cookie)
}
}
}
}
но не все запросы являются навигацией, поэтому один файл cookie (в моем случае) пропущен, подробности см. ниже
Несколько слов о другом варианте, который я пробовал...
- Да, я знаю, что начиная с iOS 11, мы можем использовать
WKHTTPCookieStore
как упомянуто здесь. Но мой проект должен поддерживать iOS 9+
Я на 100% уверен, что через 5-10 секунд после входа в систему требуемый файл cookie будет сохранен на
NSHttpCookieStorage
(по крайней мере, все мои тесты в течение нескольких дней подтверждают это)Я пытаюсь использовать предоставленный наблюдатель
NSHTTPCookieManagerCookiesChangedNotification
, но он предоставляет мне обратный вызов только для файлов cookie, которые входят вwebView:decidePolicyForNavigationResponse:decisionHandler
Я также пытаюсь получить куки, используя некоторые JS, как упомянуто здесь, а также проверяю все предложения отсюда - кстати, отличная статья. Результат - отрицательный
Я также обнаружил эту ошибку радара и этот вопрос, а также пример проекта, но я хочу предотвратить даже этот случай. (описанное в этом посте применимо не только для удаления, но и для сохранения). Кроме того, эта ситуация верна и когда пользователь закрывает приложение, поэтому может иметь место случай, когда пользователь входит в систему, уничтожает приложение и перезапускает. И предотвращая это (просто проверяя
NSHttpCookieStorage
для обязательных файлов cookie также не очень хорошая идея, поскольку именно после входа в систему требуемый файл cookie может быть сохранен с некоторой задержкой, поэтому такой подход требует некоторыхbool-powered
решение, которое выглядит странно..Я также прочитал несколько SO постов для некоторых связанных проблем, и наиболее полезными являются
Но все еще без хорошего решения...
Итак, существует ли какой-либо способ получить или, по крайней мере, заставить немедленно сохранить куки?
1 ответ
Я закончил простым "форсированным" сохранением Cookie с веб-страницы.
Чтобы получить все файлы cookie, которые я использую
stringByEvaluatingJavaScriptFromString
со строкой JS как document.cookie();
, В результате я смог получить все куки в виде строки с ;
разделитель. Все, что мне нужно сделать - разобрать строку, создать cookie и установить его NSHttpSharedStorage