如何将地理位置集成到您的 PWA 中
已发表: 2020-08-14目录
假设用户使用受支持的浏览器,您可以让 PWA 使用 Geolocation API 轻松检测用户的位置,或者更具体地说,使用其中的navigator.geolocation
对象。 以下是在 PWA 中正确执行此操作的方法:
先决条件
- 扎实的 JavaScript 和 HTML 知识。
- 通过HTTPS提供的工作PWA (按照我们的 PWA 教程创建一个)。
地理位置在行动
到目前为止,您可能对地理定位并不陌生。 在您的许可下,集成了地理位置的网站可以访问您的位置,使用它可以显示您所在地区的相关信息,或者只是在地图上显示您的位置。

如何将地理位置集成到您的 PWA 中
基础知识
首先,我们需要了解navigator.geolocation
对象背后的底层机制。 navigator
对象是一个容器对象,通过它我们可以使用很多 Web API。 navigator
容器内部是geolocation
对象,由这三种方法提供:
-
getCurrentPosition()
-
watchPosition()
-
clearWatch()
使用getCurrentPosition()
获取用户的位置
第一个方法getCurrentPosition()
的目的应该是不言自明的——它获取用户设备的位置。
navigator.geolocation.getCurrentPosition(() => {})
获取的位置在coords
和timestamp
中可用,其中coords
是一个Coordinates
对象。 默认情况下, Coordinates
对象由以下属性定义:
-
accuracy
以米为单位的位置精度 altitude
位置的高度accuracy
位置高度的精度,以米为单位- 指向设备
heading
的方向,以度数表示。 (0 = 北,东 = 90,南 = 180,西 = 270) -
latitude
位置的纬度 longitude
位置的经度speed
设备运行的速度,以米/秒表示
正如您可能已经猜到的那样,缺少适当跟踪硬件的设备将无法获得此 API 的全部好处,因此只会返回一些值而将其他值保留为null
。 例如,在台式计算机上,我们只能接收longitude
、 latitude
和accuracy
的值,而其他请求的值( heading
、 speed
)返回null
。

heading
和speed
都返回null
watchPosition()
— 定期检索用户的位置
虽然上述方法主要用于检索用户的位置,但对于依赖用户精确位置的应用程序而言,它并没有那么有用,因为众所周知,您的用户经常在移动中。 这时候我们需要navigator.geolocation
的watchPosition()
方法,它会注册一个回调函数来定期更新用户的位置。

navigator.geolocation.watchPosition(位置 => { 控制台日志(位置) })
watchPosition
方法返回一个唯一的事务id
,可用于停止接收位置更新。 使用唯一id
和navigator.geolocation.clearWatch()
方法,我们可以停止监视位置:
常量 id = navigator.geolocation.watchPosition(位置 => { 控制台日志(位置) }) //10秒后停止观看 设置超时(()=> { navigator.geolocation.clearWatch(id) }, 10 * 1000)
错误处理
当您没有设置适当的功能来处理所有错误时,它很快就会失控。 要在人类可读的块中显示错误,您需要将以下代码添加到用于显示位置的函数中:
功能位置错误(错误){ 开关(错误代码){ 案例错误。PERMISSION_DENIED: return "用户拒绝地理定位请求。"; 案例错误。POSITION_UNAVAILABLE: return "位置信息目前不可用。"; 案例错误。超时: return "请求用户位置超时。"; 案例错误。未知错误: return "发生未知错误。"; } }
此外,您可以在控制台中对此进行测试:
navigator.geolocation.getCurrentPosition(位置 => { 控制台日志(位置) }, 错误 => { 控制台.错误(错误) })
这将返回一个code
属性,其中1
表示用户权限已被拒绝, 2
表示用户位置当前不可用, 3
表示请求超时。
超越基础
了解基础是一回事,但您始终可以努力做得更好。 以下是您可以如何进一步改进您的地理定位功能。
查找坐标时超时
如果您的用户网络状况不佳,可以使用超时指示操作已过期。 要添加超时,我们需要添加第三个参数,其中包含以下属性:
-
timeout
操作过期前的毫秒数。 -
maxiumAge
浏览器缓存的位置的最大年龄,以毫秒为单位。 -
enableHighAccuracy
一个不言自明的真/假选项,它可能会消耗更多时间和资源以获取更准确的位置。
navigator.geolocation.getCurrentPosition(位置 => { 控制台日志(位置) }, 错误 => { 控制台.错误(错误) }, { 超时:2000, 最大年龄:20000, 启用高精度:真 })
在谷歌地图上显示用户位置
使用 Google Maps API,我们可以在 Google Map 上显示用户的位置。
<script src="//maps.googleapis.com/maps/api/js?v=3.exp&sensor=true"></script>
要在 Web 上演示 Google Map API,我们推荐 Google 的本指南:在地图上显示用户或设备位置。 在指南中,您将找到一个集成了 Google Maps API 的基本 HTML。
或者,对基于 React 的 PWA 使用react-geolocated
如果你不适应它, react-geolocated
也是一种快速轻松地将地理定位与基于 React 的应用程序集成的好方法。 只需使用以下命令将模块安装在现有 PWA之上:
npm install react-geolocated --save
之后,按照官方 GitHub 链接中提供的步骤操作,您应该拥有一个具有内置地理定位功能的 PWA。
结论
这就是 PWA 的地理定位集成过程。 如果您在本教程的任何部分都觉得很难,请不要犹豫,在下面向我们提问!
对于寻求可靠解决方案的 Magento 商家,我们为您的企业提供完整且具有成本效益的 Magento PWA 解决方案。