Геолокация в веб-просмотре внутри упакованного приложения Chrome

Я пытаюсь получить геолокацию внутри веб-просмотра в упакованном приложении Chrome, чтобы правильно запустить мое приложение. Я пробовал несколько способов получить разрешение в manifest.json и внедрить скрипты, но это не работает и не показывает никаких сообщений об ошибках.

Может ли кто-нибудь дать мне свет или решение, чтобы получить разрешение и показать мою геолокацию?


person brunowindrop    schedule 30.04.2013    source источник


Ответы (2)


Некоторые функции, которые обычно требуют разрешений на обычной веб-странице, также доступны в веб-просмотре. Однако вместо обычного всплывающего окна «веб-сайт xyz.com хочет узнать ваше физическое местоположение — разрешить / запретить» приложение, содержащее веб-просмотр, должно явно разрешить его. Вот как это работает:

  • Нет необходимости менять веб-страницу внутри веб-просмотра;

  • В приложении вы прослушиваете события 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"],

В примере веб-просмотра больше код для других разрешений, таких как pointerLock и захват мультимедиа.

person mangini    schedule 30.04.2013
comment
ОБНОВЛЕНИЕ: добавлена ​​информация @user2296820 о задержке одобрения/отказа запроса на разрешение - person mangini; 01.05.2013
comment
Доброе утро! Mangini Я думал, что решил проблему с вашим кодом, но после того, как я опубликовал приложение для установки, некоторые из моих друзей не работали. Я понял, что работает только в хроме канарейка ... сделал некоторые тесты, чтобы заставить дисплей в обычном месте получить, но он не отображается вообще. Вы знаете, введите причину? Ссылка на интернет-магазин: chrome.google.com/webstore/detail/localizeime/ там вы можете найти файлы на github - person brunowindrop; 02.05.2013
comment
Он работает в Canary, но не в других браузерах? Какая версия другого браузера? Есть несколько улучшений в веб-просмотре на dev (chrome 27+), и запрос разрешения — одно из них. Вы не сможете запустить этот фрагмент в версиях Chrome ниже 27. - person mangini; 02.05.2013
comment
Моя версия хрома - стандартная версия 27.0.1453.73 beta-m и до сих пор не работает, канареечная версия работает отлично. - person brunowindrop; 03.05.2013
comment
Таким образом, вы, вероятно, используете функцию только для 28. Вы можете установить в своем манифесте поле Minimum_chrome_version: 28, поэтому люди не смогут установить его, если у них нет соответствующей версии Chrome. - person mangini; 09.05.2013

Немного подробнее:

Ответ не обязательно должен быть сделан немедленно, пока вы предотвращаете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();
}
person user2296820    schedule 30.04.2013
comment
Спасибо, я добавил это в свой ответ. - person mangini; 01.05.2013