【问题标题】:WKNavigationResponse is no longer providing access to cookies through its response.headerWKNavigationResponse 不再通过其 response.header 提供对 cookie 的访问
【发布时间】:2019-02-23 01:11:13
【问题描述】:

自从它推出以来,我一直在使用 WKWebView 而不是 UIWebView。我一直在使用委托方法 webView(decidePolicyFor navigationResponse) 函数来访问 navigationResponse 对象及其响应属性的 allHeaderFields 属性,以便从任何给定请求中读取 cookie。

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(inc. beta 1-12&GM)中,如果响应的标头中有 cookie,则始终填充上述代码中的“cookie”。截至本周,随着 iOS 12 的发布,iOS 12 上的 cookie 始终为空。我在许多设备上对此进行了测试,但对于运行任何版本的 iOS 12 的任何设备,cookie 都无法访问。所有以前的设备固件版本仍可按预期工作。

我有一台设备自发布以来一直使用 12 Beta 1 固件。直到本周,此代码在此设备上仍然有效。为什么在没有固件更新的情况下,iOS 12 上的 cookie 会突然停止访问?

【问题讨论】:

    标签: swift cookies webkit wkwebview ios12


    【解决方案1】:

    我能够通过利用新的 WKWebViewConfiguration 的 WebSiteDataStore 在 iOS 11+ 上获取 cookie 来解决此问题

    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
        }
    }
    

    【讨论】:

    • 有效!但是,,,,,,, 有时 getAllCookies 方法没有响应..................................................
    • 它似乎使用对 WkWebView 的强引用而不是使用函数变量
    • ....谢谢..,...但是,对不起,...我无法理解您的建议...您能用示例代码告诉我吗? ?
    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2019-02-12
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多