Я нашел решение этой проблемы. 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 завершил свою инициализацию.
Итак, если вы столкнулись с этой проблемой, проверьте следующее:
- Вы используете последнюю версию PhoneGap, где решена эта проблема.
- Вы не пытаетесь использовать navigator.geolocation до того, как PhoneGap будет готов.