我构建了一个包含 WKWebView 的应用程序,并且 Web 视图加载的网站支持多种语言。如何更改 WKWebView 中的
Accept-Language
标头或其他 HTTP 标头?
我已经让它以某种方式工作,但只有获取请求才会有自定义标头。正如 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”设置为键
只需在 URL 请求中设置所需的语言 ISO 639-1 代码,如下所示,这样我们就可以从服务器端获取用户首选或区域设置语言响应。
var request = URLRequest(url: URL(string: "YourUrlStr"))
request.setValue("en", forHTTPHeaderField: "Accept-Language")
wkWebView.load(request)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:YourUrlStr]];
[request setValue:@"en" forHTTPHeaderField:@"Accept-Language"];
[wkWebView loadRequest:request];
WKWebView 支持开箱即用的本地化。您不需要设置“Accept-Language”标头字段。
出于某种原因,如果您需要这样做,可以这样做。
创建一个“URLRequest”,一个使用所需网站初始化的 URL 实例
var request = URLRequest(url: url)
维护所需区域设置的映射并相应地设置“Accept-Language”标头字段
request.setValue("de-de", forHTTPHeaderField: "Accept-Language")
使用“WKWebView”实例加载“URLRequest”
webview.load(request)