3

アプリケーションを適切に実行するために、Chrome パッケージ アプリの Web ビュー内で地理位置情報を取得しようとしています。manifest.json でアクセス許可を取得し、スクリプトを挿入する方法をいくつか試しましたが、機能せず、エラー メッセージも表示されません。

許可を得て地理位置情報を表示するためのライトまたは解決策を教えてもらえますか?

4

2 に答える 2

5

通常の Web ページで権限を必要とする一部の機能は、Web ビューでも使用できます。ただし、通常のポップアップ「Web サイト xyz.com があなたの物理的な場所を知りたがっています - 許可/拒否」の代わりに、Web ビューを含むアプリで明示的に承認する必要があります。仕組みは次のとおりです。

  • WebView 内の Web ページを変更する必要はありません。

  • アプリでは、要素の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();
  }
});

注意すべきことの 1 つは、リクエストをすぐに処理する必要がないことです。preventDefaultpermissionrequest イベントを呼び出して、イベント オブジェクトがガベージ コレクションされないようにする限り、許可または拒否する前に必要なことは何でも行うことができます。これは、パーミッションを要求する 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

もう少し詳しく:

Default()を防ぐ限り、すぐに応答する必要はありません。デフォルトのアクションは、許可要求を拒否することです。

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 に答える