Wie fügt HTTP-Header in der Anfrage weltweit für iOS in swift
func webView(webView: WKWebView!, decidePolicyForNavigationAction navigationAction: WKNavigationAction!, decisionHandler: ((WKNavigationActionPolicy) -> Void)!) {
var request = NSMutableURLRequest(URL: navigationAction.request.URL)
request.setValue("value", forHTTPHeaderField: "key")
decisionHandler(.Allow)
}
Im obigen code möchte ich einen header hinzufügen, um die Anfrage.
Ich habe versucht, das zu tun navigationAction.request.setValue("IOS", forKey: "DEVICE_APP")
aber es funktioniert nicht.
bitte helfen Sie mir in irgendeiner Weise.
Verbinden möchten soap-header ?
danke für die Antwort ... aber eigentlich habe ich eine erstellt wkwebview.wo muss ich hinzufügen header für die Anfrage .es wurde getan, nur die erste Zeit .danach wird es nicht Hinzugefügt .wie pro die apple-doc gibt es eine api-decidePolicyForNavigationAction, wo jedes mal Anfrage geladen wird .ich möchte hinzufügen-header für die Anforderung
danke für die Antwort ... aber eigentlich habe ich eine erstellt wkwebview.wo muss ich hinzufügen header für die Anfrage .es wurde getan, nur die erste Zeit .danach wird es nicht Hinzugefügt .wie pro die apple-doc gibt es eine api-decidePolicyForNavigationAction, wo jedes mal Anfrage geladen wird .ich möchte hinzufügen-header für die Anforderung
InformationsquelleAutor sandip | 2015-03-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
AFAIK leider können Sie nicht mit
WKWebView
.Wird es ganz sicher nicht in
webView:decidePolicyForNavigationAction:decisionHandler:
weil dienavigationAction.request
schreibgeschützt ist und nicht verändertNSURLRequest
Instanz, die Sie nicht ändern können.Wenn ich das richtig verstehe
WKWebView
läuft in der Sandbox in einem separaten content-und Netzwerk-Prozess und, zumindest auf iOS, es gibt keine Möglichkeit, abfangen oder ändern der Netzwerk-Anfragen.Können Sie dies tun, wenn Sie einen Schritt zurück, um
UIWebView
.Dies ist nicht ganz richtig, meine Antwort
Es ist möglich override-Funktion laden von WKWebView und behandeln alle Anfragen selbst. Beispiel dieser hier — novemberfive.co/blog/wkwebview-umleiten-mit-cookies
InformationsquelleAutor Stefan Arentz
Gibt es viele verschiedene Möglichkeiten, das zu tun, ich fand, dass die einfachste Lösung war Unterklasse WKWebView und überschreiben Sie die loadRequest Methode. So etwas wie dieses:
Dann verwenden Sie einfach die CustomWebView Klasse, als ob es war ein WKWebView.
BEARBEITEN HINWEIS: Dies funktioniert nur auf den ersten Antrag, wie bereits von @Stefan Arentz.
HINWEIS: Einige Felder können nicht überschrieben werden und wird nicht geändert werden. Ich habe nicht eine Gründliche Prüfung, aber ich weiß, dass die
User-Agent
Feld kann nicht überschrieben werden, es sei denn, Sie einen bestimmten hack (überprüfen Sie hier für eine Antwort)Das stimmt, werde ich hinzufügen, einen Hinweis auf meinen post. Ich habe nicht gegraben, tief in die webview, weil diese geeignet, meine Bedürfnisse, aber ich fühle mich wie es möglich ist, es zu tun durch die Delegierten. Haben Sie tatsächlich getestet, es durch die
webView:decidePolicyForNavigationAction:decisionHandler
Methode?Hey Gabriel, "Es gibt viele verschiedene Möglichkeiten, das zu tun" - Wie, was? Konkrete Beispiele dafür? Möchten Sie vielleicht zu prüfen, Ihre Vorschläge.
Ich werde tun, ein bisschen mehr Tests auf die entscheiden politischen Methode und aktualisieren Sie die Antwort
Heutzutage wäre es
override func load(_ request: URLRequest) -> WKNavigation?
Swift (4.2)InformationsquelleAutor Gabriel Cartier
Mit einigen Einschränkungen, aber Sie können es tun. Abfangen der Reaktion in der delegate-Funktion
webView:decidePolicyFornavigationResponse:decisionHandler:
, wenn die url-änderungen Abbrechen, indem Sie die WeitergabedecisionHandler(.cancel)
und laden Sie die webview mit neuenURLRequest
setzt die benutzerdefinierte Header und die zu überwachende url ein. Auf diese Weise wird jedes mal eine url ändert (z.B. Benutzer Tippen Sie auf "links"), die Sie stornieren, die Anfrage und erstellen eine neue mit custom-Header.Sie sind wahrscheinlich richtig
navigationAction
kann einen besseren Ort, um es zu tun. So lange wie Sie können extrahieren Sie die url und erkennt die änderung. Ich denke, Sie können tunlet url = navigationAction.request?.url ...
Wenn es für Sie funktioniert werde ich korrigieren meine Antwort entsprechend.Das ist ok ich gepostet, was ich am Ende mit, wie eine andere Antwort. Es ist im Grunde das gleiche, nur das kopieren der bestehenden Anforderung und Einstellung der parameter. Stellte sich heraus, dass urlrequest-ist ein struct.
InformationsquelleAutor Au Ris
InformationsquelleAutor Jonny
Habe ich geändert, Au-Ris-Antwort zu verwenden
NavigationAction
stattNavigationResponse
, als jonny schlug. Auch dieser behebt Situationen, in denen die gleiche url aufgerufen wird, in der Folge, und Sie nicht haben, um zu verfolgen die aktuelle url nicht mehr. Dies funktioniert nur für GET-Anfragen, aber kann sicherlich angepasst werden, für andere Auftragsarten, wenn nötig.}
InformationsquelleAutor Roben
Hier ist, wie Sie es tun:
Die Strategie ist es, Ihre WKNavigationDelegate die Anforderung Abbrechen ändern Sie eine veränderbare Kopie und re-initiieren. Eine if-else wird verwendet, um die Anforderung, um fortzufahren, wenn Sie bereits die gewünschten header; sonst werden Sie am Ende in einer endlosen lade - /decidePolicy Schleife.
Nicht sicher, was, aber es passieren komische Dinge wenn Sie festlegen, dass die Kopfzeile auf jeder Anfrage, so dass für beste Ergebnisse stellen nur die header-Anfragen an die domain(s) Sie sich interessieren.
Hier das Beispiel setzt ein header-Feld für Anfragen an header.domain.com und alle anderen Anforderungen ohne Kopf:
Dies wird laden Sie einfach die top-level-Seite. Es wird nicht fügen Sie überschriften, um alle Ressourcen auf der Seite. Oder XHR-Anfragen wird die Seite stellen. Dies ist nicht anders als Ihre Vorherige Antwort.
es ist richtig, dass diese Methode ändert nur den Header der html-Seite anfordern. jedoch nachfolgende html-Seite wird auf Wunsch auch seinen Header geändert. dies ist nicht der Fall mit @gabriel-cartier-Methode.
loadRequest
wird nicht aufgerufen, wenn der Benutzer tippt auf links.Sie sollten auch prüfen, ob die Anforderung auf der Haupt-frame -
navigationAction.targetFrame?.isMainFrame
. sonst werden Sie Last eine neue Seite für iframe-Anfragen.InformationsquelleAutor jbelkins