UIWebView et site mobile

JekarJekar Membre
19:09 modifié dans API UIKit #1
J'ai un petit probleme avec une UIwebview et un site pour mobile.
Quand j y accede via safari de l iphone, pas de soucis, je suis bien sur la version mobile du site.
Par contre qd j essaie a travers un UiWebView que j ai programmé, la le site ne le detecte pas et me renvoie vers le site web "classique".

Avez vous une idée?
merci

Réponses

  • NoNo Membre
    avril 2009 modifié #2
    Les serveurs web qui "adaptent" leu contenu selon que le browser soit iphone ou non utilisent le header User-Agent de la requête http pour détecter la plateforme et/ou le browser.

    Quand Safari mobile est utilisé, il envoie un user-agent ressemblant à  cela :
    [tt]Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3[/tt].

    Par contre quand tu utilises directement un UIWebView, le user-agent est différent :
    [tt]WebApps/1.0 CFNetwork/339.3 Darwin/9.4.1[/tt].

    Donc pour simuler un comportement Safari mobile dans ton UIWebVoew, modifie ce header user-agent.

    Cela passe par la création d'une NSMutableURLRequest dans laquelle il faudra mettre le bon user-agent (par setValue:forHTTPHeaderField:), puis par le chargement de cette requête dans l'UIWebView en utilisant la méthode loadRequest:.
  • JekarJekar Membre
    19:09 modifié #3
    Super!
    je teste ca ce soir!
    Merci 
  • JekarJekar Membre
    19:09 modifié #4
    j ai fait ca et ca ne fonctionne pas :(
    NSString *urlAddress = @&quot;http://monsite&quot;;<br />	NSURL *url = [NSURL URLWithString:urlAddress];<br />	NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];<br />	[request setValue:@&quot;Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; fr-fr) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5H11 Safari/525.20&quot; forHTTPHeaderField:@&quot;User-Agent&quot;];<br />	[webView loadRequest:request];
    

  • NoNo Membre
    19:09 modifié #5
    Je viens de faire les test, et malheureusement ça marche pas non plus chez moi.
    Le user-agent est bien modifié, mais au final, ce que reçoit le serveur est différent.

    Par contre, le user-agent reçu par le serveur est :
    [tt]Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_0 like Mac OS X; fr-fr)... [/tt]
    Donc si les scripts de détection côté serveur sont efficaces, une UIWebView devrait charger le site version iPhone.

    Tu peux tester les user-agent en utilisant le site www.useragentstring.com.
  • JekarJekar Membre
    19:09 modifié #6
    Oui, bizarre hein!
    J'ai eu beau chercher, pas trouvé de solution
  • JekarJekar Membre
    19:09 modifié #7
    Personne d'autre n'a une idée?
  • groumpfgroumpf Membre
    19:09 modifié #8
    C'est le genre de truc qui doit marcher avec l'iphone et pas avec le simulateur
  • NoNo Membre
    19:09 modifié #9
    Pourrait-on connaitre le site en question ?
    Car les tests faits (UIWebView et simulator) chez moi affichent bien la version iPhone des sites (j'ai testé sur 2 sites, donc macgeneration entre autre).
  • JekarJekar Membre
    19:09 modifié #10
    Ca ne marche ni avec le simulateur, ni avec l Iphone.
    Un des sites en question est transilien.mobi

    Merci
  • NoNo Membre
    19:09 modifié #11
    En fait la modification du user-agent affecte la première requête, mais s'il y a des redirections http (cas de transilien.mobi par exemple), une nouvelle requête est créée en interne, et donc la modif du user-agent est perdue.

    Pour palier à  ce problème, on va passer par le delegate webView: shouldStartLoadWithRequest:navigationType: qui est appelé lorsque le webkit a créé une requête mais ne l'a pas encore émise vers le serveur web.
    <br />- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType<br />{<br /> &nbsp; [request setValue:@&quot;Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; fr-fr) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5H11 Safari/525.20&quot; forHTTPHeaderField:@&quot;User-Agent&quot;];<br /> &nbsp; return YES;<br />}
    


    Cela fonctionne chez moi pour transilien.mobi.
    Bizarrement, l'argument shouldStartLoadWithRequest: est prototypé en NSURLRequest, mais l'objet passé est réellement un NSMutableURLRequest (un [tt]NSLog(@%@", [request className]);[/tt] le confirme d'ailleurs).
  • NoNo Membre
    19:09 modifié #12
    Ci joint un petit projet minimaliste qui illustre ça.

Connectez-vous ou Inscrivez-vous pour répondre.