在使用 WKWebView 进行网络请求时,可以通过实现 WKNavigationDelegatedidStartProvisionalNavigation 方法来拦截网络请求。

首先,创建一个遵循 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)
    }
}

然后,实现 WKNavigationDelegatedidStartProvisionalNavigation 方法,该方法会在每次请求开始时被调用。在该方法中,可以获取到请求的 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 进行全局的网络请求拦截

wkwebview 网络请求拦截

原文地址: https://www.cveoy.top/t/topic/iTmm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录