【发布时间】:2018-01-17 06:40:06
【问题描述】:
我需要在 UIWebView 中使用 Angular 打开 URL,并且我需要在每个 UIWebView 请求中发送 cookie。
我想做什么:
我尝试检查请求是否包含 cookie。如果它确实 UIWebView 执行请求,如果不是我创建相同的请求但使用 cookie 并执行它。为了替换请求,我使用了UIWebViewDelegate 的方法func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool。但它不像我预期的那样工作,一些请求在没有 cookie 的情况下执行。
我的代码:
final class FieldServiceViewController: UIViewController {
private var webView = UIWebView()
private var sessionID = String()
override func viewDidLoad() {
super.viewDidLoad()
_ = JSONAPI.getSessionID().subscribe(onNext: { [weak self] sessionID in
self?.sessionID = sessionID
self?.configureUI()
let string = "https://someURL"
let url = URL(string: string)
let request = URLRequest(url: url!)
self?.webView.loadRequest(request)
})
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
webView.frame = view.bounds
}
private func configureUI() {
webView.delegate = self
view.addSubview(webView)
}
private func cookedRequest(from: URLRequest) -> URLRequest? {
let cookiesKey = "Cookie"
let headers = from.allHTTPHeaderFields ?? [:]
if (headers.contains { $0.0 == cookiesKey }) {
return nil
}
var request = from
request.cachePolicy = .reloadIgnoringLocalAndRemoteCacheData
let cookiesToAdd = "SESSIONID=\(sessionID)"
request.addValue(cookiesToAdd, forHTTPHeaderField: cookiesKey)
return request
}
}
extension FieldServiceViewController: UIWebViewDelegate {
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if let cooked = cookedRequest(from: request) {
webView.loadRequest(cooked)
return false
}
return true
}
}
如何在每个 UIWebView 请求中添加 cookie?
附:我还在HTTPCookieStorage中保存了cookie,但看起来UIWebView的请求和共享存储之间根本没有联系。
【问题讨论】:
标签: ios swift cookies uiwebview