이 글은 Frédéric Harper 와 Robert Nyman[Editor] 이 작성한 Who moved my geolocation?에 대한 번역본입니다.
파이어폭스 OS에 대해 이야기 할 때 우리는 종종 “디바이스 상의 GPS는 어떠한가?” 라는 질문을 한다. 몇몇 장비에서 GPS 위치정보는 정확하지 않을 수 있다거나 바깥에서 위치 정보를 수신하는데 꽤나 오랜 시간이 걸릴 수 있다는 메세지를 받았을 수도 있다. 이제 GPS가 어떻게 동작하는 지 설명하면서 시작하고 그 이후엔 이슈가 당장 무엇인지 보고 개발자인 우리가 마법을 부려서 위치정보를 이용한 멋진 어플리케이션을 만들어보도록 하자.
디바이스는 어떻게 위치정보를 전달하는가
대부분의 스마트폰은 경도와 위도를 얻기 위해 두 가지 기법을 사용한다. 첫 번째로는 GPS 그 자체로서, 물론 A-GPS(보조 GPS)라고 불리는 것 또한 의미하기도 한다. 바깥에 있을 때 GPS는 인공위성 신호에 접속하여 디바이스의 좌표(위도와 경도)를 얻게 된다. 이를 위해선 GPS가 인공위성과 접속에 성공하기만 하면 되지만, 정보를 보관하거나 좀 더 정확한 정보를 전달하기 위해 다소 시간이 소요될 수 있다.
디바이스가 좀 더 빨리 목적을 달성하도록 돕기 위해, 종종 A-GPS서버로부터 위치를 얻으려고 할 것이다. 이는 대부분의 경우 처음엔 50미터 반경 이내의 정보를 수신하고, 좀 더 기다린다면 더 정확한 정보를 얻을 수 있을 것이다. 또한 전용 GPS 장비를 이용하고 있다면 (하이킹이나 GPS 보물찾기를 위해 이용하는 경우) 정보를 수신하는데 더 오래 걸릴 수 있다. 전용 디바이스는 GPS만을 이용하고, 보조 GPS 연결이 필요하지 않은 인공위성과 연결할 필요가 있기 때문이다.
파이어폭스 OS는 어떠한가?
모질라는 그 어떤 파이어폭스 OS 이미지도 제공하지 않는다. 우리는 칩 제작자나 긱스폰 같은 OEM 제작업체에게 소스 코드를 제공한다. 이들은 다양한 부분을 커스터마이징하고 디바이스를 위한 바이너리 이미지를 만들어낸다. 최종본 파이어폭스 OS 이미지는 대부분 우리의 공용 소스 저장소에 있는 내용을 나타내지만, 물론 몇 가지의 수정사항을 가지고 있기도 하다. 이로 인해 몇몇 부분 (리눅스 설정이나 디바이스 셋업 등)의 설정이 모질라가 의도한 것과 달라지기 때문에 중요한 차이점이 된다.
그 점을 염두에 두면 몇몇 디바이스에서는 A-GPS를 설정하는 데 문제를 가지고 있다. 우리는 적극적으로 OEM 업체들과 이 문제를 해결하기 위해 함께 일하고 있지만 우리의 힘으로만 해결할 수 있는 문제가 아니기 때문에 일단 A-GPS 문제가 특정 디바이스에서 해결된다면 블로그에 디바이스를 고치는 과정에 대해 알려줄 것이다.
하지만 내 어플리케이션을 위한 위치정보가 필요하다
이런 A-GPS 문제가 있다고 하더라도, 위치정보를 필요로 하는 어플리케이션을 개발하는 여러 가지 방법이 존재한다. 우선, 어플리케이션을 테스트하기 위한 시뮬레이터를 이용할 수 있다. 여기엔 아주 유용한 작은 옵션이 시뮬레이터의 우측에 존재하고, 필요로 하는 어떤 좌표라도 표현할 수 있도록 해준다.
물론, 시뮬레이터는 개발과 첫 번째 테스트에 대해서는 완벽하더라도 실제 디바이스 위에서 어플리케이션을 테스트할 필요가 있을 것이다. 만약 리눅스가 OS X 를 사용한다면, (나의 경우 윈도우즈 사용자를 위한 해결책을 제공하고 있으므로) 우리의 친구인 Doug Turner 가 테스트를 하기 위한 (루팅된) 폰에 설치할 수 있는 “모조 위치 제공자“를 만들었다. 이것은 파이어폭스 OS 자체가 스마트폰으로 제공하는 위도와 경도를 하드코딩 할 수 있다. 이 좌표정보는 프로젝트의 components 폴더 안에 있는 MockGeolocationProvider.js을 편집하면 변경 가능하다. 물론 개발자 스스로가 코드 안에 하드코딩할 수도 있지만, 디바이스가 제공해주는 것을 당신이 짠 프로그램에서 얼마나 잘 다룰 지는 알 수 없을 것이다.
마지막이지만 앞에서 언급한 것과 마찬가지로 중요한, freegeoip.net 과 같은 무료 서비스를 이용할 수도 있다. 이곳은 IP 주소를 이용하여 위치정보를 탐지할 수 있는 데이터베이스이다. 완벽하지는 않지만, 사용자에게 좀 더 정확한 위치를 제공할 수 있는 좋은 시작점이면서 어떤 어플리케이션을 위해서라도 좋은 대비책이 될 수 있다. A-GPS 혹은 GPS와 관련된 문제점이 있을지라도 알 수가 없을 것이다.
GPS를 이용한 어플리케이션을 위한 모범 사례들
위치정보를 필요로 하는 어플리케이션을 빌드하려고 할 때 주의해야 할 필요가 있는 두 가지 사항이 있다. 첫 번째로 수신한 결과의 정확도에 대해 생각해볼 필요가 있다. 필요한 정보는 getCurrentPosition을 이용하면게 되면 최대한 빨리 결과를 전달받으려고 할 것이다. 이는 때로는 결과를 얻기 위해 wifi 혹은 IP 주소를 이용한다는 것을 의미한다. GPS 디바이스를 이용할 때 인공위성에 접속하기 전에 몇 분이 걸릴 수도 있으므로 이 상황에서는 두 가지 선택사항이 있다.
1. getCurrentPosition이 리턴하는 좌표값을 위한 정확도를 얻어서 몇 미터 이내의 오차 범위 안에서의 정확한 결과를 얻을 수 있다.(아래 코드를 보자)
2. 다른 방법으로, getCurrentPosition을 호출할 때 HighAccuracy 옵션을 설정할 수 있다. (아래 코드를 보자)
var options = {
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
};
function success(pos) {
var crd = pos.coords;
console.log(‘Your current position is:’);
console.log(‘Latitude : ‘ + crd.latitude);
console.log(‘Longitude: ‘ + crd.longitude);
console.log(‘More or less ‘ + crd.accuracy + ‘ meters.’);
};
function error(err) {
console.warn(‘ERROR(‘ + err.code + ‘): ‘ + err.message);
};
navigator.geolocation.getCurrentPosition(success, error, options);
물론 사용자는 움직이기 때문에 저장하고자 하는 부분에 따라 잦은 빈도로 사용자의 좌표값을 재 측정할 필요가 있다. 그 부분은 수동으로 처리하거나 파이어폭스 OS에서 제공하는 위치정보 API 의 watchPosition 메소드를 이용하면 된다.
var watchID = navigator.geolocation.watchPosition(function(position){
do_something(position.coords.latitude, position.coords.longitude);
});
이런 상황에서 디바이스가 움직이기 때문에, 혹은 좀 더 정확한 위치정보를 얻을 수 있기 때문에 위치가 변경된다면 해당 함수가 호출될 것이고, 새로운 정보를 다룰 수 있게 되는 것이다.
어플리케이션에서 위치정보를 이용하는 방법에 대해 더 많은 정보를 얻고 싶다면 언제나 “위치정보 이용“에 관한 모질라 개발자 네트워크 문서를 참조할 수 있다. 파이어폭스 OS 어플리케이션에서 위치정보를 사용하는데 있어 질문이 있다면 댓글 섹션에 질문을 남겨주길 바란다.
댓글이 없습니다.