iOS - 未设置 WebView cookie

标签 ios swift cookies uiwebview wkwebview

我正在尝试像这样在我的 iOS 中设置 cookie:

    let url = URL(string: "url")!
    let jar = HTTPCookieStorage.shared
    let cookieHeaderField = ["Set-Cookie": "key1=value1, key2=value2"]
    let cookies = HTTPCookie.cookies(withResponseHeaderFields: cookieHeaderField, for: url)
    jar.setCookies(cookies, for: url, mainDocumentURL: url)

    let request = URLRequest(url: url)

    viewerWebKit.load(request)

然后我像这样打印它们:

    viewerWebKit.configuration.websiteDataStore.httpCookieStore.getAllCookies( { (cookies) in
        cookies.forEach({ (cookie) in
            print(cookie.name)
        })
    })

所有的 cookies 都被打印出来了,它们似乎被正常设置了。但是当我使用我的 safari 浏览器的 Web 检查器查看时,如果它们真的已设置,则什么也没有。没有设置 cookie。问题是什么?我需要接受它们吗? safari 是否阻止了它们?我怎样才能正常设置它们,以便在网络检查器中可见?

我也试过这种方法:

import UIKit
import WebKit

class ViewWrapper: UIViewController, WKNavigationDelegate {

var loginToken: String?
@IBOutlet weak var viewerWebKit: WKWebView!

override func viewDidLoad() {
    super.viewDidLoad()

    var urlRequest = URLRequest(url: URL(string: "url")!)
    urlRequest.httpShouldHandleCookies = true

    let newcookie = HTTPCookie(properties: [
        .domain: "domain",
        .path: "",
        .name: "key",
        .value: "value",
        .secure: "FALSE",
        .expires: NSDate(timeIntervalSinceNow: 31556926)
        ])

    viewerWebKit.configuration.websiteDataStore.httpCookieStore.setCookie(newcookie!, completionHandler: {
        self.viewerWebKit.load(urlRequest)
    })

    viewerWebKit.configuration.websiteDataStore.httpCookieStore.getAllCookies( { (cookies) in
        cookies.forEach({ (cookie) in
            print(cookie.name)
        })
    })

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func loadView() {
    viewerWebKit = WKWebView()
    viewerWebKit.navigationDelegate = self
    view = viewerWebKit
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    title = webView.title
}

func cookiesDidChange(in cookieStore: WKHTTPCookieStore) {
    cookieStore.getAllCookies({ (cookies) in
        cookies.forEach({ (cookie) in
            print(cookie.name)
        })
    })
}

}

但是还是不行。

这是我在 safari 调试控制台中看到的: debug console

未设置 Cookie。

这是我在 Xcode 的控制台中看到的。

xcode console

所以这里好像设置好了。但事实并非如此。打印代码打印 cookie。但它们在 safari 控制台中并不都是可见的。这怎么可能? Cookie csrftoken 和 sessionid 是由网站设置的,而不是由我的应用程序设置的。它们在打印和调试控制台中都可见。

最佳答案

通过这个设置cookie

urlRequest.httpShouldHandleCookies = true

同样在请求创建集之后

self.configuration.websiteDataStore.httpCookieStore.setCookie("your_http_cookie", completionHandler: {
    // Do whatever you want. I suggest loading your webview after cookie is set.
})

在你的类中实现这个观察者WKHTTPCookieStoreObserver

WKWebsiteDataStore.default().httpCookieStore.add(self)
func cookiesDidChange(in cookieStore: WKHTTPCookieStore) {
    // Must implement otherwise wkwebview cookie not sync properly
    self.httpCookieStore.getAllCookies { (cookies) in
        cookies.forEach({ (cookie) in
           // print your cookie here
        })
    }
}

关于iOS - 未设置 WebView cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52929382/

相关文章:

jquery - 有没有办法在 jquery 中为 cookie 添加相同的站点值?

android - Xamarin Forms 如何更改我在底部导航区域中使用的 png 图标的颜色?

ios - 如何动画进度 View ?

swift - 核心数据 : How to Create a Persistent Document with Singleton Entity?

swift - 我可以使用 if 来比较包含参数的枚举吗?

ios - 导航 Controller 后退按钮标题显示上一个标题

javascript - cookie问题,关闭浏览器后cookie丢失

ios - Quickblox 用户在线状态 IOS

ios - Parse 只检索 100 个项目,我有 108 个

java - 如何将 Apache cookie 转换回字符串?