72 Stimmen

Benutzeragent in UIWebView ändern

Ich habe eine geschäftliche Notwendigkeit, den UserAgent für eine eingebettete UIWebView anpassen zu können. (Zum Beispiel möchte ich, dass der Server anders reagiert, wenn, sagen wir, ein Benutzer eine Version der App gegenüber einer anderen verwendet).

Ist es möglich, den UserAgent in der vorhandenen UIWebView-Steuerelement die Art und Weise ist es, sagen wir, für einen eingebetteten IE-Browser in einer Windows-Anwendung anpassen?

95voto

Louis St-Amour Punkte 3955

Moderner Mauersegler

Hier ist ein Vorschlag für Swift 3+ Projekte von den StackOverflow-Benutzern PassKit und Kheldar:

UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])

Source : https://stackoverflow.com/a/27330998/128579

Frühere Objective-C-Antwort

Mit den Änderungen von iOS 5 empfehle ich den folgenden Ansatz, der ursprünglich aus dieser StackOverflow-Frage stammt: UIWebView iOS5 Benutzer-Agent ändern wie in einer Antwort weiter unten dargelegt. Aus den Kommentaren auf dieser Seite geht hervor, dass es auch in 4.3 und früheren Versionen zu funktionieren scheint.

Ändern Sie den "UserAgent"-Standardwert, indem Sie diesen Code einmal beim Start Ihrer Anwendung ausführen Ihre Anwendung startet:

NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"};
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
[[NSUserDefaults standardUserDefaults] synchronize];

Siehe frühere Bearbeitungen dieses Beitrags, wenn Sie Methoden benötigen, die in Versionen von iOS vor 4.3/5.0 funktionieren. Beachten Sie, dass aufgrund der umfangreichen Änderungen die folgenden Kommentare / anderen Antworten auf dieser Seite möglicherweise keinen Sinn ergeben. Diese Frage ist immerhin vier Jahre alt ;-)

19voto

winitzki Punkte 2945

Ich hatte dieses Problem auch und habe alle Methoden ausprobiert. Ich fand, dass nur diese Methode funktioniert (iOS 5.x): UIWebView iOS5 Benutzer-Agent ändern

Das Prinzip besteht darin, den Benutzeragenten in den Benutzereinstellungen dauerhaft festzulegen. Das funktioniert; Webview sendet den angegebenen Header. Nur zwei Zeilen Code:

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/Whatever version 913.6.beta", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

Einstellen von User-Agent oder User_Agent in der veränderbaren Anforderung oder Überschreiben der setValue in der NSHttpRequest durch Swizzling, - ich habe versucht, dass alle und kontrollierte die Ergebnisse mit Wireshark, und nichts davon scheint zu funktionieren, weil Webview immer noch den Benutzer-Agent-Wert aus der Benutzer-Standardwerte verwendet, egal was Sie versuchen, in der NSHttpRequest festgelegt.

18voto

Dshutsi Punkte 451

Es sollte mit einem NSMutableURLRequest funktionieren, wie Kuso geschrieben hat.

NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.google.com/"]];
[urlRequest setValue: @"iPhone" forHTTPHeaderField: @"User-Agent"]; // Or any other User-Agent value.

Sie müssen NSURLConnection verwenden, um die responseData zu erhalten. Setzen Sie die responseData auf Ihre UIWebView und die webView sollte rendern:

[webView loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL];

12voto

PassKit Punkte 11654

Sehr einfach in Swift. Platzieren Sie einfach das Folgende in Ihrem App Delegate.

UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])

Wenn Sie an den bestehenden Agentenstring anhängen wollen, dann:

let userAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Custom Agent"
UserDefaults.standard.register(defaults: ["UserAgent" : userAgent])

Hinweis: Möglicherweise müssen Sie die App deinstallieren und neu installieren, um ein Anhängen an die bestehende Agentenzeichenfolge zu vermeiden.

6voto

Danra Punkte 9156

Hinzufügen eines beliebigen Header-Feldes zum NSURLRequest-Argument in shouldStartLoadWithRequest scheint funktionieren, weil die Anfrage auf setValue:ForHTTPHeaderField antwortet - aber es nicht tatsächlich funktionieren - die Anfrage wird ohne den Header gesendet.

Also habe ich diesen Workaround in shouldStartLoadWithRequest verwendet, der die gegebene Anforderung einfach in eine neue veränderbare Anforderung kopiert und sie neu lädt. Dadurch wird die Kopfzeile, die gesendet wird, tatsächlich geändert.

if ( [request valueForHTTPHeaderField:@"MyUserAgent"] == nil )
{
    NSMutableURLRequest *modRequest = [request mutableCopyWithZone:NULL];
    [modRequest setValue:@"myagent" forHTTPHeaderField:@"MyUserAgent"];
    [webViewArgument loadRequest:modRequest];
    return NO;
}

Leider ist es damit immer noch nicht möglich, den user-agent http-Header zu überschreiben, der offenbar von Apple überschrieben wird. Um ihn zu überschreiben, müssten Sie wohl selbst eine NSURLConnection verwalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X