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

WKWebView因Authorization无法加载资源,求全局请求头设置方法

为WKWebView设置全局Authorization请求头的解决方案

你遇到的问题很典型——WKWebView不会自动将主请求的HTTP头继承给页面内的子资源请求(比如CSS、JS、图片等),所以你的主页面能加载,但依赖的CSS因为缺少Authorization头被服务器拒绝了。下面是一个可靠的解决方案,通过拦截所有请求来全局添加所需的请求头:

步骤1:设置WKNavigationDelegate

首先,让你的视图控制器遵守WKNavigationDelegate协议,并将WKWebView的navigationDelegate指向自身,这样我们才能拦截和修改请求。

步骤2:拦截并修改所有目标请求

实现webView(_:decidePolicyFor:decisionHandler:)方法,在这个方法里我们可以捕获所有发往目标服务器的请求,添加Authorization头后重新加载。

完整代码示例:

import UIKit
import WebKit

class YourViewController: UIViewController, WKNavigationDelegate {
    private var wkWebview: WKWebView!
    private var accessToken: String = "your-actual-token-here" // 替换为你的token获取逻辑,比如从Cognito获取
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 初始化WKWebView
        let webConfig = WKWebViewConfiguration()
        wkWebview = WKWebView(frame: view.bounds, configuration: webConfig)
        wkWebview.navigationDelegate = self
        view.addSubview(wkWebview)
        
        // 加载主页面(先手动添加一次Authorization头)
        guard let mainUrl = URL(string: "https://myserverdomain.amazonaws.com/api/v3/graphs?date=2020-08-28") else { return }
        var mainRequest = URLRequest(url: mainUrl)
        mainRequest.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
        wkWebview.load(mainRequest)
    }
    
    // 拦截所有请求并添加Authorization头
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        // 只处理目标域名的请求,避免给第三方资源添加不必要的头
        guard let requestUrl = navigationAction.request.url,
              requestUrl.host == "myserverdomain.amazonaws.com" else {
            decisionHandler(.allow)
            return
        }
        
        // 复制原有请求并添加Authorization头
        var modifiedRequest = navigationAction.request
        modifiedRequest.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
        
        // 加载修改后的请求,同时取消原请求
        webView.load(modifiedRequest)
        decisionHandler(.cancel)
    }
}

关键说明

  • 域名过滤:我们只对myserverdomain.amazonaws.com的请求添加头,这样不会影响页面中可能存在的第三方资源(比如外部CDN的字体、图片)。
  • 请求重写:通过创建原有请求的副本并修改头,然后加载新请求、取消原请求的方式,确保所有子资源请求都带上Authorization。
  • Token更新:如果你的access token有过期刷新逻辑,记得及时更新accessToken变量,这样后续的请求会自动使用最新的token。

这个方案能完美解决你遇到的CSS加载问题,和Chrome、Android端的行为保持一致。

内容的提问来源于stack exchange,提问作者eric long

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:18:10