如何为 WKWebView 发出的请求设置自定义 HTTP 标头

问题描述 投票:0回答:3

我构建了一个包含 WKWebView 的应用程序,并且 Web 视图加载的网站支持多种语言。如何更改 WKWebView 中的

Accept-Language
标头或其他 HTTP 标头?

ios swift macos cocoa webkit
3个回答
6
投票

我已经让它以某种方式工作,但只有获取请求才会有自定义标头。正如 jbelkins 在链接中回答的那样,来自 Gabriel Cartiers 对您的问题的评论,您将必须操纵请求并重新加载它。

我已经让它适用于像这样的 GET 请求:

(它在 xamarin 0> c# 中,但我想你会明白的)

我创建了一个私有字段

private bool _headerIsSet

每次在委托方法中发出请求时我都会检查:

[Foundation.Export("webView:decidePolicyForNavigationAction:decisionHandler:")]
    public void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)
    {
        var request = navigationAction.Request;
        // check if the header is set and if not, create a muteable copy of the original request
        if (!_headerIsSet && request is NSMuteableUrlRequest muteableRequest);              
        {
            // define your custom header name and value
            var keys = new object[] {headerKeyString};
            var values = new object[] {headerValueString};
            var headerDict = NSDictionary.FromObjectsAndKeys(values, keys);
            // set the headers of the new request to the created dict
            muteableRequest.Headers = headerDict;
            _headerIsSet = true;
            // attempt to load the newly created request
            webView.LoadRequest(muteableRequest);
            // abort the old one
            decisionHandler(WKNavigationActionPolicy.Cancel);
            // exit this whole method
            return;
        }
        else
        {
            _headerIsSet = false;                
            decisionHandler(WKNavigationActionPolicy.Allow);
        }
    }

正如我所说,这只适用于 GET-请求。不知何故,POST-Requests不包含原始请求的正文数据(request.Body和request.BodyStream为空),因此muteableRequest(它是原始请求的可变副本)不会包含原始请求的正文数据。

我希望这能帮助您或其他遇到同样问题的人。

编辑:根据您的需要,将“Accept-Language”设置为键


6
投票

只需在 URL 请求中设置所需的语言 ISO 639-1 代码,如下所示,这样我们就可以从服务器端获取用户首选或区域设置语言响应。

Swift 4 及以上版本

var request = URLRequest(url: URL(string: "YourUrlStr"))
request.setValue("en", forHTTPHeaderField: "Accept-Language")
wkWebView.load(request)

目标-C

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:YourUrlStr]];
[request setValue:@"en" forHTTPHeaderField:@"Accept-Language"];
[wkWebView loadRequest:request];

1
投票
  1. WKWebView 支持开箱即用的本地化。您不需要设置“Accept-Language”标头字段。

  2. 出于某种原因,如果您需要这样做,可以这样做。

创建一个“URLRequest”,一个使用所需网站初始化的 URL 实例

var request = URLRequest(url: url)

维护所需区域设置的映射并相应地设置“Accept-Language”标头字段

request.setValue("de-de", forHTTPHeaderField: "Accept-Language")

使用“WKWebView”实例加载“URLRequest”

webview.load(request)
  1. 类似地,任何标头字段都可以更改
© www.soinside.com 2019 - 2024. All rights reserved.