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

Joe*_*SHI 9 macos cocoa webkit ios swift

我已经构建了一个包含WKWebView的应用程序,并且Web视图加载的网站支持多种语言.如何更改Accept-LanguageWKWebView或其他HTTP标头中的标头?

Der*_*ens 5

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

我已经让它为GET-Requests工作了:

(这是在xamarin 0> c#,但我想你会得到这个想法)

我创建了一个私人领域

private bool _headerIsSet
Run Code Online (Sandbox Code Playgroud)

我在每次在deligate方法中发出请求时检查:

[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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

我希望这会帮助你或其他人解决同样的问题.

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


小智 5

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

斯威夫特 4 及以上

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

Objective-C

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:YourUrlStr]];
[request setValue:@"en" forHTTPHeaderField:@"Accept-Language"];
[wkWebView loadRequest:urlRequest];
Run Code Online (Sandbox Code Playgroud)