navigator.geolocation.getCurrentPosition terkadang berfungsi terkadang tidak

220

Jadi saya memiliki JS yang cukup sederhana menggunakan jammy navigator.geolocation.getCurrentPosition.

$(document).ready(function(){
  $("#business-locate, #people-locate").click(function() {
    navigator.geolocation.getCurrentPosition(foundLocation, noLocation);
  });

  navigator.geolocation.getCurrentPosition(foundLocation, noLocation);

  function foundLocation(position) {
    var lat = position.coords.latitude;
    var lon = position.coords.longitude;
    var userLocation = lat + ', ' + lon;
    $("#business-current-location, #people-current-location").remove();
    $("#Near-Me")
      .watermark("Current Location")
      .after("<input type='hidden' name='business-current-location' id='business-current-location' value='"+userLocation+"' />");
    $("#people-Near-Me")
      .watermark("Current Location")
      .after("<input type='hidden' name='people-current-location' id='people-current-location' value='"+userLocation+"' />");
  }
  function noLocation() {
    $("#Near-Me").watermark("Could not find location");
    $("#people-Near-Me").watermark("Could not find location");
  }
})//end DocReady

Pada dasarnya apa yang terjadi di sini adalah kita mendapatkan posisi saat ini, jika diperoleh, dua "tanda air" ditempatkan di dua bidang yang mengatakan "Posisi Saat Ini" dan dua bidang tersembunyi dibuat dengan data lat-panjang sebagai nilainya (mereka dihapus di awal sehingga mereka tidak terduplikasi setiap waktu). Ada juga dua tombol yang memiliki fungsi klik yang terikat padanya yang melakukan hal yang sama. Sayangnya, setiap sekitar tiga kali, ini berhasil. Apa masalahnya di sini ???

theassociatedweb
sumber
Mungkin mendefinisikan fungsi sebelum Anda menggunakannya.
tcooc
4
@digitalFresh, itu tidak masalah karena JS parser mencari deklarasi tersebut sebelum kode mulai dieksekusi
antimatter15
Apakah mungkin penggunaan jQuery di sana menyebabkan masalah?
theassociatedweb
1
Apa sebenarnya yang Anda maksud ketika Anda mengatakan itu kadang tidak berhasil? Apakah noLocationfungsinya dipanggil? Jika demikian, Anda dapat menambahkan errorparameter ke noLocation()dan kemudian error.codedan error.messagedapat membantu Anda dalam debugging. Mungkin juga membantu kami untuk mengetahui browser apa yang Anda gunakan dan jika Anda melihat masalah yang sama di browser yang berbeda.
npdoty
Maksud saya kadang-kadang itu memberi saya lat-lon, dan kadang-kadang tidak. ketika tidak berfungsi, bahkan tidak melempar pesan "tidak dapat menemukan lokasi" sehingga bit noLocation juga tidak diaktifkan.
theassassatedweb

Jawaban:

342

Saya telah mengalami masalah yang persis sama, dan hampir tidak ada informasi online tentang hal itu. Tidak ada sama sekali dalam buku. Akhirnya saya menemukan permintaan sederhana ini di stackoverflow dan (ha!) Itu adalah dorongan terakhir yang saya perlukan untuk membuat akun di sini.

Dan saya punya jawaban parsial, tetapi sayangnya tidak lengkap.

Pertama-tama, sadari bahwa batas waktu default untuk getCurrentPosition tidak terbatas (!). Itu berarti penangan kesalahan Anda tidak akan pernah dipanggil jika getCurrentPosition hang di suatu tempat di bagian belakang.

Untuk memastikan Anda mendapatkan batas waktu, tambahkan parameter ketiga opsional ke panggilan Anda ke getCurrentPosition, misalnya, jika Anda ingin pengguna menunggu tidak lebih dari 10 detik sebelum memberi mereka petunjuk tentang apa yang terjadi, gunakan:

navigator.geolocation.getCurrentPosition(successCallback,errorCallback,{timeout:10000});

Kedua, saya telah mengalami keandalan yang sangat berbeda dalam konteks yang berbeda. Di sini di rumah, saya mendapat panggilan balik dalam satu atau dua detik, meskipun akurasinya buruk.

