I need to open URL with Angular in UIWebView
and I need to send cookie with each UIWebView
request.
What I tried to do:
I tried to check if request contains cookie. If it does UIWebView
performs request, if not I create the same request but with cookie and perform it. To substitute requests I used UIWebViewDelegate
's method func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool
. But it works not as I expected, some requests performs without cookies.
My code:
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
}
}
How to add cookie to each UIWebView request?
P.S. I also saved cookie in HTTPCookieStorage
, but looks like there is no connection between UIWebView
's requests and shared storage at all.