ios - 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 吗?
解决方案
这是一个设置 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)
}
}
推荐阅读
- c# - 在其他项目引用的类库中使用 serilog
- linux - BeagleBone AI OpenCL
- java - 无法删除谷歌地图上的标记(Java)
- nginx - 根据端口号从入口 nginx 控制器转发到不同的 nginx pod
- python - TypeError:('关键字参数不理解:','vocabulary_size')
- android-studio - 如何在我的 android studio 中更改项目的包名称?
- connection - Nestjs - Typeorm 自定义连接名称
- r - 如何在 shinydahsboardPlus 中更改用户图片?
- sql - 选择在多个地方有孩子的父母
- c - 将结构中的 void 指针转换为结构以访问成员