2016-04-26 41 views
6

Ho creato un'app che include un WKWebView e il sito Web caricato dalla vista Web supporta più lingue. Come posso cambiare l'intestazione Accept-Language in un WKWebView o altre intestazioni HTTP per quella materia?Come impostare intestazioni HTTP personalizzate per richieste effettuate da un WKWebView

+0

questo è una specie di un duplicato di http://stackoverflow.com/questions/28984212/how-to-add-httpheader -in-request-global-for-ios-swift/37474812 # 37474812 Vedere la mia risposta su questa domanda e funzionerà. Ho testato Accept-Language e può essere sovrascritto. –

+2

Questa soluzione funziona solo per la richiesta iniziale, non per le risorse secondarie. – mservidio

risposta

2

Ho funzionato in un modo, ma solo ottenere richieste avrà l'intestazione personalizzata. Come ha risposto jbelkins nel link così dal commento di Gabriel Cartiers alla tua domanda, dovrai manipolare la richiesta e caricarla di nuovo.

ho ottenuto che funziona per get-domande come questa:

(è in Xamarin 0> C#, ma penso che si ottiene l'idea)

ho creato un campo privato

private bool _headerIsSet 

che controllo ogni volta che viene effettuata una richiesta nel metodo 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); 
     } 
    } 

Come ho detto, questo funziona solo per GET -Richieste. In qualche modo, POST -Richieste non contengono i dati del corpo della richiesta originale (request.Body e request.BodyStream sono null), quindi la muteableRequest (che è una copia mutabile della richiesta originale) non conterrà i dati del corpo della richiesta originale.

Spero che questo possa aiutare voi o altri che si avvicinano allo stesso problema.

Edit: Per le vostre esigenze, impostare "Accept-Language" come chiave