Chrome打包应用内的网页浏览中的地理位置

时间:2013-04-30 14:40:36

标签: google-chrome-app

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

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

2 个答案:

答案 0 :(得分:5)

在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();
  }
});

需要注意的一点是,请求不需要立即处理。只要您在permissionrequest事件中调用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 sample有更多代码用于其他权限,例如pointerLock和媒体捕获。

答案 1 :(得分: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();
}