swift - WKNavigationResponse 不再通过其 response.header 提供对 cookie 的访问

标签 swift cookies webkit wkwebview ios12

自从推出以来,我一直使用 WKWebView 而不是 UIWebView。我一直在使用委托(delegate)方法 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(包括 beta 1-12&GM)中,如果响应 header 中包含 cookie,则始终会填充上述代码中的“cookie”。截至本周,随着 iOS 12 的发布,iOS 12 上的 cookie 始终为空。我在许多设备上对此进行了测试,但对于运行任何版本的 iOS 12 的任何设备,cookie 均无法访问。所有先前的设备固件版本仍然按预期工作。

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

最佳答案

我能够通过利用新的 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
    }
}

关于swift - WKNavigationResponse 不再通过其 response.header 提供对 cookie 的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52396052/

相关文章:

javascript - 无法正确从 html(js) 检索 cookie 值到 php 文件

cookies - WKWebView 中丢失 cookie

java - Java servlet 不会解析带有 "[]"符号的 Cookie

css - Safari 错误与转换和 translateY : "jumping" element

animation - Safari 在不相关的动画运行时更改字体粗细

ios - 如何在spritekit中录制游戏场景

swift - 在 Swift 中创建一个转到另一个类的按钮

ios - Apple 表盘 : change from an app running on watch

swift - 如何在 Swift 4 中压缩文件时显示进度 HUD?

css - WebKit CSS : Use for -webkit-border-image a picture from an image array