3

我正在尝试在 Chrome 打包应用程序的 webview 中获取地理位置,以便正确运行我的应用程序。我尝试了几种方法来获取 manifest.json 中的权限和注入脚本,但它不起作用并且没有显示任何错误消息。

有人可以给我一盏灯或一个解决方案来获得许可并显示我的地理位置吗?

4

2 回答 2

5

在普通网页中通常需要权限的一些功能在 web 视图中也可用。但是,包含 webview 的应用程序需要明确授权,而不是正常的弹出窗口“xyz.com 网站想知道您的物理位置 - 允许/拒绝”。下面是它的工作原理:

  • 无需更改 webview 内的网页;

  • 在应用程序中,您侦听元素permissionrequest上的事件:<webview>

webview.addEventListener('permissionrequest', function(e) {
  if ( e.permission === 'geolocation' ) {
    e.request.allow();
  } else {
    console.log('Denied permission '+e.permission+' requested by webview');
    e.request.deny();
  }
});

需要注意的一件事是不需要立即处理请求。在允许或拒绝之前,您可以做任何您需要做的事情,只要您调用preventDefault权限请求事件并防止事件对象被垃圾收集。如果您需要执行任何异步操作,这很有用,例如去存储检查请求权限的 URL 是否应该被允许。

例如:

webview.addEventListener('permissionrequest', function(e) {
  if ( e.permission === 'geolocation' ) {
    // Calling e.preventDefault() is necessary to delay the response.
    // If the default is not prevented then the default action is to
    // deny the permission request.
    e.preventDefault();
    setTimeout(function() { decidePermission(e); }, 0);
  }
});

var decidePermission = function(e) {
  if (e.url == 'http://www.google.com') {
    e.request.allow();
  }
  // Calling e.request.deny() explicitly is not absolutely necessary because
  // the request object is managed by the Javascript garbage collector.
  // Once collected, the request will automatically be denied.
  // If you wish to deny immediately call e.request.deny();
}
  • 另请注意,您的应用还需要请求相应的权限:
"permissions": ["geolocation"],

webview 示例有更多用于其他权限的代码,例如pointerLock 和媒体捕获。

于 2013-04-30T15:02:27.450 回答
0

更详细一点:

只要您 preventDefault(),就不需要立即做出响应。默认操作是拒绝权限请求。

webview.addEventListener('permissionrequest', function(e) {
  if ( e.permission === 'geolocation' ) {
    // Calling e.preventDefault() is necessary to delay the response.
    // If the default is not prevented then the default action is to
    // deny the permission request.
    e.preventDefault();
    setTimeout(function() { decidePermission(e); }, 0);
  }
});

var decidePermission = function(e) {
  if (e.url == 'http://www.google.com') {
    e.request.allow();
  }
  // Calling e.request.deny() explicitly is not absolutely necessary because
  // the request object is managed by the Javascript garbage collector.
  // Once collected, the request will automatically be denied.
  // If you wish to deny immediately call e.request.deny();
}
于 2013-04-30T19:04:32.030 回答