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?

6voto

dodeskjeggen Punkte 166

Die Verwendung von @"User_Agent" bewirkt lediglich, dass eine benutzerdefinierte Kopfzeile in der GET-Anforderung erscheint.

Benutzer_agent: Foobar/1.0 \r\n
Benutzer-Agent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2 wie Mac OS X; en-us) AppleWebKit/528.18 (KHTML, wie Gecko) Mobile/7D11 \r\n

Die obigen Angaben erscheinen in dem sezierten HTTP-Paket und bestätigen im Wesentlichen, was Sfjava in diesem Forum zitiert hat. Interessant ist, dass "User-Agent" in "User_agent" umgewandelt wird.

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.

5voto

EthanB Punkte 4094

Durch Bündelung die Antwort von Louis St-Amour y el NSUserDefaults+UnRegisterDefaults Kategorie aus dieser Frage/Antwort können Sie die folgenden Methoden verwenden, um User-Agent-Spoofing jederzeit zu starten und zu beenden, während Ihre Anwendung läuft:

#define kUserAgentKey @"UserAgent"

- (void)startSpoofingUserAgent:(NSString *)userAgent {
    [[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }];
}

- (void)stopSpoofingUserAgent {
    [[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}

4voto

Open SEO Punkte 1632

Diese Lösung scheint als eine ziemlich clevere Lösung angesehen worden zu sein

kopfzeilen-ändern-für-uiwebkit-http-anfragen

Es verwendet die Methode Swizzling, und Sie können mehr darüber erfahren auf der CocoaDev-Seite

Schauen Sie es sich an!

2voto

Shannon Chou Punkte 1137

Ich stand vor der gleichen Frage. Ich möchte einige Informationen zum User-Agent hinzufügen, müssen auch die ursprüngliche User-Agent von Webview zu halten. Ich löste es, indem Sie den Code unten:

    //get the original user-agent of webview
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *oldAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSLog(@"old agent :%@", oldAgent);

//add my info to the new agent
NSString *newAgent = [oldAgent stringByAppendingString:@" Jiecao/2.4.7 ch_appstore"];
NSLog(@"new agent :%@", newAgent);

//regist the new agent
NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:newAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];

Verwenden Sie es, bevor Sie Webview instanziieren.

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