【问题标题】:iOS - Using cookies with WKWebViewiOS - 在 WKWebView 中使用 cookie
【发布时间】:2019-03-19 18:57:16
【问题描述】:

我正在尝试像这样在 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 吗?

【问题讨论】:

  • 您在应用程序中的 WKWebView 中为域设置 cookie 并希望 cookie 在 safari 中可用?这就是你面临的麻烦吗?
  • 没有。我在 WKWebView 中设置它们,我也试图在加载的网站的同一个 WKWebView 中打印它们。
  • 您能否添加代码以显示您如何从 cookie 存储中读取它们?
  • 网站正在执行读取和打印,而不是应用程序。正如我所提到的,它适用于 android。如何在 iOS 应用中测试和打印(记录)设置的 cookie?

标签: ios swift cookies wkwebview


【解决方案1】:

以这种方式设置 cookie,并通过 secure 标志“FALSE”和 path 与“/”

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

设置 cookie 并等待完成块加载您的页面。

self.configuration.websiteDataStore.httpCookieStore.setCookie(headerCookie, completionHandler: {
     print("cookie setup done")
     viewerWebKit.load(URLRequest(url: url))

})

想要查看 cookie 是否更新后,只需像这样添加 cookie 更改值观察器。

 WKWebsiteDataStore.default().httpCookieStore.add(self)


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

现在您可以在 cookiesDidChange 方法中查看您的 cookie。

【讨论】:

  • 感谢您的回答。我试过这个。 Cookie 似乎已设置。我还可以使用您的方法 cookiesDidChange 记录它们。但我的网站仍然无法阅读它们。网站现在正在打印所有 cookie。当我在 android 或普通桌面浏览器上进行测试时,会打印 cookie。但是在模拟器上测试时,什么都没有。这怎么可能?
  • 您可以通过 safari 检查 cookie,转到 safari 上的开发人员选项卡并选择您的模拟器并检查 cookie 是否应该在 cookie 存储中。
  • 完全通过 safari。那里什么都没有,是空的。
  • 然后请服务器开发者看看为什么cookie没有读取,虽然你正在设置..顺便说一下上面的方法只适用于iOS 11或更高版本
  • 你可以在这里查看我关于 cookie 设置的答案,可能是你的网站从 document.cookie 读取 cookie,请按照这个答案stackoverflow.com/questions/26573137/…
【解决方案2】:

这是一个设置 cookie 的独立示例,该示例应该能够从加载到 web 视图中的网站读取。关键点是域必须与网站的域相匹配,cookie 到期日期必须设置为未来日期,这仅适用于我将 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)
    }
}

【讨论】:

  • 感谢您的回答。方法 loadHTMLString 不起作用。正在加载空白网站。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
相关资源
最近更新 更多