需求分析
- 后端需要传Cookie值
思路
- 使用HTTPCookieStorage缓存Cookie
- 在webView:decidePolicyForNavigationAction:decisionHandler:方法中带上Cookie
实现
设置Cookie
let cookie = HTTPCookie(properties: [ HTTPCookiePropertyKey.domain : "lanxinka.com", HTTPCookiePropertyKey.path : "/", HTTPCookiePropertyKey.name : "ga", HTTPCookiePropertyKey.value : "1" ]) HTTPCookieStorage.shared.setCookie(cookie!)
拦截Request,请求带上Cookie
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { // 打印请求地址 WXDLog(navigationAction.request.url?.absoluteString) WXDLog("\n-----------------------------------------") // 打印请求头 WXDLog(navigationAction.request.allHTTPHeaderFields) // 判断是否存在Cookie let headerKeys = navigationAction.request.allHTTPHeaderFields?.keys let hasCookies = headerKeys?.contains("Cookie") ?? false // 不包含cookies,并且本地有Cookie值,需设置Cookie if !hasCookies, (HTTPCookieStorage.shared.cookies?.count ?? 0) > 0 { // 设置cookie let cookies = HTTPCookie.requestHeaderFields(with: HTTPCookieStorage.shared.cookies ?? []) var headers = navigationAction.request.allHTTPHeaderFields ?? [:] headers.appendContentsOf(cookies) var request = navigationAction.request request.allHTTPHeaderFields = headers // 带Cookie请求 webView.load(request) // 取消默认的请求操作 decisionHandler(.cancel) return } decisionHandler(.allow) }