IT

navigator.geolocation.getCurrentPosition이 작동하지 않을 수 있음

itgroup 2022. 12. 27. 21:14
반응형

navigator.geolocation.getCurrentPosition이 작동하지 않을 수 있음

navigator.geolocation.getCurrentPosition jammy를 사용하여 JS를 간단하게 만들 수 있습니다.

$(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

기본적으로 현재 위치를 얻으면 두 개의 "워터마크"가 "현재 위치"라고 하는 두 개의 필드에 배치되고 위도 긴 데이터를 값으로 하여 두 개의 숨겨진 필드가 생성됩니다(처음에는 삭제되므로 매번 중복되지 않습니다).같은 기능을 하는 클릭 기능이 있는 버튼도 2개 있습니다.불행히도 3회 정도마다 효과가 있습니다.여기 뭐가 문제죠?

저도 똑같은 문제를 겪고 있는데, 온라인에서는 거의 정보를 찾을 수 없어요.책에는 아무것도 없어요.마침내 스택오버플로우에 대한 이 냉정한 쿼리를 발견했고, (하!) 여기서 계정을 설정하는데 필요한 마지막 자극제가 되었습니다.

그리고 나는 부분적인 답을 가지고 있지만, 안타깝게도 완전한 답은 아니다.

먼저 getCurrentPosition의 기본 타임아웃은 infinite(!)을 확인합니다.즉, getCurrentPosition이 백엔드의 어딘가에 걸려 있는 경우 오류 핸들러가 호출되지 않습니다.

타임아웃을 확실하게 하려면 getCurrentPosition 콜에 옵션의 세 번째 파라미터를 추가합니다.예를 들어 사용자가 10초 이상 기다리지 않고 무슨 일이 일어나고 있는지 알려면 다음 명령을 사용합니다.

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

둘째, 다양한 맥락에서 상당히 다른 신뢰성을 경험했습니다.여기 집에서는 정확도는 떨어지지만 1~2초 안에 콜백을 받습니다.

하지만 직장에서는 상당히 기괴한 행동 변화를 경험합니다.지리 로케이션은, 일부의 컴퓨터(물론, IE 제외), 다른 컴퓨터에서는 크롬과 사파리에서만 동작합니다만, 파이어폭스(geko 문제)에서는 동작하지 않는 컴퓨터도 있습니다.또, 1회 동작한 후, 장해가 발생하는 경우도 있습니다.패턴이 매시간, 매일 변화합니다.'운 좋은' 컴퓨터가 있을 때도 있고 없을 때도 있습니다.보름달에 염소를 도살하는 게 도움이 될까?

나는 이것을 헤아릴 수 없었지만, 이 기능을 추진하는 다양한 궁호 서적이나 웹사이트에서 광고된 것보다 백엔드 인프라가 더 고르지 않다고 생각한다.에러 핸들러를 올바르게 동작시키고 싶다면, 이 기능의 중요성과 타임 아웃 설정의 중요성에 대해 좀 더 솔직하게 설명해 주었으면 합니다.

저는 오늘 학생들에게 이런 것들을 가르치려고 노력했습니다.그리고 제 컴퓨터(프로젝터 및 여러 대형 화면)가 소리 없이 고장나는 난처한 상황을 겪었습니다.반면 약 80%의 학생이 거의 즉시(똑같은 무선 네트워크를 사용하여) 결과를 얻고 있었습니다.제 학생들도 오타나 다른 실수를 하고, 제 PC도 고장이 나면 이러한 문제를 해결하는 것은 매우 어렵습니다.

어쨌든, 이게 너희들에게 도움이 되었으면 좋겠어.건전성 체크 고마워요!

적어도 현재의 모든 브라우저에서는 동작합니다(Windows에서는 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();
}

Firefox에서 닫기를 클릭하거나 아니요를 선택하거나 공유 안 함 옵션을 선택한 경우에도 이 기능이 작동합니다.

투박하지만, 효과가 있어요.

이 기능은 매번 유효합니다.

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

정확하지는 않지만.재미있는 것은, 같은 디바이스로 실행하면, 100미터 정도(매회) 떨어져 버립니다만, Google의 지도에 액세스 하면, 제 위치가 정확하게 표시됩니다.제 생각에 이네이블은고정밀: true는 일관되게 동작하는데 도움이 됩니다.정확하게 동작하는 것 같지는 않습니다.

이것은 이미 오래된 질문이지만, 모든 답변이 문제를 해결하지 못했기 때문에, 마지막으로 찾은 질문을 추가해 봅시다.냄새는 날 것 같지만(그것은 하나이지만) 제 상황에서는 항상 효과가 있습니다.당신 처지에서도 희망을 가져요.

//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
});

