首页 > 解决方案 > iOS - 在 WKWebView 中使用 cookie

问题描述

我正在尝试在 iOS WKWebView 中使用 cookie,如下所示:

import UIKit
import WebKit

class ViewWrapper: UIViewController, WKNavigationDelegate{

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

override func viewDidLoad() {
    super.viewDidLoad()

    let url = URL(string: "url")!

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

    var request = URLRequest(url: url)
    request.httpShouldHandleCookies = true
    viewerWebKit.configuration.websiteDataStore.httpCookieStore.setCookie(newcookie!, completionHandler: {
        print("cookie setup done")
        self.viewerWebKit.load(request)
    })

    let refresh = UIBarButtonItem(barButtonSystemItem: .refresh, target: webView, action: #selector(viewerWebKit.reload))
    toolbarItems = [refresh]
    navigationController?.isToolbarHidden = false
}

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
}

}

域、路径、名称和值 100% 正确。但是当我试图获取它们并在我的网站上打印时,没有设置任何 cookie。cookie 的网站打印效果很好,因为我为此做了一个 android 应用程序,它在那里运行良好。

我需要做更多的事情来接受或存储 cookie 吗?

标签: iosswiftcookieswkwebview

解决方案


这是一个设置 cookie 的自包含示例,该 cookie 应该能够从 Web 视图中加载的网站读取。关键点是域必须与网站的域匹配,cookie 到期必须设置为 future date,这仅适用于我将secure标志设置为false,不知道为什么。

使用下面的示例,我能够在浏览器的检查窗口中看到 cookie。

import UIKit
import WebKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let wv = WKWebView();
        view = wv;
        let cookie = HTTPCookie(properties: [
            .domain: ".example.com",
            .path: "",
            .name: "name",
            .value: "hello world",
            .expires: Date(timeIntervalSince1970: 1639655995)
        ])!
        wv.loadHTMLString("", baseURL: URL(string: "http://www.example.com")!);
        wv.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)
    }
}

推荐阅读