web-dev-qa-db-fra.com

Modifier l'agent utilisateur dans UIWebView

J'ai un besoin professionnel de pouvoir personnaliser le UserAgent pour un UIWebView intégré. (Par exemple, j'aimerais que le serveur réponde différemment si, par exemple, un utilisateur utilise une version de l'application par rapport à une autre.)

Est-il possible de personnaliser le UserAgent dans le contrôle UIWebView existant tel qu'il est, par exemple, pour un navigateur intégré IE dans une application Windows?

66
Steve Murch

Swift moderne

Voici une suggestion pour les projets Swift 3+ des utilisateurs de StackOverflow, PassKit et Kheldar:

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

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

Réponse antérieure à Objective-C

Avec les modifications apportées à iOS 5, je recommande l'approche suivante, tirée à l'origine de cette question de StackOverflow: UIWebView iOS5 change d'utilisateur-agent comme indiqué dans une réponse ci-dessous. Dans les commentaires sur cette page, il semble également fonctionner en 4.3 et versions antérieures.

Modifiez la valeur par défaut "UserAgent" en exécutant ce code une fois lorsque votre application démarre:

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

Consultez les éditions précédentes de ce post si vous avez besoin de méthodes fonctionnant dans les versions d'iOS antérieures à 4.3/5.0. Notez qu'en raison des nombreuses modifications apportées, les commentaires/autres réponses suivants sur cette page peuvent ne pas avoir de sens. C'est une question de quatre ans, après tout. ;-)

90
Louis St-Amour

J'ai eu ce problème aussi et j'ai essayé toutes les méthodes. J'ai constaté que seule cette méthode fonctionne (iOS 5.x): UIWebView iOS5 changer d'utilisateur-agent

Le principe est de définir l'agent utilisateur de manière permanente dans les paramètres utilisateur. Cela marche; Webview envoie l'en-tête donné. Juste deux lignes de code:

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

Définir User-Agent ou User_Agent dans la requête mutable ou remplacer la valeur setValue dans NSHttpRequest par swizzling. J'ai essayé tout cela et j'ai contrôlé les résultats à l'aide de Wireshark. par défaut de l'utilisateur, peu importe ce que vous essayez de définir dans NSHttpRequest.

19
winitzki

Cela devrait fonctionner avec un NSMutableURLRequest comme Kuso l'a écrit.

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

Vous devrez utiliser NSURLConnection pour obtenir le responseData. Définissez le responseData sur votre UIWebView et le WebView doit rendre:

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

Très simple dans Swift. Il suffit de placer ce qui suit dans votre délégué d’application.

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

Si vous souhaitez ajouter à la chaîne d'agent existant, alors:

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

Remarque: vous devrez peut-être désinstaller et réinstaller l'application pour éviter l'ajout à la chaîne de l'agent existant.

10
PassKit

L'utilisation de @ "User_Agent" entraîne simplement l'affichage d'un en-tête personnalisé dans la requête GET.

User_agent: Foobar/1.0\r\n
User-Agent: Mozilla/5.0 (iPhone; U; CPU IPhone OS 3_1_2 comme Mac OS X; en-nous) AppleWebKit/528.18 (KHTML, comme Gecko) Mobile/7D11\r\n

Ce qui précède est ce qui apparaît dans le paquet HTTP disséqué, confirmant essentiellement ce que Sfjava citait à partir de ce forum. Il est intéressant de noter que "User-Agent" est transformé en "User_agent".

6
dodeskjeggen

En prenant tout cela, voici comment cela a été résolu pour moi:

- (void)viewDidLoad {
    NSURL *url = [NSURL URLWithString: @"http://www.Amazon.com"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:@"Foobar/1.0" forHTTPHeaderField:@"User-Agent"];
    [webView loadRequest:request];
}

Merci tout le monde.

6
Michael Robinson

En fait, l'ajout de tout champ d'en-tête à l'argument NSURLRequest dans shouldStartLoadWithRequest semble fonctionne, car la demande répond à setValue: ForHTTPHeaderField - mais cela ne fonctionne pas fonctionne réellement - la demande est envoyée dehors sans l'en-tête.

J'ai donc utilisé cette solution de contournement dans shouldStartLoadWithRequest, qui copie simplement la requête donnée dans une nouvelle requête mutable et la recharge. Cela modifie en fait l'en-tête qui est envoyé.

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

Malheureusement, cela ne permet toujours pas de remplacer l'en-tête http de l'agent utilisateur, apparemment écrasé par Apple. J'imagine que pour le contourner, il vous faudrait gérer vous-même une connexion NSURLConnection.

6
Danra

En regroupant la réponse de Louis St-Amour et la catégorie NSUserDefaults+UnRegisterDefaultsà partir de cette question/réponse , vous pouvez utiliser les méthodes suivantes pour démarrer et arrêter la mystification de l'agent utilisateur à tout moment de l'exécution de votre application:

#define kUserAgentKey @"UserAgent"

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

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

Cette solution semble avoir été considérée comme un moyen assez intelligent de le faire

changer-les-en-têtes-pour-uiwebkit-http-request

Il utilise Method Swizzling et vous pouvez en apprendre plus à ce sujet sur la page CocoaDev

Jetez un coup d'oeil!

4
Open SEO

J'ai fait face à la même question. Je veux ajouter quelques informations à l'agent utilisateur, je dois également conserver l'agent utilisateur d'origine de la vue Web. Je l'ai résolu en utilisant le code ci-dessous:

    //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];

Utilisez-le avant d'instancer webview.

2
Shannon Chou

Le seul problème que j'ai trouvé était le changement d'agent utilisateur uniquement

- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSDictionary *dictionary = [NSDictionary 
        dictionaryWithObjectsAndKeys:
        @"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5", 
        @"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
}
1
Sanjeev sharma

Essayez ceci dans le AppDelegate.m

+ (void)initialize 

{

    // Set user agent (the only problem is that we can’t modify the User-Agent later in the program)

    // iOS 5.1

    NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:@”Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3”, @”UserAgent”, nil];


    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];

}
1
Aitul

Pour simplement ajouter un contenu personnalisé à la valeur actuelle de UserAgent, procédez comme suit:

1 - Obtenir la valeur de l'agent utilisateur à partir d'une nouvelle vue Web

2 - Ajoutez le contenu personnalisé à celui-ci

3 - Enregistrez la nouvelle valeur dans un dictionnaire avec la clé UserAgent

4 - Enregistrez le dictionnaire dans standardUserDefaults. 

Voir l'exemple ci-dessous:

NSString *userAgentP1 = [[[UIWebView alloc] init] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *userAgentP2 = @"My_custom_value";
NSString *userAgent = [NSString stringWithFormat:@"%@ %@", userAgentP1, userAgentP2];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:userAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
0
Doug