当 Mac 设置(而非浏览器设置)拒绝位置共享时,HTML5 地理定位 API 会悄然失败

2024-03-28

我遇到了一个问题,如果我的 Mac 拒绝位置共享,那么 JS 代码中什么也不会发生...这很危险,无论如何要解决这个问题吗?如果系统拒绝位置共享,我预计会抛出异常

Running macOS Mojave 10.14.6并测试于Chrome 87.0.4280.88.

In System Preferences > Security & Privacy,你可以检查Enable Location Services然后检查允许的应用程序。如果我取消选中Enable Location Services完全或保持选中状态但取消选中Google Chrome,然后代码悄然失败*,我的意思是在下面的示例代码中没有任何内容记录到控制台。

Code:

$("#btn").click(function(e){
  e.preventDefault();
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(
      # success
      function(location) {
        console.log("GPS coordinates retrieved")
      }, 
      # failure
      function(error) {
        console.log(error.message)
      }
    )
  } else {
    console.log("GPS not supported by browser")
  }
})

是否有一种元方法可以捕获此问题(例如,确定 JS 的系统首选项中是否启用了位置),以便记录某些内容并且我可以继续代码中的后续步骤?

*代码悄悄地失败了,但从技术上讲,浏览器有办法提醒你,但只是第一次。所以基本上,假设您的浏览器没有阻止该 URL 并且您使用的是 HTTPS(例如,满足所有浏览器条件),您第一次单击#btn,你会得到原生弹出窗口navigator.geolocation.getCurrentPosition触发请求您的许可。现在,即使您单击允许,因为系统首选项不允许它,它也不会共享,代码不会记录任何内容。但至少这是你第一次看到正在发生的事情。在随后的点击中,浏览器或代码中实际上不会发生任何事情。再说一遍,我更关心代码,只是指出我承认浏览器会向您显示一些东西.


在某些浏览器上,您可以检查权限状态而不提示用户,如下所示:

const permissionStatus = await navigator.permissions.query({ name: 'geolocation' })

兼容性:http://caniuse.com/#feat=permissions-api http://caniuse.com/#feat=permissions-api

但请注意,这仅表示浏览器级别的权限。即使授予了此权限,操作系统等另一层仍然可以在链中稍后拒绝它。

鉴于navigator.geolocation.getCurrentPosition() 总是立即返回undefined https://w3c.github.io/geolocation-api/#getcurrentposition-method无论如何,处理这些情况你能做的最好的事情就是有一个timeout如果没有向浏览器提供响应,则强制在给定持续时间后调用错误回调。幸运的是,您可以通过通过轻松地做到这一点options作为函数的第三个参数。

const options = { timeout: 5000 }
navigator.geolocation.getCurrentPosition(successCb, errorCb, options)

在你的情况下:

$("#btn").click(function(e){
  e.preventDefault()

  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(
      // success
      function(location) {
        console.log("GPS coordinates retrieved")
      }, 
      // failure
      function(error) {
        console.log(error.message)
      },
      {
        timeout: 5000 // ms
      }
    )
  } else {
    console.log("GPS not supported by browser")
  }
})

鉴于W3C规范 https://w3c.github.io/geolocation-api/#getcurrentposition-method浏览器的详细信息must在成功/错误时调用回调函数,它不太可能被浏览器本身静音。如果没有提供超时,操作系统更有可能决定永远不响应,而不是拒绝访问,从而使函数无限期地处于挂起状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 Mac 设置(而非浏览器设置)拒绝位置共享时,HTML5 地理定位 API 会悄然失败 的相关文章

随机推荐