여기에서도 마찬가지로 크롬(안정, 개발, 카나리아)에서는 FF나 Safari에서는 동작하지 않습니다.iPhone이나 iPad(Safari!)에서도 완벽하게 동작합니다.이것은, 이 기능의 비교적 새로운 기능(즉, 버그)에 의한 것일 가능성이 있습니다.지금 거의 일주일 동안 이 작업을 하고 있는데 브라우저에서는 작동하지 않습니다.

제가 찾은 건 다음과 같습니다.

getCurrentPosition을 처음 호출하면 완벽하게 작동합니다.후속 콜은 반환되지 않습니다.즉, success Callback 또는 error Callback 함수는 실행되지 않습니다.제 요점을 증명하기 위해 상담에 몇 가지 포지션 옵션을 추가했습니다.

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

(첫 번째 콜이 성공한 후) 매번 타임아웃 됩니다.maximum Age로 수정할 수 있을 것 같았는데, 이것도 정상적으로 동작하지 않는 것 같습니다.

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

60초 이내에 호출하면 실제로 getCurrentPosition 함수를 호출하는 것을 막을 수 있지만 무시됩니다(다만, 실제로는 페이지를 갱신하고, 2번째 콜을 트리거하기 때문에, 이것이 콜간에 영속적인 콜인지 아닌지는 불명확합니다).

그런데 이 브라우저에서는 구글의 예도 실패하기 때문에 이것이 브라우저 버그라고 믿고 시도해보고 Safari에 두 번 로드하면 두 번 다시 작동하지 않습니다.

이에 대한 해결책을 찾는 사람이 있으면 알려주세요:-)

건배.

디폴트로는 타임아웃이 없기 때문에 에러 메시지는 표시되지 않습니다(적어도 제 생각에는).파이어폭스에서도 같은 문제가 있었습니다만, 파이어폭스는 항상 타임 아웃이 됩니다.이렇게 타임아웃을 직접 설정할 수 있습니다.

제 기능은 크롬에서는 잘 작동하지만 파이어폭스에서는 매번 타임아웃이 발생합니다.

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

오류를 주의 깊게 관찰할 것을 권장합니다.모든 것을 기대하다.모든 것에 대한 백업 계획을 세우세요.Google Geolocations와 Navigator Geolocations가 모두 실패할 경우에 대비하여 데이터베이스에서 일부 기본값 또는 값을 사용합니다.

저는 2017년에도 여전히 불확실한 결과를 얻고 있습니다.API 문서에는 현재 HTTPS를 통해 콜을 이용할 수 있다고 되어 있습니다.개발 환경(localhost의 http)에서 결과를 얻을 수 없는 것이 그 이유라고 생각합니다.

누구에게나 도움이 될 수 있도록, 여기에 투고하겠습니다.

Safari 、 iOS Safari 서 to :navigator.geolocation.getCurrentPositionnavigator.geolocation.watchPosition★★★★★★★★★★★★★★★★★★

「」의 기동 및watchPosition 사용법clearWatch()여기서 설명한 바와 같이 작업: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition

다음은 폐업으로 인한 해결 방법입니다.

  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);

그래서 저도 같은 상황에 처했어요.타임아웃 솔루션을 시도했지만 효과가 있었지만 신뢰성은 떨어졌습니다.두 배만 부르면 위치가 제대로 새로 고쳐진다는 걸 알았어요.

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;
}

물론 조금 느리긴 하지만 한번도 잘못된 위치를 준 적은 없어요.타임아웃을 몇 번 눌러본 적이 있지만, 그 이외에는 아무것도 반환하지 않습니다.나는 이것이 여전히 좀 허술하다는 것을 알고 있고 누군가가 진정한 해결책을 찾기를 기대하고 있다.

