[英]How to add enable cookies to WKWebView
我需要在 WKWebView 中加载 html 内容和 url。 我正在尝试使用loadHTMLString
加载它,页面正在加载但出现错误,例如需要启用third-party
cookies
到WKWebView
。 是否可以在 WKWebView 中允许Third-Party
WKWebView
?
let url =
"https://www.ck12.org/lms-integration-service/prod/gcaddon.html?launch_key=21C8B2B198A2ABAEE5C97228EBD90836F6BFB34BD1E4302F6762FF7D12F8D904CDA084B4737EF781A18FC25E4F17EA34&app=ltiApp&extra=eyJyZWRpcmVjdCI6Imh0dHBzOi8vZmxleGJvb2tzLmNrMTIub3JnL2Nib29rL2NrLTEyLW1pZGRsZS1zY2hvb2wtZWFydGgtc2NpZW5jZS1mbGV4Ym9vay0yLjAvc2VjdGlvbi8xLjEvcHJpbWFyeS9sZXNzb24vc2NpZW50aWZpYy1leHBsYW5hdGlvbnMtYW5kLWludGVycHJldGF0aW9ucy1tcy1lcy8ifQ=="
class WebViewController: UIViewController, WKNavigationDelegate {
private var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
configureWebView()
}
private func configureWebView() {
let config = WKWebViewConfiguration()
config.processPool = WKProcessPool()
webView = WKWebView(frame: .zero, configuration: config)
webView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(self.webView)
// We pin the web view to the safe area because some pages break otherwise.
NSLayoutConstraint.activate([
view.safeAreaLayoutGuide.leftAnchor.constraint(equalTo: webView.leftAnchor),
view.safeAreaLayoutGuide.rightAnchor.constraint(equalTo: webView.rightAnchor),
view.safeAreaLayoutGuide.topAnchor.constraint(equalTo: webView.topAnchor),
view.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: webView.bottomAnchor)
])
webView.navigationDelegate = self
self.loadRequest()
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
}
private func loadRequest() {
DispatchQueue.main.async {
let url = URL(string: url)!
var request = URLRequest(url: url)
request.httpShouldHandleCookies = true
self.webView.load(request)
}
}
// Errors
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
showAlert(for: error)
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
showAlert(for: error)
}
private func showAlert(for error: Error) {
let alert = UIAlertController(title: "Error", message: "\(error)", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alert, animated: true, completion: nil)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.allow)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
guard let response = navigationResponse.response as? HTTPURLResponse,
let url = navigationResponse.response.url else {
decisionHandler(.cancel)
return
}
if let headerFields = response.allHeaderFields as? [String: String] {
let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: url)
print( "cookies", cookies)
cookies.forEach { cookie in
webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)
}
}
decisionHandler(.allow)
}
}
在上面的代码中, htmlString
和url
将从后端获取。 从 url 获取以下页面。
WKWebView 提供了WKNavigationDelegate
提供的不同回调。 可以使用的是func webView(WKWebView, decidePolicyFor: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void).
每次返回响应时,都可以从 header 字段中获取 cookies 并将它们保存到 cookie 存储中。 解决方案如下:
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
guard let response = navigationResponse.response as? HTTPURLResponse,
let url = navigationResponse.response.url else {
decisionHandler(.cancel)
return
}
if let headerFields = response.allHeaderFields as? [String: String] {
let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: url)
cookies.forEach { cookie in
webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)
}
}
decisionHandler(.allow)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.