wkwebview 网络请求拦截
在使用 WKWebView 进行网络请求时,可以通过实现 WKNavigationDelegate 的 didStartProvisionalNavigation 方法来拦截网络请求。
首先,创建一个遵循 WKNavigationDelegate 的类,并在 viewDidLoad 方法中设置 WKWebView 的 navigationDelegate 属性为该类的实例。
class ViewController: UIViewController {
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
webView = WKWebView(frame: view.bounds, configuration: config)
webView.navigationDelegate = self
view.addSubview(webView)
}
}
然后,实现 WKNavigationDelegate 的 didStartProvisionalNavigation 方法,该方法会在每次请求开始时被调用。在该方法中,可以获取到请求的 URL,并进行相应的处理,如添加自定义的请求头、替换请求的 URL 等。
extension ViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
guard let url = webView.url else { return }
// 拦截请求并进行处理
if url.absoluteString == "https://www.example.com" {
// 添加自定义的请求头
let request = NSMutableURLRequest(url: url)
request.addValue("Bearer 1234567890", forHTTPHeaderField: "Authorization")
// 替换请求的 URL
let newURL = URL(string: "https://www.example.com/intercepted")!
let newRequest = URLRequest(url: newURL)
webView.load(newRequest)
}
}
}
在上面的示例中,如果请求的 URL 是 "https://www.example.com",则会添加一个自定义的请求头 "Authorization",并将请求的 URL 替换为 "https://www.example.com/intercepted",然后重新加载新的请求。
需要注意的是,该方法只能拦截 WKWebView 内部的网络请求,无法拦截由 WKWebView 打开的外部链接或其他应用程序的网络请求。如果需要对外部链接或其他应用程序的网络请求进行拦截,可以考虑使用 NSURLProtocol 进行全局的网络请求拦截
原文地址: https://www.cveoy.top/t/topic/iTmm 著作权归作者所有。请勿转载和采集!