WKNavigationResponse больше не предоставляет доступ к файлам cookie через свой response.header - PullRequest
0 голосов
/ 19 сентября 2018

С момента своего появления я использовал WKWebView вместо UIWebView.Я использовал функцию webView метода делегата (managePolicyFor navigationResponse) для доступа к объекту navigationResponse и свойству allHeaderFields свойства его ответа, чтобы считывать куки-файлы из любого данного запроса.

public func webView(webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
    guard let response = navigationResponse.response as? HTTPURLResponse,
        let url = response.url,
        response.statusCode == 200,
        let headers = response.allHeaderFields as? [String: String] else {
            decisionHandler(.cancel)
            return
        }
        let cookies: NSArray = HTTPCookie.cookies(withResponseHeaderFields: headers, for: url) as NSArray

        for cookie in cookies {

            let aCookie = cookie as! HTTPCookie

            print("Background oAuth wkwebview response cookie: \(aCookie.name)")

            HTTPCookieStorage.shared.setCookie(aCookie)
        }

    decisionHandler(.allow)
}

В iOS 9-12 (вкл. Бета 1-12 и GM) вплоть до прошлой недели, «куки» в приведенном выше коде всегда заполнялись, если в ответе были куки в заголовках.На этой неделе, с выпуском iOS 12, куки всегда пустые на iOS 12. У меня есть несколько устройств, на которых я тестировал это, но для любого устройства, использующего любую версию iOS 12, куки недоступны.Все предыдущие версии прошивки устройства все еще работают как положено.

У меня есть одно устройство, которое было на 12 Beta 1 прошивки с момента его выпуска.Этот код работал на этом устройстве до этой недели.Почему файлы cookie внезапно перестают быть доступными на iOS 12 без обновления прошивки?

1 Ответ

0 голосов
/ 19 сентября 2018

Мне удалось решить эту проблему, воспользовавшись новым хранилищем WebSiteDataStore WKWebViewConfiguration для получения файлов cookie на iOS 11 +

public func webView(webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
    guard let response = navigationResponse.response as? HTTPURLResponse,
        let url = response.url,
        response.statusCode == 200,
        let headers = response.allHeaderFields as? [String: String] else {
            decisionHandler(.cancel)
            return
    }
    let cookies: NSArray = HTTPCookie.cookies(withResponseHeaderFields: headers, for: url) as NSArray
    if #available(iOS 11.0, *) {
        webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
            for aCookie in cookies {

                print("Background oAuth wkwebview response cookie: \(aCookie.name)")

                HTTPCookieStorage.shared.setCookie(aCookie)
            }

            decisionHandler(.allow)

        }
    } else {
        // Fallback on earlier versions
    }
}
...