아니면 포기하고 싶을 때까지 계속 시도하고 싶다면, 이런 것을 시도해 볼 수도 있어요.

//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}
        )
    }       
}

여기 타이포도 있고 철자도 틀릴 것 같은데 이해해주셨으면 좋겠어요.궁금한 점이나 더 좋은 점을 발견하면 알려주세요.

2020년 중반 현재, 여기 있는 어떤 답도 해명을 제공하지 않고 있으며, 단지 해킹이나 추측에 불과하다.

@Coderer가 지적한 바와 같이 오늘날에는 안전한 컨텍스트(https)가 필요합니다.따라서 점점 더 많은 디바이스에서 일반 http에서는 지리정보가 전혀 작동하지 않습니다.

Secure context 이 기능은 일부 또는 모든 지원 브라우저에서 Secure Context(HTTPS; 시큐어 컨텍스트)에서만 사용할 수 있습니다.

의 세 .getCurrentPosition() (그리고)watchPosition()PositionOptions 객체는 다음 속성으로 구성됩니다.

  • enableHighAccurancy(기본값 false): true로 설정하면 응답이 느리고 정확합니다.타임아웃 에러가 발생했을 경우는, 이것을 false 로 합니다.정확도가 낮으면 true로 설정합니다.제 테스트에서는 1s가 1~2m 정도 지연되어 UMAX 태블릿에서는 true와 false의 차이가 없었습니다.false로 설정했을 경우, 5미터의 oscilation을 가진 구형 iPhone에서도 테스트했습니다.Geolocation Coordinates.accurrency 속성에서 정확도를 측정하고 동적으로 결정할 수도 있습니다.
  • timeout(디폴트 무한대): API가 포기하고 에러 핸들러(두 번째 파라미터)를 호출할 때까지의 밀리초.현재는 5s(5000)가 적당하며 경우에 따라서는 10s가 타당할 수 있습니다.지리 위치 센서 데이터를 사용할 수 없는 경우 플랜 B를 사용할 때 유용합니다.
  • maximumAge(기본값 0): 캐시된 값이 유효한 경우 디바이스는 센서 측정 대신 유효한 캐시된 데이터를 사용하도록 결정할 수 있습니다.정적 위치에서는 이 값을 Infinity로 설정하고, 그렇지 않으면 0으로 유지합니다.

@가 내하는 것처럼 @YoLoCo는 @YoLoCo를 as에 as as as as as as as as as as as as as as as as as as as as as as as as as as as asgetCurrentPosition() ★★★★★★★★★★★★★★★★★」watchPosition()으로 getCurrentPosition watchPosition을 합니다."get Current Position" "watch Position" "get Current Position" "get Current Position" 입니다.

iPhone 앱으로 작업하시는 분들을 위해...

의 UI 로 되고 있는 는, 「iOS 9+」UI WebView 를 설정할 .NSLocationWhenInUseUsageDescription사용할 수 있습니다.

하지 않으면 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」getCurrentPosition는 콜백하지 않고 사용자에게 프롬프트도 표시되지 않습니다.

전달되는 두 번째 파라미터는 지리 위치 오류를 처리하는 함수입니다.오류 핸들러 함수 자체는 지리 위치 지정 시도가 실패한 이유에 대한 자세한 내용을 포함하는 개체를 수신합니다.문제가 있는 경우 콘솔에 오류를 출력할 것을 권장합니다.

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);
  }
}

이를 내 코드로 실행하면 "Network Location Provider at 'https://www.googleapis.com/': Returned error code 400" 이라는 메시지가 나타납니다.Google Chrome은 Google API를 사용하여 GPS가 내장되지 않은 장치(예: 대부분의 데스크톱 컴퓨터)의 위치를 얻는 것으로 나타났습니다.Google은 사용자의 IP 주소를 기반으로 대략적인 위도/경도를 반환합니다., Chrome 개발자 빌드(Ubuntu의 Chromium 등)에서는 브라우저 빌드에 API 액세스 키가 포함되어 있지 않습니다.이로 인해 API 요청이 자동으로 실패합니다.자세한 내용은 Chromium Issue 179686: Geolocation giving 403 error를 참조하십시오.

이렇게 하면 안 된다는 걸 알았어요.

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

그렇지만

이 방법은 완벽하다

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

function errorHandler() {...}

navigator.geolocation.getCurrentPosition(storeCoordinates, errorHandler, { enableHighAccuracy: true, timeout: 20000, maximumAge: 0 });

저도 비슷한 문제가 있어서 브라우저가 getCurrentPosition 호출 빈도에 제한이 있을 수 있는지 알아보고 있습니다.자주 위치를 알 수 있을 것 같습니다만, 바로 페이지를 갱신하면 타임 아웃이 됩니다.조금만 기다리면 보통 위치를 다시 알 수 있어요.이것은 보통 FF에서 발생합니다.Chrome과 Safari에서는 get Current Position이 타임아웃된 것을 아직 깨닫지 못했습니다.그냥 생각했을 뿐인데...

이것을 뒷받침하는 문서는 찾을 수 없지만, 여러 번 테스트한 끝에 내린 결론입니다.혹시 다른 누군가가 그것에 대해 정보를 가지고 있는 건 아닐까요?

드디어 안드로이드에서 파이어폭스, 크롬, 디폴트 내비게이터의 동작 버전을 찾았습니다(4.2 테스트만 가능).

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);
        }
    }

Mozilla에서 이 문제가 발생했습니다.항상:오류: 위치를 가져오는 동안 알 수 없는 오류가 발생했습니다.

지금은 47 Mozilla를 사용하고 있습니다.나는 모든 것을 시도해 보았지만, 이 문제는 항상 있었다.그런데 주소 표시줄에서 config를 열고 geo.disc.ui에 접속하여 값을 "https://location.services.mozilla.com/v1/geolocate?key=test"로 변경했습니다.작동합니다!

Position acquisition timeout 오류가 발생한 경우 시간 초과 값을 늘리십시오.

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

@httpnanyoung의 답변은 훌륭하지만, 만약 실패했을 경우 어떻게 해야 할지 궁금하다면 https://ipinfo.io과 같은 IP 지오로케이션 API를 사용할 수 있습니다.다음은 예를 제시하겠습니다.

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);
        });  
    };
});

상세한 것에 대하여는, https://ipinfo.io/developers/replacing-getcurrentposition 를 참조해 주세요.

이 경우 항상 처음 작동하지만 기능을 3~4회 이상 재실행하면 실패합니다.

간단한 회피책:그 값을 Local Storage에 저장합니다.

이전:

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

그 후:

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) => { });
}

저도 최근에 이 문제를 발견했는데, 어떻게 발생했는지는 모르겠지만 가끔 firefox가 캐시에 로드된 무언가에 고착될 수 있습니다.캐시를 지우고 Firefox를 재시작하면 다시 작동하는 것처럼 보입니다.

여러분의 조언 덕분에 도움이 되었습니다.

getCurrentPosition() 대신 watchPosition()을 사용해야 할 뿐만 아니라 document.ready() 내에서 콜을 헤드로 이동해야 한다는 것도 알게 되었습니다.

IP 주소 지리 위치 서비스를 폴백 방식으로 사용하는 것이 좋습니다.getCurrentPosition예를 들어 api https://ip-api.io를 사용하면 실패합니다.

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

Firefox의 응답형 디자인 모드를 사용할 때 이 문제가 발생했습니다.버그 신고가 접수되었습니다.현재로서는 Geolocation API를 사용하는 동안에는 반응성 설계 모드를 사용하지 마십시오.

누군가에게 도움이 될 수도 있다, 안드로이드에서도 같은 문제가 있었지만, 나는 그것을 사용하면서 알아냈다.setTimeout안에서.document.ready그래서 두 번째로는 몇 초 후에 사용자가 위치를 허락했을 때를 대비해 타임아웃을 늘려야 했기 때문에, 저는 6만 milli초(1분)로 유지했고, 1분 이내에 allow 버튼을 클릭하면 성공 함수가 호출되도록 했습니다.

라이브러리는 지리 위치 호출에 desiredAccuracy 및 maxWait 옵션을 추가합니다.즉, 정확도가 지정된 범위 내에 있을 때까지 위치를 얻으려고 계속 시도합니다.

언급URL : https://stackoverflow.com/questions/3397585/navigator-geolocation-getcurrentposition-sometimes-works-sometimes-doesnt

반응형