MapKit et user-agent

Jean-PhiJean-Phi Membre
novembre 2013 modifié dans API UIKit #1

Bonjour,


 


Je commence des tests pour le développement d'une application iPhone sur iOS7 dans laquelle j'utilise le framework MapKit.


 


Première étape pour moi : l'utilisation de la classe MKTileOverlay afin de pouvoir afficher des fonds de carte autre que ceux de Plan.


J'ai réussi à  utiliser cette classe en donnant l'url de services me permettant d'afficher OpenStreetMap ou encore les fonds MapQuest.


 


Par contre, quand je veux utiliser les fonds de cartes du Géoportail, je rencontre un problème. J'ai une clé utilisateur associée à  un user-agent "iOS" ; quand je teste l'affichage d'une tuile dans un navigateur web en forçant l'user-agent avec la valeur "iOS" ma tuile se charge bien : donc mon url est ok !


 


D'où ma question, comment forcer l'user-agent des requêtes http envoyées par MapKit pour récupérer les tuiles des couches IGN ?


 


Un grand merci d'avance pour votre aide ! :D


Réponses

  • CéroceCéroce Membre, Modérateur

    Je ne suis pas sûr de comprendre: ce que j'ai compris, c'est que Géoportail accepte de renvoyer la tuile quand le user-agent est "iOS", mais refuse quand c'est autre chose, comme "MonApplication" ?




  • Je ne suis pas sûr de comprendre: ce que j'ai compris, c'est que Géoportail accepte de renvoyer la tuile quand le user-agent est "iOS", mais refuse quand c'est autre chose, comme "MonApplication" ?




    C'est exactement cela. Pour utiliser les flux du géoportail, tu as différents types de clé. Quand c'est pour un site web, c'est le referer qui est utilisé pour t'identifier en plus de la clé qui, elle, fait partie de l'url. Pour une application mobile, c'est l'user-agent.


     


    Comme j'expliquais, en utilisant Charles Proxy, j'ai testé mon url sous firefox en modifiant l'user-agent de la requête en "iOS" : j'ai bien reçu ma tuile, sinon je reçois un message "wrong user-agent".

  • AliGatorAliGator Membre, Modérateur

    C'est exactement cela. Pour utiliser les flux du géoportail, tu as différents types de clé. Quand c'est pour un site web, c'est le referer qui est utilisé pour t'identifier en plus de la clé qui, elle, fait partie de l'url. Pour une application mobile, c'est l'user-agent.
     
    Comme j'expliquais, en utilisant Charles Proxy, j'ai testé mon url sous firefox en modifiant l'user-agent de la requête en "iOS" : j'ai bien reçu ma tuile, sinon je reçois un message "wrong user-agent".

    Au passage : avec Chrome et Safari (ça fait un bail que j'ai pas utilisé Firefox, mais avec Firebug on doit avoir la même chose) tu peux utiliser les outils d'Inspecteur Web pour changer le User-Agent directement, pas besoin de Charles Proxy pour ça ;)

    Je sais ça résout pas ton problème mais bon :P
  • CéroceCéroce Membre, Modérateur

    Sur le web, on trouve bien une manière de changer le user-agent via les user defaults:



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

    Je n'ai pas l'impression qu'on puisse préciser le User Agent pour les requêtes de MapKit uniquement. 


     


     


    Maintenant, je serais tenté de dire que le problème vient de Géoportail: sérieux, c'est quoi ces histoires, qu'on accepte selon le User Agent ? À moins qu'il n'y ait des limitations contractuelles (du genre, on n'a pas le droit de construire une appli basées sur leur carte).


  • En fait, j'utilise firebug en général, mais là  j'ai tenté Charles proxy pour voir ce qui sortait du simulateur. Cela dit je récupère rien de mapkit...


     


    Céroce, j'ai déjà  essayé ta solution, sans succès...


    Sinon tu as tout compris, il y a un contrat avec un nombre de tuiles selon ton contrat ; en fonction de ton utilisation et de ta consommation, cela devient payant.

  • Bonjour,


     


    Une autre piste que je creuse : plutôt que de forcer l'user-agent renvoyé par iOS, je peux faire modifier celui associé à  ma clé géoportail.


    Pour cela il faut que je récupère la valeur qui figure dans le header des requêtes des tuiles envoyées par MapKit au géoportail.


     


    Quelqu'un saurait comment procéder ?


     


    Une des conditions pour que cela fonctionne ainsi, c'est aussi l'unicité de l'user-agent quelque soit le modèle d'iPhone...


     


    Merci à  ceux qui pourront m'aider... et à  ceux qui m'ont déjà  répondu !

  • CéroceCéroce Membre, Modérateur


    En fait, j'utilise firebug en général, mais là  j'ai tenté Charles proxy pour voir ce qui sortait du simulateur. Cela dit je récupère rien de mapkit...


     




    C'est super bizarre. Je n'ai jamais utilisé Charles, mais d'après ce que j'en ai lu, on doit pouvoir voir passer toutes les requêtes.


     




     


    Céroce, j'ai déjà  essayé ta solution, sans succès...


     




     


    En considérant que la solution fonctionne et change bien le User Agent des requêtes émises par l'appli, cela pourrait signifier que les requêtes Map Kit, sont faites "à  part" et ont leur propre Ueer-Agent ; ce n'est pas illogique puisque Map Kit ne fait pas partie de l'application.



  • C'est super bizarre. Je n'ai jamais utilisé Charles, mais d'après ce que j'en ai lu, on doit pouvoir voir passer toutes les requêtes.


     


     


    En considérant que la solution fonctionne et change bien le User Agent des requêtes émises par l'appli, cela pourrait signifier que les requêtes Map Kit, sont faites "à  part" et ont leur propre Ueer-Agent ; ce n'est pas illogique puisque Map Kit ne fait pas partie de l'application.




    Oui, c'est pas impossible...


    Quand j'active Charles Proxy, je vois bien les requêtes de mail ou firefox par exemple, mais rien quand Plan affiche des tuiles dans le simulateur.

  • Jean-PhiJean-Phi Membre
    novembre 2013 modifié #10

    Alors, il s'avère qu'une autre personne s'est posée exactement la même question que moi sur le forum Apple. Voici la réponse qu'on lui a apporté et qui a semblé le satisfaire:


     


    "You can override the loadTileAtPath:result: method to do whatever networking you need. The built in implementation just uses +[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]. You could do the same thing, but customize your request to have the credentials you require."


     


    Je vais donc creuser un peu le sujet...


  • CéroceCéroce Membre, Modérateur

    Oui, ça semble une bonne solution. On peut sans doute changer le User-Agent de la NSMutableURLRequest.


  • Oui, j'ai bien compris le principe, maintenant il faut que je le mette en musique...


  • Jean-PhiJean-Phi Membre
    novembre 2013 modifié #13
Connectez-vous ou Inscrivez-vous pour répondre.