Reputation: 645
I am using WKWebView
in app & i am looking for getting all headers from wkwebview in finish loads method webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
Just like in UIWebView
func webViewDidFinishLoad(_ webView: UIWebView) {
print("Finished loads---", webView.request?.allHTTPHeaderFields)
}
How can we achieve that in WKWebView
?
Upvotes: 2
Views: 1686
Reputation: 6707
Use WKWebView
's webView(_:decidePolicyFor:decisionHandler:)
.
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
// MARK: - IBOutlet
@IBOutlet weak var webView: WKWebView!
// MARK: - Life cycle
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let urlStr = "https://www.google.com/"
if let url = URL(string: urlStr) {
let request = URLRequest(url: url)
webView.load(request)
//webView.allowsBackForwardNavigationGestures = false
//webView.navigationDelegate = self
}
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let request = navigationAction.request
if let host = navigationAction.request.url?.host {
if host == "www.google.com" {
if let headers = request.allHTTPHeaderFields {
print("Google Headers: \(headers)")
} else {
print("Nope, sir")
}
}
else if host == "www.apple.com" {
if let headers = request.allHTTPHeaderFields {
print("Apple Headers: \(headers)")
} else {
print("Nope, sir")
}
}
}
decisionHandler(.allow)
}
}
And I get the following.
["User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko)", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8"] Headers: ["Accept-Language": "en-us", "Upgrade-Insecure-Requests": "1", "Accept-Encoding": "gzip, deflate, br", "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko)", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8"]
Upvotes: 1
Reputation: 236360
You need to set your view controller as the WKWebView Navigation Delegate WKNavigationDelegate
and implement its decidePolicyFor
method:
optional func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
Try like this:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let allHTTPHeaderFields = navigationAction.request.allHTTPHeaderFields ?? [:]
for (key, value) in allHTTPHeaderFields {
print("key:", key, "value:", value)
}
if navigationAction.navigationType == .linkActivated {
if let url = navigationAction.request.url,
let host = url.host, !host.hasPrefix("www.google.com"),
UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url)
print(url)
print("Redirected to browser. No need to open it locally")
decisionHandler(.cancel)
} else {
print("Open it locally")
decisionHandler(.allow)
}
} else {
print("not a user click")
decisionHandler(.allow)
}
}
Upvotes: 3