Вызов служб определения местоположения iPhone с PhoneGap запрашивает разрешение для URL-адреса для доступа к GPS, а не к приложению - PullRequest
1 голос
/ 25 февраля 2012

У меня есть приложение, которое использует PhoneGap (версия 1.4.1). Это не обычное приложение PhoneGap, так как оно было создано с использованием MonoTouch, а не Xcode. Библиотека PhoneGap загружается в IUWebView, а файл phonegap-1.4.1.js находится на удаленном сервере. Я могу вызывать функции в PhoneGap API, и все работает отлично; Единственная проблема, с которой я столкнулся - это API-интерфейс геолокации PhoneGap. Хотя геолокация работает, каждый раз при загрузке веб-страницы делается запрос на разрешение использовать службы определения местоположения iPhone, но он не запрашивает разрешение для имени моего приложения, он запрашивает разрешение для URL-адреса, где расположен источник страницы. Таким образом, в сообщении будет указано «http://xxx.xxx.xxx.xxx хотел бы использовать ваше текущее местоположение», и если пользователь ответит «Разрешить», iphone не запомнит этого, потому что при следующей перезагрузке страницы будет запрашиваться снова.

Кто-нибудь знает, почему мой вызов в API геолокации PhoneGap делает это? И есть ли какой-то способ заставить PhoneGap запросить разрешение для моего приложения на использование служб определения местоположения, а не URL-адреса?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Я нашел решение этой проблемы. PhoneGap выполняет замену всех функций UIWebView / MobileSafari navigator.geolocation своими собственными функциями, чтобы при вызове функции navigator.geolocation выполнялась соответствующая функция PhoneGap. Чтобы увидеть, где это происходит в исходном коде JavaScript, найдите следующую строку:

if (typeof navigator._geo == "undefined") 

Описание непосредственно под этой строкой описывает проблему, изложенную в этом вопросе, которую PhoneGap пытается избежать. Однако главная проблема заключалась в том, что я выполнял следующее в обработчике document.ready jquery:

navigator.geolocation.getCurrentPosition (onGpsSuccess, onGpsError, {enableHighAccuracy: true});

и на этом этапе выполнения инициализация PhoneGap еще не была завершена, поэтому вызов navigator.geolocation.getCurrentPosition вызвал MobileSafari версию getCurrentPosition, а не PhoneGap. Я определил, что инициализация не была завершена, поставив alert (navigator. _geo); в document.ready и обнаружил, что он вернул undefined .

Тогда было решено заменить строку кода в document.ready следующим текстом:

document.addEventListener("deviceready", function() {
    navigator.geolocation.getCurrentPosition(onGpsSuccess, onGpsError, { enableHighAccuracy: true });
}, false); 

Это гарантирует, что navigator.geolocation вызывается только тогда, когда PhoneGap завершил свою инициализацию.

Итак, если вы столкнулись с этой проблемой, проверьте следующее:

  1. Вы используете последнюю версию PhoneGap, где решена эта проблема.
  2. Вы не пытаетесь использовать navigator.geolocation до того, как PhoneGap будет готов.
0 голосов
/ 25 февраля 2012

Это потому, что PhoneGap использует WebViews.Как и в Safari, веб-просмотр может загружать любой URL-адрес, поэтому он должен запрашивать URL-адрес по отдельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...