swift 将请求标头添加到WKWebView中的所有传出请求

vhmi4jdf  于 2023-09-30  发布在  Swift
关注(0)|答案(2)|浏览(123)

TL;DR:我有一个iOS(Swift)项目,使用了WKWebView。我想添加一个请求头到所有传出的请求(html,图像,脚本,样式表等)在此WKWebView。我不知道怎么做。
背景:

我有一个Swift iOS应用程序,它使用WKWebView来渲染它的HTML视图。这些视图托管在我们的服务器上,服务器分为生产环境和暂存环境。我已经使用Akamai设置了暂存环境,以便所有传入的请求都必须沿着一个请求标头,以便请求被接受。

问题:

目前,我已经创建了一个WKWebView的子类,它覆盖了loadRequest方法,看起来像这样:

override func loadRequest(request: NSURLRequest) -> WKNavigation? {
    guard let mutableRequest = request.mutableCopy() as? NSMutableURLRequest else {
        return super.loadRequest(request)
    }

    if let url = request.URL, host = url.host {
        if (host == "staging.example.com") {
            mutableRequest.setValue("secret-value", forHTTPHeaderField: "secret-header")
        }
    }

    return super.loadRequest(mutableRequest)
}

这捕获了初始的html请求,它按预期工作。然而,由于该页面依次从同一服务器加载图像,样式表和脚本,因此这些不通过loadRequest方法并被拒绝,因为它们的请求缺少所需的请求头。

要求:

它必须在iOS 8+上与WKWebView一起工作。

watbbzwu

watbbzwu1#

使用当前的API是不可能的-没有任何点可以处理WKWebView发出的所有请求。您可以使用UIWebView + custom url protocolWKWebView不支持),并将您的头添加到特定服务器的所有请求中。

sqserrrh

sqserrrh2#

对于未来的任何人来说,这是可能的:

extension SomeObjectThatIsADelegate: WKNavigationDelegate {

 // Intercept all requests and insert the necessary headers
 func webView(
     _ webView: WKWebView,
     decidePolicyFor navigationAction: WKNavigationAction,
     decisionHandler: @escaping (WKNavigationActionPolicy) -> Void
 ) {
     let headerName = "Header-Name"
     let expectedHeaderValue = "header_value"

     let headers = navigationAction.request.allHTTPHeaderFields ?? [:]
     let isMatched = headers.contains { $0.key == headerName && $0.value == expectedHeaderValue }

     if isMatched {
         decisionHandler(.allow)
     } else {
         // Cancel and re-run the request with our header inserted
         decisionHandler(.cancel)

         var requestWithDeviceType = navigationAction.request
         var headers = requestWithDeviceType.allHTTPHeaderFields ?? [:]
         headers[headerName] = expectedHeaderValue
         requestWithDeviceType.allHTTPHeaderFields = headers
         webView.load(requestWithDeviceType)
     }
 }

相关问题