Namun di tempat kerja, saya mengalami variasi perilaku yang cukup aneh: Geolokasi bekerja di beberapa komputer sepanjang waktu (kecuali IE, tentu saja), yang lain hanya bekerja di chrome dan safari tetapi tidak firefox (masalah tokek?), Yang lain berfungsi satu kali, lalu selanjutnya gagal - dan polanya berubah dari jam ke jam, dari hari ke hari. Terkadang Anda memiliki komputer yang 'beruntung', terkadang tidak. Mungkin menyembelih kambing di bulan purnama akan membantu?

Saya belum dapat memahami hal ini, tetapi saya menduga bahwa infrastruktur back end lebih tidak merata daripada yang diiklankan di berbagai buku dan situs web gung-ho yang mendorong fitur ini. Saya benar-benar berharap bahwa mereka akan sedikit lebih lurus tentang betapa serpihan fitur ini, dan betapa pentingnya pengaturan batas waktu itu, jika Anda ingin penangan kesalahan Anda berfungsi dengan baik .

Saya telah mencoba untuk mengajarkan hal ini kepada siswa hari ini, dan memiliki situasi yang memalukan di mana komputer saya sendiri (pada proyektor dan beberapa layar besar) gagal diam-diam, sedangkan sekitar 80% siswa mendapatkan hasil hampir secara instan (menggunakan jaringan nirkabel yang sama persis). Sangat sulit untuk menyelesaikan masalah ini ketika siswa saya juga membuat kesalahan ketik dan gangguan lainnya, dan ketika komputer saya sendiri juga gagal.

Bagaimanapun, saya harap ini membantu beberapa dari kalian. Terima kasih untuk cek kewarasannya!

brennanyoung
sumber
5
Info detail yang bagus, terima kasih! Saya melihat masalah yang sama, tetapi hanya di Firefox 3.6.13. Chrome tampaknya cukup andal.
Felipe Lima
Sama di sini, dan parameter maksimumAge juga tampaknya tidak dapat diandalkan. Terima kasih untuk kirimannya.
Richard
1
Yang bagus, saya punya masalah yang sama (pada Samsung Galaxy Tab, 10.1, menjalankan Android 4.0.3 ), begitu saya menggunakan param batas waktu di atas, saya bisa menangani masalah tersebut.
mlo55
9
Sangat penting untuk memahami apa timeoutpilihan getCurrentPosition()sebenarnya waktu. Ini tidak mengatur waktu pengguna untuk mengizinkan atau menolak permintaan geolokasi, tetapi berapa lama jaringan diizinkan untuk mengembalikan lokasi begitu izin diberikan. Jika pengguna tidak menjawab permintaan geolokasi, penangan kesalahan tidak akan pernah dipanggil. Dengan demikian, Anda memerlukan batas waktu kedua seperti pada jawaban @ xiaohouzi79.
François
2
menyembelih kambing di bulan purnama akan membantu? LOL
Asim KT
66

Ini adalah cara peretasan yang saya lakukan, setidaknya ini bekerja di semua browser saat ini (di Windows, saya tidak memiliki Mac):

if (navigator.geolocation) {
    var location_timeout = setTimeout("geolocFail()", 10000);

    navigator.geolocation.getCurrentPosition(function(position) {
        clearTimeout(location_timeout);

        var lat = position.coords.latitude;
        var lng = position.coords.longitude;

        geocodeLatLng(lat, lng);
    }, function(error) {
        clearTimeout(location_timeout);
        geolocFail();
    });
} else {
    // Fallback for no geolocation
    geolocFail();
}

Ini juga akan berfungsi jika seseorang mengklik tutup atau memilih tidak atau memilih opsi Jangan Bagikan di Firefox.

Kikuk, tapi berhasil.

pergi
sumber
1
+1 Tapi Anda kehilangan geolocFail();penangan kesalahan dan getcodeLatLng();geo coder.
kaiser
Manis - timer berfungsi dengan baik jika seseorang memilih untuk tidak membagikan lokasi. Beberapa browser tidak berfungsi dengan baik ketika pengguna melakukan ini. Penanganan waktu ini bekerja sangat baik pada Plugin Store Locator Plus WP saya!
Lance Cleveland
2
@sajith - Tidak yakin apakah solusi ini sudah usang dengan peramban FF terbaru. Ini berfungsi pada saat saya memberikan solusi karena saya membutuhkannya untuk situs yang sedang saya kerjakan. Sudahkah Anda menguji?
pergi
maaf, itu berhasil. Tetapi saya tidak dapat menemukan apa yang membuatnya bekerja. Setelah menutup dan membuka kembali FF-nya berfungsi ........ daripada untuk solusi Anda ....
sajith
1
Anda seharusnya tidak menggunakan fungsi di dalam string. Evil Eval bekerja di sana dengan tidak sopan. setTimeout ("geolocFail ()", 10000);
atilkan
42

Ini bekerja untuk saya setiap saat:

navigator.geolocation.getCurrentPosition(getCoor, errorCoor, {maximumAge:60000, timeout:5000, enableHighAccuracy:true});

Padahal itu tidak terlalu akurat. Yang lucu adalah bahwa pada perangkat yang sama jika saya menjalankannya, ini membuat saya berhenti sekitar 100 meter (setiap kali), tetapi jika saya pergi ke peta google, ia menemukan lokasi saya dengan tepat. Jadi walaupun saya pikir mengaktifkanHighAccuracy: true membantu untuk bekerja secara konsisten, sepertinya tidak membuatnya lebih akurat ...

K'shin Gendron
sumber
Ini telah menghentikan firefox dari menolak permintaan dan mengirim kembali objek batas waktu.
tony
100 meter jauhnya adalah menara sel tempat saya terikat. Jadi itu mengembalikan lokasi menara sel, bukan ponsel saya. Mungkin lebih akurat jika saya berada di luar untuk menendang gps.
K'shin Gendron
9
Itu terus membuat Anda turun beberapa meter karena Anda memiliki paremeter maksimumAge diatur ke 60 detik. Jadi itu menempatkan lokasi Anda di mana Anda berada pada 60 detik yang lalu. Setel maksimumAge menjadi 10 detik atau kurang (maksimumAge: 10000) dan coba lagi.
Robert Smith
Saya menggunakan getCurrentPosition ini dalam Angular Resolver yang mengembalikan Observable. Penyelesai hanya selesai sebentar-sebentar. Menambahkan opsi ini: {maximumAge: 60000, batas waktu: 5000, enableHighAccuracy: true} membuatnya berfungsi setiap kali !!!
Moutono
17

Ini sudah merupakan pertanyaan lama, tetapi semua jawaban tidak menyelesaikan masalah saya, jadi mari kita tambahkan yang akhirnya saya temukan. Baunya seperti retas (dan itu satu), tetapi berfungsi selalu dalam situasi saya. Berharap dalam situasi Anda juga.

//Dummy one, which will result in a working next statement.
navigator.geolocation.getCurrentPosition(function () {}, function () {}, {});
//The working next statement.
navigator.geolocation.getCurrentPosition(function (position) {
    //Your code here
}, function (e) {
    //Your error handling here
}, {
    enableHighAccuracy: true
});
Niels Steenbeek
sumber
3
Itu adalah retasan yang paling rumit, dan saya tidak tahu bagaimana Anda berpikir untuk mencobanya, tetapi itu memecahkan masalah saya. Terima kasih!
Brett Gregson
Saya telah menggunakan ini sendiri dalam beberapa kasus. Upaya kedua selalu bekerja lebih baik dalam pengalaman saya
Nico Westerdale
13

Sama di sini orang, ini berfungsi dengan baik di Chrome (stabil, dev, dan kenari) tidak hanya di FF dan Safari. Ini juga berfungsi sempurna di iPhone dan iPad saya (Safari!). Ini mungkin karena kebaruan relatif dari fitur ini (yaitu bug). Saya menghabiskan hampir satu minggu untuk ini sekarang dan saya tidak bisa membuatnya bekerja di browser tersebut

Inilah yang saya temukan:

Pertama kali Anda memanggil getCurrentPosition berfungsi dengan sempurna. Setiap panggilan berikutnya tidak pernah kembali, artinya tidak mengaktifkan fungsi successCallback atau errorCallback. Saya menambahkan beberapa opsi posisi ke panggilan saya untuk membuktikan maksud saya:

 navigator.geolocation.getCurrentPosition(successCallback, errorCallback,  {timeout: 10000});

dan waktu habis setiap kali (setelah panggilan pertama yang berhasil). Saya pikir saya bisa memperbaikinya dengan maksimumAge, tetapi itu tampaknya tidak berfungsi karena seharusnya berfungsi baik:

navigator.geolocation.getCurrentPosition(successCallback, errorCallback,  {maximumAge:60000, timeout: 2000});

ini seharusnya mencegah sebenarnya memanggil fungsi getCurrentPosition jika Anda memanggilnya dalam waktu 60 detik, tetapi mengabaikan ini (namun, ini bisa disebabkan karena saya benar-benar menyegarkan halaman saya untuk memicu panggilan kedua, tidak yakin apakah ini persisten dengan panggilan)

btw, bahkan contoh google gagal pada browser ini yang membuat saya percaya bahwa ini memang bug browser, coba, muat dua kali di Safari dan itu tidak akan bekerja untuk yang kedua kalinya.

Jika ada yang menemukan solusi untuk ini, TOLONG beritahu saya :-)

Bersulang.

mvilrokx
sumber
Saya memiliki masalah persis seperti milik Anda, ini berfungsi untuk panggilan pertama tetapi tidak pernah untuk yang berikutnya, jika ada yang menemukan solusi saya akan sangat intersted ... @ xiaohouzi79 solusi Anda berakhir setiap waktu (kecuali untuk yang pertama) di geolocFail ( )
Adriano Rizzo
8

Anda tidak mendapatkan pesan kesalahan karena tidak memiliki batas waktu secara default (Setidaknya saya pikir). Saya memiliki masalah yang sama dengan firefox hanya untuk saya firefox selalu memberikan batas waktu. Anda dapat mengatur batas waktu sendiri seperti ini.

Fungsi saya berfungsi dengan baik di chrome tetapi saya mendapatkan waktu habis setiap kali di firefox.

    navigator.geolocation.getCurrentPosition(
        function(position) {
            //do succes handling
        },
        function errorCallback(error) {
            //do error handling
        },
        {
            timeout:5000
        }
    );

Saya sarankan untuk memperhatikan kesalahan Anda dengan cermat. Diharapkan untuk semuanya. Miliki rencana cadangan untuk semuanya. Saya menggunakan beberapa nilai atau nilai default dari database saya sendiri jika geolokasi google dan geolokasi navigator gagal.

Mark Baijens
sumber
7
hanya FYI, maksimumAge merujuk pada usia data lokasi dalam cache, mengaturnya menjadi jaminan tanpa batas Anda akan mendapatkan versi cache. Mengaturnya ke 0 memaksa perangkat untuk mengambil posisi.
Porco
downvoted karena maksimumAge: Infinity akan mengacaukan Anda seperti yang ditunjukkan di atas itu berarti memaksa menggunakan nilai cache.
n13
7

Saya masih mendapatkan hasil yang buruk di tahun 2017, dan saya punya teori: dokumentasi API mengatakan bahwa panggilan sekarang hanya tersedia "dalam konteks yang aman", yaitu melalui HTTPS. Saya mengalami kesulitan mendapatkan hasil di lingkungan pengembangan saya (http di localhost) dan saya percaya ini sebabnya.

Pembuat kode
sumber
Hmm menarik. Bahkan pada tahun 2020 masih terkelupas dengan HTTPS di localhost!
NitroStoutPlz
6

Saya akan memposting ini di sini jika berguna bagi siapa pun ...

Di iOS Safari, panggilan ke navigator.geolocation.getCurrentPositionakan habis jika saya navigator.geolocation.watchPositionmenjalankan fungsi aktif .

Memulai dan menghentikan penggunaan watchPositiondengan benar clearWatch() seperti yang dijelaskan di sini, berhasil: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition

JoLoCo
sumber
1
Terima kasih banyak. Ini solusi untuk saya.
Qin Zhengquan
5

di sini adalah solusi saya berkat penutupan:

  function geoloc(success, fail){
    var is_echo = false;
    if(navigator && navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(
        function(pos) {
          if (is_echo){ return; }
          is_echo = true;
          success(pos.coords.latitude,pos.coords.longitude);
        }, 
        function() {
          if (is_echo){ return; }
          is_echo = true;
          fail();
        }
      );
    } else {
      fail();
    }
  }

  function success(lat, lng){
    alert(lat + " , " + lng);
  }
  function fail(){
    alert("failed");
  }

  geoloc(success, fail);
jbdemonte
sumber
Ini bekerja untuk saya dalam bahasa asli navigator && navigator.geolocation
Ashish Singh Rawat
5

Jadi saya mengalami hal yang sama. Saya mencoba solusi batas waktu yang berhasil tetapi tidak andal. Saya menemukan bahwa jika Anda hanya memanggilnya dua kali, lokasi di-refresh dengan benar

function getLocation(callback)
{   
    if(navigator.geolocation)
    {
        navigator.geolocation.getCurrentPosition(function(position)
        {
            navigator.geolocation.getCurrentPosition(callback, function(){},{maximumAge:0, timeout:10000});
        },function(){}, {maximumAge:0, timeout:10000});
    }
    return true;
}

ini tentu saja sedikit lebih lambat tetapi saya belum pernah memberi saya posisi yang salah sekali. Saya telah mencapai batas waktu beberapa kali dan tidak mengembalikan apa pun selain itu berfungsi dengan baik. Saya tahu ini masih sedikit meretas dan saya menantikan seseorang menemukan solusi nyata.

Atau jika Anda ingin memastikan itu akan terus mencoba sampai Anda ingin menyerah, Anda bisa mencoba sesuatu seperti ini.

//example
$(document).ready(function(){
    getLocation(function(position){
        //do something cool with position
        console.log(position);
    });
});


var GPSTimeout = 10; //init global var NOTE: I noticed that 10 gives me the quickest result but play around with this number to your own liking


//function to be called where you want the location with the callback(position)
function getLocation(callback)
{   
    if(navigator.geolocation)
    {
        var clickedTime = (new Date()).getTime(); //get the current time
        GPSTimeout = 10; //reset the timeout just in case you call it more then once
        ensurePosition(callback, clickedTime); //call recursive function to get position
    }
    return true;
}

//recursive position function
function ensurePosition(callback, timestamp)
{
    if(GPSTimeout < 6000)//set at what point you want to just give up
    {
        //call the geolocation function
        navigator.geolocation.getCurrentPosition(
            function(position) //on success
        {
                //if the timestamp that is returned minus the time that was set when called is greater then 0 the position is up to date
            if(position.timestamp - timestamp >= 0)
                {
                    GPSTimeout = 10; //reset timeout just in case
                    callback(position); //call the callback function you created
                }
                else //the gps that was returned is not current and needs to be refreshed
                {
                    GPSTimeout += GPSTimeout; //increase the timeout by itself n*2
                    ensurePosition(callback, timestamp); //call itself to refresh
                }
            },
            function() //error: gps failed so we will try again
            {
                GPSTimeout += GPSTimeout; //increase the timeout by itself n*2
                ensurePosition(callback, timestamp);//call itself to try again
            },
            {maximumAge:0, timeout:GPSTimeout}
        )
    }       
}

Saya mungkin memiliki beberapa kesalahan ketik dan beberapa kesalahan ejaan di sini tapi saya harap Anda mendapatkan ide. Beritahu saya jika ada yang punya pertanyaan atau seseorang menemukan sesuatu yang lebih baik.

Drew Calder
sumber
4

Bagi siapa pun yang bekerja di aplikasi iPhone ...

Jika kode Anda berjalan di UIWebView di iOS 9+, maka Anda harus mengatur NSLocationWhenInUseUsageDescription dalam daftar aplikasi Anda.

Jika Anda tidak mengaturnya maka getCurrentPositiontidak akan pernah menelepon kembali dan pengguna tidak akan pernah diminta.

bendytree
sumber
3

Saya menemukan, bahwa cara ini tidak berhasil

navigator.geolocation.getCurrentPosition(function() {...}, function(err) {...}, {});

Tapi

cara ini berfungsi sempurna

function storeCoordinates(position) {
    console.log(position.coords.latitude, position.coords.longitude);
}    

function errorHandler() {...}

navigator.geolocation.getCurrentPosition(storeCoordinates, errorHandler, { enableHighAccuracy: true, timeout: 20000, maximumAge: 0 });
1 naluri
sumber
4
Apa perbedaan keduanya?
Pardeep Jain
Fungsi anonim vs bernama satu
1
perbedaan yang sangat besar. terima kasih, ini juga tidak berfungsi
tanpa satu
3

@ brennanyoung jawaban bagus, tetapi jika Anda bertanya-tanya apa yang harus dilakukan dalam kasus kegagalan Anda dapat menggunakan API geolokasi IP seperti https://ipinfo.io (yang merupakan layanan saya). Ini sebuah contoh:

function do_something(coords) {
    // Do something with the coords here
    // eg. show the user on a map, or customize
    // the site contents somehow
}

navigator.geolocation.getCurrentPosition(function(position) { 
    do_something(position.coords);
    },
    function(failure) {
        $.getJSON('https://ipinfo.io/geo', function(response) { 
        var loc = response.loc.split(',');
        var coords = {
            latitude: loc[0],
            longitude: loc[1]
        };
        do_something(coords);
        });  
    };
});

Lihat https://ipinfo.io/developers/replacing-getcurrentposition untuk lebih jelasnya.

Ben Dowling
sumber
Inilah tautan yang diperbaiki untuk ini: ipinfo.io/developers/replacing-getcurrentposition
peater
5
Mengerikan. Akurasinya seperti 5-7 mil jauhnya dari posisi sebenarnya ketika di AS dan Kanada dan 100 mil jauhnya ketika di suatu tempat di Rusia.
ekashking
1
Untuk banyak aplikasi yang baik - dan jauh lebih baik daripada tidak tahu apa lokasinya.
Ben Dowling
ini tidak berfungsi di mana saja. Setiap permintaan mendapatkan garis bujur dan lintang sebagai salah
tanpa satu
Apa yang Anda maksud dengan salah? Apakah Anda punya beberapa contoh?
Ben Dowling
2

Saya telah mengalami masalah serupa, dan telah mencari kemungkinan bahwa browser memiliki batasan seberapa sering getCurrentPosition dapat dipanggil. Sepertinya saya sering mendapatkan lokasi, tetapi jika saya langsung menyegarkan halaman, waktu akan habis. Jika saya menunggu sebentar, saya biasanya bisa mendapatkan lokasi lagi. Ini biasanya terjadi dengan FF. Di Chrome dan Safari, saya belum melihat waktu getCurrentPosition keluar. Hanya pemikiran saja...

Meskipun saya tidak dapat menemukan dokumentasi untuk mendukung ini, itu adalah kesimpulan yang saya dapatkan setelah banyak pengujian. Mungkin orang lain punya info tentang itu?

pembuat bir
sumber
Itu poin yang bagus. Waktu habis / gagal saya tampaknya terjadi terutama saat saya menguji dan berulang kali menanyakan data geolokasi. Saya ingin tahu apakah ini adalah hasil dari bug atau, seperti yang Anda sarankan, mungkin oleh desain.
Jamie
Saya belum melihat kasus di mana browser membatasi jumlah panggilan ke layanan lokasi. Seberapa sering Anda bertanya?
Nico Westerdale
2

Saya akhirnya menemukan versi yang berfungsi untuk firefox, chrome & navigator default di android (hanya 4.2 yang diuji):

function getGeoLocation() {
        var options = null;
        if (navigator.geolocation) {
            if (browserChrome) //set this var looking for Chrome un user-agent header
                options={enableHighAccuracy: false, maximumAge: 15000, timeout: 30000};
            else
                options={maximumAge:Infinity, timeout:0};
            navigator.geolocation.getCurrentPosition(getGeoLocationCallback,
                    getGeoLocationErrorCallback,
                   options);
        }
    }
surfealokesea
sumber
2

Parameter kedua yang diteruskan Geolocation.getCurrentPosition()adalah fungsi yang ingin Anda tangani kesalahan geolokasi. Fungsi pengendali kesalahan itu sendiri menerima PositionErrorobjek dengan detail tentang mengapa upaya geolokasi gagal. Saya sarankan mengeluarkan kesalahan ke konsol jika Anda memiliki masalah:

var positionOptions = { timeout: 10000 };
navigator.geolocation.getCurrentPosition(updateLocation, errorHandler, positionOptions);
function updateLocation(position) {
  // The geolocation succeeded, and the position is available
}
function errorHandler(positionError) {
  if (window.console) {
    console.log(positionError);
  }
}

