有没有 Navigator.permissions.query 权限 API 的替代方案?

18

有没有其他方法来检查地理位置权限,而不是使用Permissions API中的navigator.permissions.query查询?因为该API仍然处于草案阶段并且兼容性较差。

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

问题在于,一旦用户在本机权限弹窗上执行操作并希望检查用户所采取的操作时,需要进行应用程序恢复

用于位置权限警报的混合 Cordova 应用程序回调

平台:移动 Android

注意:不希望使用cordova diagnostic plugin

示例:

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

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

});

在哪个平台上? - DaveAlden
@ShivKumarBaghel,你觉得使用 Cordova 自定义配置插件在 manifest xml 中添加权限如何?这样你就不需要检查它了。这个插件的作用不是检查权限,而是设置权限。 - Gandhi
抱歉 @甘地,我需要在获取用户位置之前征得用户的许可。 - Shiv Kumar Baghel
@ShivKumarBaghel 如果是这样的话,你将无法在没有 Cordova 插件的情况下检查权限,因为它需要与设备进行交互。 - Gandhi
@Gandhi navigator.permissions.query 是检查权限的可用解决方案。但它仍处于“工作草案”阶段,并且在移动浏览器中支持较少。因此正在寻找替代方案。 - Shiv Kumar Baghel
显示剩余5条评论
2个回答

9
你可以直接使用navigator.geolocation,无需先请求权限。它会自动弹出类似于navigator.permissions的位置询问提示。
navigator.geolocation.getCurrentPosition(
  (i)=>console.log('success',i),
  (i)=>console.log('failed',i)
)

navigator.permissions 不支持Safari和Edge浏览器,但是navigator.geolocation支持。因此,我认为只需执行地理位置而不检查权限是安全的,因为它也会首先引发提示权限。


4
想知道是否有一种方法可以知道用户之前是否已经允许了访问。我不想在解释为什么我要请求访问之前就直接询问他们。在某些情况下,用户的本能反应可能是拒绝访问。 - Philll_t
navigator.permissions现在在Edge中得到支持。 https://caniuse.com/?search=navigator.permissions - berniecc
有没有Safari的替代品? - ZecKa

3

我不这么认为。

此时,navigator.permissions对象未定义 - 可能出于目的在WebView中删除它,以避免将Web权限与Android权限混合。

选项1:

您可以尝试Cordova诊断插件,特别是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的回复。但问题是我无法使用“诊断插件”,因此我正在寻找其他解决方案。通过您的解决方案,如果我运行navigator.getCurrentPosition,则会出现权限本机对话框,应用程序将从“前台”进入“后台”,在“恢复”到应用程序后,我想检查用户在对话框上执行了什么操作。 - Shiv Kumar Baghel
你必须想出一些解决方法,因为正如我在这个答案中所指出的,权限 API 可能已经被设计者删除了。 - piotr_cz
1
根据W3C https://www.w3.org/TR/permissions/ 的说明,它仍处于“工作草案”阶段,因此一些浏览器支持,而一些则不支持。 - Shiv Kumar Baghel
好的,Chrome Mobile 69.0.3497.100有权限API,但是相同版本的_Android System WebView_没有。 - piotr_cz
是的,我有一个混合应用程序,将为不同的Android WebView提供服务。因此,希望找到一种解决方案,而不使用任何Cordova插件,例如Cordova diagnostic plugin之类的东西。 - Shiv Kumar Baghel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接