MapKit et user-agent
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 !
Réponses
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".
Je sais ça résout pas ton problème mais bon :P
Sur le web, on trouve bien une manière de changer le user-agent via les user defaults:
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'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.
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...
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...
C'est tout bon !