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 (в моем случае) пропущен, подробности см. ниже

Несколько слов о другом варианте, который я пробовал...

  1. Да, я знаю, что начиная с iOS 11, мы можем использовать WKHTTPCookieStore как упомянуто здесь. Но мой проект должен поддерживать iOS 9+

  1. Я на 100% уверен, что через 5-10 секунд после входа в систему требуемый файл cookie будет сохранен на NSHttpCookieStorage (по крайней мере, все мои тесты в течение нескольких дней подтверждают это)

  2. Я пытаюсь использовать предоставленный наблюдатель NSHTTPCookieManagerCookiesChangedNotification, но он предоставляет мне обратный вызов только для файлов cookie, которые входят в webView:decidePolicyForNavigationResponse:decisionHandler

  3. Я также пытаюсь получить куки, используя некоторые JS, как упомянуто здесь, а также проверяю все предложения отсюда - кстати, отличная статья. Результат - отрицательный

  4. Я также обнаружил эту ошибку радара и этот вопрос, а также пример проекта, но я хочу предотвратить даже этот случай. (описанное в этом посте применимо не только для удаления, но и для сохранения). Кроме того, эта ситуация верна и когда пользователь закрывает приложение, поэтому может иметь место случай, когда пользователь входит в систему, уничтожает приложение и перезапускает. И предотвращая это (просто проверяя NSHttpCookieStorage для обязательных файлов cookie также не очень хорошая идея, поскольку именно после входа в систему требуемый файл cookie может быть сохранен с некоторой задержкой, поэтому такой подход требует некоторых bool-powered решение, которое выглядит странно..

  5. Я также прочитал несколько SO постов для некоторых связанных проблем, и наиболее полезными являются

Но все еще без хорошего решения...

Итак, существует ли какой-либо способ получить или, по крайней мере, заставить немедленно сохранить куки?

1 ответ

Решение

Я закончил простым "форсированным" сохранением Cookie с веб-страницы.

Чтобы получить все файлы cookie, которые я использую

stringByEvaluatingJavaScriptFromString

со строкой JS как document.cookie();, В результате я смог получить все куки в виде строки с ; разделитель. Все, что мне нужно сделать - разобрать строку, создать cookie и установить его NSHttpSharedStorage

Другие вопросы по тегам