簡體   English   中英

iOS - 在 WKWebView 中使用 cookie

[英]iOS - Using cookies with WKWebView

我正在嘗試在 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?

這是一個設置 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)
    }
}

以這種方式設置 cookie,並傳遞安全標志“FALSE”和帶有“/”的路徑

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM