navigator.getCurrentPosition() not working in Fire

2019-08-28 14:58发布

问题:

I can't seem to get navigator.getLocation() working on either Firefox 65 or Safari 10

function getLocation(user_radius) {

var geo_options = {
enableHighAccuracy: true, 
maximumAge        : 30000, 
timeout           : 27000
};

function error(err) {
console.warn('Cannot load user location. Make sure you gave permission to share location');
}

document.body.style.position = "absolute";

if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {

        lat0 = position.coords.latitude;
        long0 = position.coords.longitude;
        corefunction(user_radius);
    },error,geo_options);
} else {
    x.innerHTML = "Geolocation is not supported by this browser.";
}
}

Although Firefox ask to access location while Safari doesn't, neither of them return latitude nor longitude. Firefox and Safari log:

*Cannot load user location. Make sure you gave.....*

what am I doing wrong?

Yes I gave permissions, and yes I have location services enabled in both. The code works fine in Opera, Chrome, IE and Edge...

The curious thing is that I canNOT get my location with those browser even with 3rd party pages:

https://www.w3schools.com/html/tryit.asp?filename=tryhtml5_geolocation https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API

UPDATE#1 I have tried Steven's suggestion to add navigator.permission;This is the snipplet I ve run just to test if it worked in Firefox.

   function handlePermission() {
  navigator.permissions.query({name:'geolocation'}).then(function(result) {
  if (result.state == 'granted') {
  report(result.state);
  geoBtn.style.display = 'none';
} else if (result.state == 'prompt') {
  report(result.state);
  geoBtn.style.display = 'none';
  navigator.geolocation.getCurrentPosition(function (position) {

        lat0 = position.coords.latitude;
        long0 = position.coords.longitude;

    },error,geo_options);
} else if (result.state == 'denied') {
  report(result.state);
  geoBtn.style.display = 'inline';
}
result.onchange = function() {
  report(result.state);
}
});
}

The console says "prompt" but getCurrentPosition() is not executed.

回答1:

Ok I found what was the problem and it was OSX and iOS. Firefox and Safari when running under those browsers needs location services habilitated from Finder->apple->System Preferences->Security & Privacy-> Privacy then add Firefox and Safari to the whitelist

For some reason, Chrome is setting itself into the whitelist after you accepted to share location on browser. The same for Opera.

Hence in a nutshell, the problem was Apple's privacy system which is a bit convoluted. Goods and bads I suppose