关于 webView 的 cookie 设置
前言
最近的项目中,前端需要和我们交互,而且我们登录后的信息要传给前端,做 token 验证,所以就跟前端同学商议我们把相关的信息放到 cookie 里。当然网上有好多参考的文章,喜欢的同学,可以自己去搜索看看。
正文
什么是 Cookie
Cookie 是网站为了识别终端身份,保存在终端本地的用户凭证信息。Cookie 中的字段与意义由服务端进行定义。例如,当用户在某个网站进行了登录操作后,服务端会将Cookie 信息返回给终端,终端会将这些信息进行保存,在下一次再次访问这个网站时,终端会将保存的 Cookie 信息一并发送到服务端,服务端根据 Cookie 信息是否有效来判断此用户是否可以自动登录。来自这里
设置 Cookie
关于管理 Cookie 有两个类,具体请看上面链接里的文章。本文只介绍其中一种:
//MARK: 设置 cookie
func setCookie() {
// 以上所有字段都是必传字段, 签名另外处理
let keys = ["app-id", "app-version", "platform", "device-name", "os-version"]
let values = [AppKey.ServerAppID, AppVersion, AppKey.AppPlatform, UIDeviceHardware.platformString(), GlobalAction.deviceVersion]
for (i, str) in keys.enumerated() {
var cookies = [HTTPCookiePropertyKey : Any]()
cookies[HTTPCookiePropertyKey.name] = str
cookies[HTTPCookiePropertyKey.value] = values[i]
cookies[HTTPCookiePropertyKey.domain] = url.host ?? ""
cookies[HTTPCookiePropertyKey.path] = "/"
cookies[HTTPCookiePropertyKey.version] = "0"
cookies[HTTPCookiePropertyKey.expires] = Date(timeIntervalSinceNow: 2629743)
let cookie = HTTPCookie(properties: cookies)
HTTPCookieStorage.shared.setCookie(cookie!)
}
}
//MARK: 删除 cookie
func deleteCookie() {
let cookieStorage = HTTPCookieStorage.shared
let cookies = cookieStorage.cookies(for: url) ?? []
for cookie in cookies {
cookieStorage.deleteCookie(cookie)
}
}
注意:
1、keys 里存放的是你需要传给前端的所有的参数的 key
2、values 里存放的是对应的 key 的值
3、有几个 key 就需要创建几个 cookie 对象,然后用HTTPCookieStorage存储起来。(刚开始设置时,只创建了一个 cookie 对象,结果抓包看见 cookie 里只有最后一个 key-value)
4、domain 一定是要设置的,为了防止出错,直接用 webview 加载的 url 来获取域名:url.host;至于 Objecttive-C 如何操作,请自行搜索
5、path 和 version 如果没有特别需求,就按照上面的设置就行了。
// 使用如下:
func loadWebPage() {
setCookie()
let request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 60)
webView.loadRequest(request)
}
其实整体的使用还是很简单的,可能对于很少设置 Cookie 的人来说,就有可能踩上面所说的坑,所以就开篇文章,把一些问题记录下来,让自己以后有迹可循。
总结
对于 Cookie 的使用其实很简单,只要你愿意去搜索,去尝试。我相信,没有解决不了的问题,只有你愿不愿意尝试。好了,不啰嗦了,我要继续去搬砖了,不然今个的晚饭又没着落了。