指南

添加无需浏览器授权提示的“检测我的位置”按钮

浏览器内置的位置提示请求的是 GPS 级精度,并且需要用户明确点击授权,而很多访客会下意识地拒绝。如果您要构建的功能只需要大致位置,“检测我的位置”按钮完全不必经过这个对话框。

在服务器端检测

点击按钮时,向您自己的服务器提交请求,服务器在连接上本来就能看到访客的 IP 地址。用 /v1/ip 查询该地址并直接使用结果,整个过程中完全不涉及浏览器权限对话框。

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"
}

如此处所示,调用端点时不带 ip 参数,就会查询发起请求的那个地址;当您的后端代表访客调用时,这正是访客自己的地址。

正确设定预期

基于 IP 的定位最多只能精确到城市级别,达不到 GPS 精度。请如实为该功能命名,例如“检测我的大致区域”,而不要暗示精确定位,这样访客看到结果是市中心而不是自己所在的街道时,就不会感到意外。

第二个示例:按地区显示价格

同样的按钮模式也适用于在落地页上显示与地区相符的价格或货币信息。由于无论访客位于何处,所有价格都以 EUR 报价,这样的按钮更适合用来预填运费估算或地区联系电话,而不是更改显示的货币,但底层请求完全相同:一次 IP 查询即可返回足够的信息,立即填入城市和国家。

适用场景

这种方法适用于门店查找、地区内容默认设置和运费估算等只需要城市或地区的场景。它无法取代逐向导航这类场景中的 GPS 定位,在那些场景里,浏览器提示和真实的设备位置确实是必要的。

需要避免的常见错误

不要把企业网络或 VPN 连接当作需要与其他查询区别处理的特殊错误情况。端点仍会返回结果,只是结果以该网络的注册地址为中心,这可能与访客实际所在的城市不同,甚至位于不同的国家。正确的做法与对待任何基于 IP 的估算相同:让访客自行更正,而不是试图检测 VPN 流量并专门将其标记为异常。

优雅降级

如果 found 返回 false(某些地址段可能出现这种情况),请改为让访客手动输入位置,而不是显示错误,因为这个按钮的意义本来就是省去这一步,而不是制造死胡同。

该功能的成本

每次点击就是一次请求。访客偶尔使用的按钮,只占每个密钥附带的(或无密钥时单个地址可用的)每天 2,500 次免费请求中极小的一部分。IPv4 和 IPv6 访客都通过同一个调用解析,因此无需为任一版本编写单独的代码路径。

跳过权限对话框是以精度换取便利,对很多位置功能来说,这是正确的取舍。IPv4 查询文档介绍了该端点的完整响应。