iOS - 在WKWebView中使用Cookies

3
我正在尝试在iOS WKWebView中使用cookies,代码如下:
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
}

}

域名、路径、名称和值都是正确的。但当我试图获取并在我的网站上打印它们时,没有设置任何cookie。网站打印cookie的功能正常,因为我为此制作了一个Android应用程序,并且它在那里运行良好。

我需要做什么才能接受或存储cookie吗?


你在应用程序中为一个域设置了WKWebView的cookies,并期望这些cookie在Safari中可用?这是你所面临的问题吗? - Sandeep Bhandari
不,我正在WKWebView中设置它们,并且我也尝试在已加载的网站中在同一WKWebView中打印它们。 - Matej Košút
请问您能否添加代码以展示如何从cookie存储中读取它们? - Sandeep Bhandari
网站执行读取和打印操作,而不是应用程序。如我所提到的,它在安卓上工作正常。我该如何在iOS应用程序中测试和打印(记录)设置的cookies? - Matej Košút
可能是[WKWebView设置Cookie不可行(iOS 11+)]的重复问题(https://dev59.com/6VUL5IYBdhLWcg3wB0FJ)。 - Gabe
2个回答

2
这是一个自包含的示例,用于设置可以从 Web 视图中加载的网站中读取的 cookie。关键点是域名必须与网站的域名匹配,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方法无法正常工作,只加载空白网站。 - Matej Košút

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。


谢谢您的回答。我尝试了这个方法,似乎已经设置了Cookies。我也可以使用您的cookiesDidChange方法记录它们。但是我的网站仍然无法读取它们。现在网站正在打印所有的Cookies。当我在Android或普通桌面浏览器上测试时,会打印出Cookies。但是在模拟器上测试时,什么都没有。这怎么可能呢? - Matej Košút
您可以通过Safari检查Cookie,打开Safari的开发者选项卡,选择您的模拟器并检查Cookie存储中是否存在Cookie。 - Muhammad Shauket
准确地说是通过Safari。但是那里什么也没有,是空的。 - Matej Košút
你可以查看我在这里有关设置cookie的答案,也许你的网站正在从document.cookie中读取cookie,请参考此答案https://dev59.com/Tl8d5IYBdhLWcg3wpzr4#52490200。 - Muhammad Shauket
但它们在其他地方都能正常工作。只是似乎只有在模拟器的应用程序和模拟器的Safari浏览器上没有设置。我需要以某种方式允许Cookies吗? 我正在我的应用程序中设置cookies,但无法在Safari的开发者控制台上看到它们。这与后端无关。它们只是没有正确设置。 - Matej Košút
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接