【问题标题】:Is there any alternative to navigator.permissions.query Permissions API?navigator.permissions.query Permissions API 有什么替代方案吗?
【发布时间】:2019-03-17 23:28:52
【问题描述】:

navigator.permissions.query Permissions API 查询是否有任何替代方法来检查geolocation 权限。 导致它仍处于工作草案中,并且浏览器兼容性较差。

W3C 权限参考: https://www.w3.org/TR/permissions/

问题是app resume,一旦用户对本机权限弹出窗口执行操作,然后想要检查用户正在使用的action

Hybrid Cordova App callback for location permission alert

平台:移动安卓

注意:不想使用cordova diagnostic plugin

例子:

navigator.permissions.query({name:'geolocation'}).then(function(result) {

  console.log('result : ', result);

});

【问题讨论】:

标签: javascript html cordova google-maps-api-3 w3c-geolocation


【解决方案1】:

我不这么认为。

此时 navigator.permissions 对象未定义 - 可能是出于不将 Web 权限与 android 权限混合的目的而在 WebView 中将其删除。

选项 1:

您可以尝试Cordova diagnostic plugin,特别是getLocationAuthorizationStatus 方法,它应该以与Permissions API 非常相似的方式返回权限状态。 请注意我还没有尝试过这个插件。

选项 2:

通过请求位置触发位置权限对话框。 当您收到带有PERMISSION_DENIED 常量代码的PositionError 时,这意味着用户拒绝了位置权限(只是现在或在应用设置中)。

navigator.getCurrentPosition(
  function(position) { /** won't be executed for such short timeout */ },
  function(positionError) {
    switch (positionError.code) {
    // PERMISSION_DENIED
    case 1:
      console.log('Permission denied')
      break
    // POSITION_UNAVAILABLE
    case 2:
      console.log('Permission allowed, location disabled')
      break
    // TIMEOUT
    case 3:
      console.log('Permission allowed, timeout reached')
      break
    }
  },
  {timeout: 0}
)

【讨论】:

  • 感谢@piotr_cz 的回复。但问题是我不能使用diagnostic plugin 这就是我寻找其他解决方案的原因。通过您的解决方案,如果我正在运行navigator.getCurrentPosition,那么权限本机对话框即将到来,应用程序将从foregroundresume 之后进入background 到应用程序我想检查用户对对话框执行的操作。
  • 您必须采取一些解决方法,因为正如我在this answer 中指出的那样,权限 API 可能已被设计删除。
  • 根据 W3C w3.org/TR/permissions 它仍然在 Working Draft 所以有些浏览器支持有些不支持。
  • 嗯,Chrome Mobile 69.0.3497.100 有 Permissions API,但相同版本的 Android System WebView 没有。
  • 是的,我有混合应用程序,可以服务于不同的 android WebView。所以想要一个不使用任何cordova插件的解决方案,比如Cordova diagnostic plugin
【解决方案2】:

您可以直接使用navigator.geolocation,无需先获得许可。它会像navigator.permissions一样自动提出询问位置提示。

navigator.geolocation.getCurrentPosition(
  (i)=>console.log('success',i),
  (i)=>console.log('failed',i)
)

safari 和 edge 不支持navigator.permissions,但支持navigator.geolocation,所以我认为在不检查权限的情况下执行地理定位是安全的,因为它也会首先引发提示权限。

【讨论】:

  • 想知道是否有办法知道用户之前是否允许访问。在解释我为什么要请求它之前,我不只是想直截了当地问他们。在某些情况下,用户的本能就是拒绝它。
  • navigator.permissions 现在支持 edge caniuse.com/?search=navigator.permissions
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多