You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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来处理这些请求。

示例步骤:

  1. 实现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) {
        // 处理请求取消逻辑
    }
}
  1. 初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 03:41:05