如何在iOS WKWebView中检测资源请求?类Android shouldInterceptRequest
iOS WKWebView 检测网页资源请求的方法
当然有,iOS里可以通过以下几种方式实现类似Android shouldInterceptRequest 的功能,来检测甚至拦截网页发起的资源请求(包括Ajax的XMLHttpRequest):
1. 利用 WKNavigationDelegate 的决策方法
WKWebView的WKNavigationDelegate提供了webView(_:decidePolicyFor:decisionHandler:)方法,能拦截绝大多数网页请求,包括Ajax请求。你可以在这个方法里检查请求的URL、HTTP方法、请求头,甚至请求体(需额外处理),然后决定是允许、取消还是重定向请求。
示例代码:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { guard let request = navigationAction.request else { decisionHandler(.allow) return } // 结合导航类型或请求头判断是否为Ajax请求 if navigationAction.navigationType == .other || request.value(forHTTPHeaderField: "X-Requested-With") == "XMLHttpRequest" { print("检测到Ajax请求:\(request.url?.absoluteString ?? "")") } decisionHandler(.allow) }
2. 自定义 WKURLSchemeHandler
如果需要更精准地拦截特定类型的请求,可使用WKURLSchemeHandler。你可以让网页中的Ajax请求使用自定义URL Scheme(比如myapp://),再注册对应的Handler来处理这些请求。
示例步骤:
- 实现
WKURLSchemeHandler协议:
class CustomSchemeHandler: NSObject, WKURLSchemeHandler { func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) { guard let url = urlSchemeTask.request.url else { urlSchemeTask.didFailWithError(NSError(domain: "CustomSchemeError", code: -1, userInfo: nil)) return } print("检测到自定义协议请求:\(url)") // 模拟返回响应 let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: "HTTP/1.1", headerFields: nil)! urlSchemeTask.didReceive(response) urlSchemeTask.didReceive(Data()) urlSchemeTask.didFinish() } func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) { // 处理请求取消逻辑 } }
- 初始化WKWebView时注册Handler:
let configuration = WKWebViewConfiguration() let schemeHandler = CustomSchemeHandler() configuration.setURLSchemeHandler(schemeHandler, forURLScheme: "myapp") let webView = WKWebView(frame: .zero, configuration: configuration)
3. 关于 NSURLProtocol 的说明
早期开发者常用NSURLProtocol拦截网络请求,但WKWebView对它的支持有限:iOS 11之前无法拦截WKWebView的请求,iOS 11+也仅能拦截NSURLSession发起的请求,对网页内的Ajax请求不一定生效,因此更推荐前两种方案。
内容的提问来源于stack exchange,提问作者Daniele B
相关产品推荐
相关产品推荐

