Geolocalização: Como Identificar a Cidade do Usuário no Navegador
Minha pergunta no Stack Overflow de 2015 usava navigator.geolocation livremente. Em 2026, restrições de privacidade mudaram toda a abordagem.
Geolocalização: Como Identificar a Cidade do Usuário no Navegador
Em 2015, fiz uma pergunta no Stack Overflow em Português sobre identificar a cidade do usuário pelo navegador. Recebeu 15 votos. Parecia simples — navegadores têm API de Geolocalização, então obter a localização deveria ser direto, certo?
Era. Em 2015.
A Abordagem de 2015: Pergunte e Receba
// 2015: Obter posição e fazer geocodificação reversa
navigator.geolocation.getCurrentPosition(function (position) {
var lat = position.coords.latitude;
var lng = position.coords.longitude;
// Geocodificação reversa com Google Maps API
var geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(lat, lng);
geocoder.geocode({ location: latlng }, function (results) {
var city = results[0].address_components.find(function (c) {
return c.types.includes('administrative_area_level_2');
});
console.log('Cidade:', city.long_name);
});
});
O navegador mostrava “example.com quer saber sua localização.” A maioria dos usuários clicava “Permitir” sem pensar. Você recebia coordenadas precisas via GPS, fazia geocodificação reversa com Google Maps, e tinha o nome da cidade em segundos.
Funcionava porque:
- Usuários eram menos conscientes sobre privacidade
- A maioria dos navegadores mostrava um prompt simples, fácil de dispensar
- Não havia penalidade por perguntar cedo ou frequentemente
- A API de Geocoding do Google Maps era gratuita para volumes pequenos
A Realidade de 2026: Privacidade Primeiro
Usuários Negam Mais
A consciência sobre privacidade mudou dramaticamente. Usuários agora tratam permissão de localização como tratam acesso à câmera — negam a menos que haja razão clara. Navegadores tornaram os prompts de permissão mais proeminentes e difíceis de aprovar acidentalmente.
O resultado: taxas de conversão em prompts de geolocalização caíram significativamente. Se sua feature depende de usuários concedendo acesso à localização, planeje para a maioria dizer não.
Permissions Policy
Sites não podem mais usar a API de Geolocalização em iframes de terceiros por padrão. O header Permissions-Policy controla isso:
Permissions-Policy: geolocation=(self)
Widgets e anúncios embarcados não podem silenciosamente requisitar localização — apenas o site principal pode.
Fallback por IP
Para muitos casos, você não precisa de precisão GPS. Precisão a nível de cidade é suficiente para mostrar clima local, moeda ou preferências de idioma. Geolocalização por IP no servidor resolve isso sem perguntar nada ao usuário:
// 2026: Headers da Cloudflare (zero interação do usuário)
// Cloudflare adiciona automaticamente esses headers:
// cf-ipcountry: BR
// cf-ipcity: Sao Paulo
// cf-ipregion: SP
// Ou use uma API de geolocalização
const response = await fetch('https://ipapi.co/json/');
const data = await response.json();
console.log(`${data.city}, ${data.region}`); // "São Paulo, SP"
Sem prompt. Sem permissão. Sem fricção. O trade-off é precisão — geolocalização por IP dá no máximo nível de cidade, às vezes só país. Mas para a maioria das features, é suficiente.
O Padrão Moderno: Progressive Enhancement
async function getUserCity() {
// 1. Tentar headers Cloudflare (se atrás da CF)
// Disponível no servidor, passado ao cliente via meta tag ou API
// 2. Tentar geolocalização por IP como padrão
try {
const response = await fetch('/api/location'); // Servidor lê o IP
const data = await response.json();
if (data.city) return data.city;
} catch {}
// 3. Só pedir GPS se o usuário explicitamente quiser precisão
// (ex: clicou "Usar minha localização exata")
return new Promise((resolve) => {
navigator.geolocation.getCurrentPosition(
async (pos) => {
const city = await reverseGeocode(pos.coords);
resolve(city);
},
() => resolve(null), // Usuário negou — lidar graciosamente
{ timeout: 5000 },
);
});
}
Comece com o método menos invasivo. Escale apenas quando o usuário explicitamente requisitar.
Conclusão
Em 2015, navigator.geolocation era a resposta para “onde está o usuário?” Em 2026, é o último recurso. Geolocalização por IP resolve a maioria dos casos sem fricção, headers da Cloudflare dão país e cidade de graça, e GPS só deveria ser disparado por ação explícita do usuário. A melhor geolocalização é aquela que o usuário nem percebe.
Posts Relacionados
Geolocalização: Como Identificar a Cidade do Usuário no Navegador
Minha pergunta no Stack Overflow de 2015 usava navigator.geolocation livremente. Em 2026, restrições de privacidade mudaram toda a abordagem.
Adicionar aos Favoritos: De APIs do Navegador a PWA Install
Minha resposta no SO de 2015 mostrava window.external.AddFavorite() para IE. Em 2026, navegadores removeram bookmarking programático — mas PWA Install substituiu.
Bloquear Caracteres Especiais no Input: De Regex a Validação Nativa
Minha resposta no Stack Overflow de 2015 usava eventos keypress para filtrar caracteres. Em 2026, o evento input e validação nativa fazem melhor.