Melakukan hal ini dalam kode saya mengungkapkan pesan "Penyedia lokasi jaringan di ' https://www.googleapis.com/ ': Returned error code 400". Ternyata Google Chrome menggunakan Google API untuk mendapatkan lokasi di perangkat yang tidak memiliki GPS bawaan (misalnya, sebagian besar komputer desktop). Google mengembalikan perkiraan lintang / bujur berdasarkan alamat IP pengguna. Namun , di build pengembang Chrome (seperti Chromium di Ubuntu) tidak ada kunci akses API yang disertakan dalam build browser. Ini menyebabkan permintaan API gagal secara diam-diam. Lihat Chromium Issue 179686: Geolokasi yang memberikan 403 kesalahan untuk detailnya.

orang ketiga
sumber
1

Saya memiliki masalah ini di Mozilla. Semua waktu: Kesalahan: Kesalahan saat mendapatkan posisi .

Sekarang saya menggunakan 47 Mozilla. Saya sudah mencoba segalanya, tetapi sepanjang waktu masalah ini. TAPI kemudian saya buka tentang: config di bilah alamat saya, buka geo.wifi.ui dan ubah nilainya menjadi " https://location.services.mozilla.com/v1/geolocate?key=test ". bekerja!

Jika Anda memiliki kesalahan batas waktu Pengambilan posisi , cobalah untuk meningkatkan nilai batas waktu:

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0       
};
navigator.geolocation.getCurrentPosition(success, error, options);
Vasyl Gutnyk
sumber
1

Mungkin ide yang baik untuk menggunakan layanan lokasi geografis alamat IP sebagai metode mundur ketika getCurrentPositiongagal. Misalnya dengan api kami https://ip-api.io

$.getJSON("http://ip-api.io/json/",
    function(result) {
        console.log(result);
    });
Andrey E
sumber
1

Dalam kasus kami selalu berfungsi pertama kali tetapi menjalankan kembali fungsi lebih dari 3-4 kali, gagal.

Solusi sederhana: Simpan nilainya di LocalStorage.

Sebelum:

navigator.geolocation.getCurrentPosition((position) => {
  let val = results[0].address_components[2].long_name;
  doSthWithVal(val);      
}, (error) => { });

Setelah:

if(localStorage.getItem('getCurrentPosition') !== null) {
  doSthWithVal(localStorage.getItem('getCurrentPosition'));
}
else {
  navigator.geolocation.getCurrentPosition((position) => {
      let val = results[0].address_components[2].long_name;
      localStorage.setItem('getCurrentPosition',val);
      doSthWithVal(val);      
  }, (error) => { });
}
David Vielhuber
sumber
0

Saya memperhatikan masalah ini baru-baru ini sendiri, dan saya tidak yakin bagaimana masalah itu muncul tetapi kadang-kadang firefox terjebak pada sesuatu yang dimuat dalam cache. Setelah mengosongkan cache dan me-restart firefox tampaknya berfungsi lagi.

Assimilater
sumber
0

Pustaka ini menambahkan opsi Akurasi dan maxWait yang dikehendaki untuk panggilan geolokasi, yang berarti akan terus berusaha mendapatkan posisi sampai keakuratannya dalam kisaran yang ditentukan.

Mike McKay
sumber
0

Terima kasih kepada semua orang atas masukan mereka, ini membantu saya.

Selain harus menggunakan watchPosition () alih-alih getCurrentPosition (), saya juga menemukan bahwa saya perlu memindahkan panggilan dari dalam document.ready () ke kepala.

pengguna2217751
sumber
0

Ini terjadi pada saya ketika menggunakan mode desain responsif Firefox. Telah ada laporan bug yang diajukan. Untuk saat ini, jangan gunakan mode desain responsif saat menggunakan Geolokasi API.

Robert Moore
sumber
0

Mungkin itu membantu seseorang, Di Android saya punya masalah yang sama tetapi saya mengetahuinya dengan menggunakan setTimeout di dalam document.ready jadi itu bekerja untuk saya kedua Anda harus meningkatkan batas waktu hanya memetikan jika pengguna mengizinkan lokasinya setelah beberapa detik, jadi saya menyimpannya ke 60000 mili detik (1 menit) memungkinkan fungsi kesuksesan saya untuk memanggil jika pengguna mengklik tombol allow dalam 1 menit.

Sybghatallah Marwat
sumber