Guides

Ajouter un bouton « détecter ma position » sans la demande d'autorisation du navigateur

L'invite de localisation intégrée au navigateur demande une précision de niveau GPS et exige un clic d'autorisation explicite, que beaucoup de visiteurs refusent par réflexe. Un bouton « détecter ma position » n'a pas besoin de passer par cette boîte de dialogue si une localisation approximative suffit pour ce que vous construisez.

Détecter la position côté serveur

Lorsque le bouton est cliqué, envoyez une requête à votre propre serveur, qui voit déjà l'adresse IP du visiteur sur la connexion. Recherchez cette adresse via /v1/ip et utilisez directement le résultat, sans aucune boîte de dialogue d'autorisation du navigateur à aucun moment.

GET /v1/ip
{
  "status": "ok",
  "ip": "198.51.100.23",
  "version": 4,
  "found": true,
  "country": "Italy",
  "country_code": "IT",
  "region": "Lombardy",
  "city": "Milan",
  "postcode": "20121",
  "lat": 45.4642,
  "lon": 9.1900,
  "timezone": "Europe/Rome",
  "asn": 3456,
  "org": "Example ISP"
}

Appeler l'endpoint sans paramètre ip, comme ici, recherche l'adresse qui a émis la requête, c'est-à-dire précisément l'adresse du visiteur lorsque votre backend l'appelle en son nom.

Fixer des attentes réalistes

La localisation basée sur l'IP atteint au mieux le niveau de la ville, pas la précision du GPS. Nommez la fonctionnalité honnêtement, par exemple « détecter ma zone approximative » plutôt que de suggérer une précision au mètre près, afin qu'un visiteur ne soit pas surpris lorsque le résultat est un centre-ville plutôt que sa rue exacte.

Un second exemple : l'affichage de tarifs régionaux

Le même principe de bouton permet d'afficher des tarifs ou un contexte monétaire adaptés à la région sur une page d'atterrissage. Comme tous les prix sont indiqués en EUR quelle que soit la localisation du visiteur, un tel bouton servirait plutôt à préremplir une estimation des frais de livraison ou un numéro de contact régional qu'à changer la devise affichée, mais la requête sous-jacente est identique : une seule recherche d'IP qui renvoie assez d'informations pour remplir immédiatement la ville et le pays.

Les cas où cette approche convient

Cette approche convient aux localisateurs de magasins, aux contenus régionaux par défaut et aux estimations de livraison, où une ville ou une région suffit. Elle ne remplace pas la localisation GPS pour des usages comme la navigation pas à pas, où l'invite du navigateur et la position réelle de l'appareil sont véritablement nécessaires.

Une erreur courante à éviter

Ne traitez pas une connexion via un réseau d'entreprise ou un VPN comme un cas d'erreur particulier à gérer différemment des autres recherches. L'endpoint renverra quand même un résultat, simplement centré sur l'adresse enregistrée de ce réseau, qui peut se trouver dans une autre ville, voire dans un autre pays que celui où se trouve réellement le visiteur. La bonne réponse est la même que pour toute estimation basée sur l'IP : laissez le visiteur la corriger, plutôt que d'essayer de détecter le trafic VPN et de le signaler comme inhabituel.

Prévoir une solution de repli

Si found revient à false, ce qui peut arriver pour certaines plages d'adresses, demandez au visiteur de saisir une localisation manuellement plutôt que d'afficher une erreur, puisque tout l'intérêt du bouton était de lui épargner cette étape, et non de créer une impasse.

Le coût de la fonctionnalité

Chaque clic correspond à une requête. Un bouton utilisé occasionnellement par les visiteurs ne représente qu'une infime fraction des 2 500 requêtes gratuites par jour incluses avec chaque clé, ou disponibles depuis une même adresse sans clé. Les visiteurs IPv4 comme IPv6 sont traités par le même appel, il n'y a donc pas besoin de code distinct pour l'une ou l'autre version.

Se passer de la boîte de dialogue d'autorisation, c'est échanger de la précision contre de la simplicité, ce qui est le bon compromis pour de nombreuses fonctionnalités de localisation. La documentation de la recherche IPv4 décrit la réponse complète de l'endpoint.