Roam(로움)은 GPS 측위가 도착하는 바로 그 순간 기기에 기록합니다. 누적 기록도 같은 트랜잭션 안에서 함께 커밋되기 때문에, iOS가 메모리를 회수하든 앱이 충돌하든 사용자가 강제로 종료하든, 앱이 죽어도 주행은 그대로 남습니다. 터널에서 신호가 끊기면 근거도 없는 직선을 긋는 대신 끊긴 구간을 그대로 표시합니다. 계정도, 로그인도, 동기화도 없습니다.
Signal lost for 4 minutes near the tunnel. Not measured, not guessed, not added to the distance.
0계정
0분석·광고 SDK
30인터페이스 언어
3내보내기 형식
이 앱이 실제로 하는 일
잃어버릴 틈도 없이 디스크에 남습니다
위치 콜백 한 번이 배치 하나이고, 배치 하나가 데이터베이스 트랜잭션 하나입니다. 개별 좌표와 그 주행의 누적 기록은 언제나 함께 커밋됩니다. 정지 버튼을 누를 때까지 데이터를 쥐고 기다리는 버퍼도 없고, 기록 경로 어디에도 좌표 하나를 조용히 흘려보내는 길이 없습니다. 커밋에 실패한 배치는 그냥 넘어가지 않고 오류를 내며 알람에 보관됩니다. 이 설계가 길 위에서 갖는 의미는 단순합니다. 40킬로미터 지점에서 앱이 죽어도 40킬로미터까지는 이미 적혀 있습니다. 복구할 때 2만 8천 개의 좌표를 처음부터 다시 훑으며 어디까지 갔는지 계산하지 않습니다. 요약 값이 그 뒤의 좌표들과 어긋날 수 있는 순간 자체를 만들지 않았기 때문입니다.
공백은 공백으로 그립니다
터널, 깊은 골짜기, 지하 주차장, 벽에 붙은 재킷 주머니. 측위가 더 이상 들어오지 않으면 Roam은 진행 중이던 구간을 닫고 새 구간을 엽니다. 그리고 그 사이의 공백은 양쪽 끝을 가진 실제 객체로 데이터베이스에 남습니다. 절대로 보간하지 않으며, 두 끝을 잇는 직선 거리를 주행 거리에 더하지도 않습니다. 그 안에서 무슨 일이 있었는지에 대한 근거가 엔진에는 없고, 없는 근거를 지어내는 것이야말로 트랙 레코더가 해서는 안 될 단 하나의 일이기 때문입니다. 지도 위의 점선과 상세 화면에서 신호가 몇 분 동안 끊겼는지 알려 주는 문장은 같은 계산에서 나옵니다. 그래서 그림과 숫자가 서로 어긋날 수 없습니다.
고도 상승은 GPS가 아니라 기압계에서
GPS 고도는 휴대폰이 만들어 내는 값 중 가장 약한 숫자입니다. 그것을 그대로 합산하는 앱은 평지만 달린 주행에 600미터의 상승 고도를 얹어 줍니다. Roam은 대신 기압 센서를 읽고, 기압 고도를 GPS 고도와 나란히 저장한 뒤 기압 값이 있으면 그쪽을 씁니다. 값이 없을 때는 왜 없는지도 함께 추적합니다. 하드웨어가 없는지, 권한을 아직 요청하지 않았는지, 사용자가 거부했는지, 프로파일로 제한되었는지, Roam 설정에서 꺼 두었는지, 아니면 시작은 했는데 실패했는지. 밖에서 보면 없는 센서와 말이 없는 센서는 똑같아 보이지만, 이 둘을 구분할 수 있느냐가 고칠 수 있는 버그와 아무도 설명하지 못하는 숫자를 가릅니다.
기록된 것은 하나도 지우지 않습니다
필터링, 스무딩, 자동 일시정지는 어떤 행도 지우지 않습니다. 전부 해당 좌표에 붙는 플래그로 기록될 뿐이고, 원본 스트림은 들어온 모습 그대로 디스크에 남습니다. 저장 방식을 대충 정하다 이렇게 된 것이 아니라 의도적으로 들어 둔 보험입니다. 휴리스틱은 실제 주행에서 틀리기 마련이고, 틀렸을 때 원본 샘플이 남아 있어야 다음 버전이 더 나은 트랙을 다시 뽑아낼 수 있습니다. 마음에 들지 않는 샘플을 조용히 버리는 앱은 자기가 틀렸다는 유일한 증거를 없애 버린 셈입니다.
빨간불과 신호 끊김을 구분합니다
좌표의 흐름만 놓고 보면 가만히 서 있는 것과 수신이 끊긴 것은 아주 비슷하게 보입니다. 이 둘을 헷갈리는 앱은 터널 입구에서 주행을 멈춰 버리거나, 커피를 사는 동안에도 시계를 계속 돌립니다. Roam은 휴대폰의 동작 데이터를 써서 이 둘을 갈라냅니다. 동작 및 피트니스 권한을 요청하는 이유는 오직 이것뿐입니다.
백그라운드 권한은 단 하나뿐
시작을 누르고, 휴대폰을 주머니에 넣고, 화면을 끄고, 달리면 됩니다. Roam이 선언하는 백그라운드 모드는 위치 하나뿐이고, 그 목록에 항목이 하나라도 늘어나면 빌드를 실패시키는 게이트가 저장소에 들어 있습니다. 그래도 iOS가 주행 도중 앱을 내려 버리는 경우, 위치 권한을 항상으로 허용해 두면 iOS가 백그라운드에서 앱을 다시 띄워 기록을 이어 가게 할 수도 있습니다. 보장이 아니라 보험입니다. 이 권한이 없어도 기록은 됩니다. 앱은 권한 안내에서 그 사실을 꼭 있어야 하는 것처럼 굴지 않고 그대로 말합니다.
그 순간을 함께 가져옵니다
사진 한 장, 짧은 영상, 말로 남긴 메모를 자전거에서 내리지 않고 남기면, 경로에서 그것을 남긴 바로 그 지점에 고정됩니다. 나중에 보면 지도 위와 타임라인 위의 제자리에 놓여 있습니다. 타임스탬프밖에 없는 사진 폴더보다 긴 하루를 훨씬 잘 찾아볼 수 있는 색인입니다. 경로 위 촬영·녹음은 Roam Pro 기능입니다.
다른 곳에서 열 수 있는 파일로
트랙을 GPX, KML, 또는 CSV로 내보낼 수 있고 CSV는 두 가지 형태입니다. 분석용으로 좌표 한 개가 한 행인 형태, 한 해의 주행을 표로 보기 좋은 트랙 한 개가 한 행인 형태. 내보내기는 실행 중인 레코더가 아니라 데이터베이스를 읽기 때문에, 기록 프로세스가 종료된 뒤 돌아오지 못한 중단된 주행도 그것만 따로 내보낼 수 있습니다. FIT은 어설프게 반쯤 되는 상태로 넣느니 아예 넣지 않기로 한 것입니다. 내보내기는 Roam Pro 기능입니다.
주행 한 번은 이렇게 흘러갑니다
가입할 것도 없고 채워 넣을 프로필도 없습니다. 설치하기 전에 원하는 물건인지 판단할 수 있도록, 전부를 그대로 적어 둡니다.
열고 시작을 누릅니다자전거, 러닝, 하이킹, 운전 등 지금 하는 활동을 고르고 한 번 탭하면 끝입니다. 가로막는 계정 화면이 없습니다. 계정이라는 것이 아예 없기 때문입니다.
휴대폰을 넣어 둡니다주머니, 핸들바 가방, 저지 뒷주머니, 글로브박스 어디든 좋습니다. 화면은 꺼도 됩니다. Roam은 백그라운드에서 계속 기록하고, 모든 측위는 돌아올 때까지 붙들려 있지 않고 도착하는 대로 커밋됩니다.
터널은 신경 쓰지 않습니다수신이 끊기면 끊기는 대로 둡니다. Roam은 구간을 닫고 기다렸다가, 측위가 돌아오면 새 구간을 엽니다. 사용자가 할 일은 아무것도 없고, 빠진 구간은 채워지는 대신 빠진 그대로 보입니다.
기억하고 싶은 것을 붙잡습니다풍경 사진 한 장, 다운힐 10초, 다음에는 어디서 꺾을지 소리 내어 남긴 한 문장. 전부 그 일이 있었던 지점의 지도 위에 놓입니다. 이 부분은 Pro입니다.
멈추고, 들여다봅니다거리, 이동 시간, 속도, 기압계로 잰 상승 고도, 그리고 신호가 끊겼던 구간이 있었다면 그에 대한 솔직한 안내까지. 하루가 어떻게 흘러갔는지 보고 싶다면 경로를 따라 리플레이하면 됩니다. 여기까지는 전부 무료 앱에 들어 있습니다.
솔직하게 밝히는 두 가지 한계. Roam은 어디를 다녀왔는지를 기록합니다. 코치가 아니고, 목표를 정해 주지 않으며, 오늘 주행이 좋았는지 나빴는지 말해 주지 않습니다. 그리고 휴대폰 GPS입니다. 젖은 재킷 아래 저지 주머니에 들어간 휴대폰은 전용 사이클링 컴퓨터보다 수신이 나쁩니다. 공백을 매끄럽게 덮지 않고 공백으로 표시하는 이유가 바로 이것입니다.
내 주행 기록이 있는 곳
내 휴대폰 안입니다. 계정도, 로그인도, 동기화도 없으니 트랙이 올라갈 곳 자체가 없습니다. 이메일 주소를 가진 사람도 없습니다. 애초에 물어본 적이 없기 때문입니다.
주행 목록 화면에는 불러올 곳이 없고, 이것은 약속이 아니라 강제입니다. 저장소에는 해당 기능 전체에서 네트워크 관련 심볼을 훑는 게이트가 들어 있습니다. URLSession, dataTask, Supabase, 맨 http:// 까지. 하나라도 나타나면 빌드가 실패합니다. 이 게이트가 생긴 이유가 있습니다. 예전 버전은 목록을 서버에서 읽어 왔고, 그래서 터널 안에서 앱을 연 사용자는 빈 목록을 봤습니다. 오류 화면이 아니었습니다. 빈 목록이었고, 그것은 "내 기록이 사라졌다"로 읽힙니다.
프로젝트 전체에 들어 있는 서드파티 패키지는 정확히 두 개, SQLite 라이브러리와 지도 렌더러입니다. 분석 SDK도, 크래시 리포팅 SDK도, 어떤 종류의 광고 SDK도 없습니다. 앱을 몇 번 열었는지 세는 것도 없고, 어떤 경로를 달리는지 아는 것도 없으며, 어느 서버에도 사용자에 대한 행이 없습니다.
네트워크를 쓰는 것이 딱 하나 있는데, 말하지 않으면 정직하지 않을 것입니다. 지도의 배경 타일은 다른 모든 지도가 그렇듯 타일 엔드포인트에서 받아 옵니다. 그 요청은 세상의 그림을 받아 오는 요청이지 트랙을 보내는 요청이 아닙니다. 좌표는 어디로도 전송되지 않고, 경로 선은 휴대폰 안의 데이터베이스에서 그려집니다.
트랙과 미디어와 설정은 앱을 삭제하면 함께 지워집니다. 남겨 두고 싶다면 먼저 내보내세요. 파일은 iOS 표준 공유 시트를 거치므로, 보낸 곳으로만 가고 그 밖의 어디로도 가지 않습니다.
무료인 것과 Roam Pro
주행을 끝까지 기록하는 것, 그것을 들여다보는 것, 리플레이하는 것은 무료이고 앞으로도 그럴 생각입니다. 저장소에는 그 원칙이 이렇게 적혀 있습니다. 트랙 전체를 기록하지 못하는 레코더는 무료 등급이 아니라 고장 난 앱이라고. 거리, 이동 시간, 속도, 기압계 상승 고도, 지도, 공백 표시, 리플레이는 전부 무료 앱에 있습니다.
Roam Pro가 여는 것은 네 가지이고, 정확히 네 가지뿐입니다. 경로 위에서의 촬영과 녹음(사진, 동영상, 음성 메모), 내보내기(GPX, KML, CSV), 홈 화면 위젯, 그리고 통계 화면. 이 네 가지 목록은 소스 코드에 단 한 곳에만 있고 결제 화면은 그 목록에서 그려집니다. 그래서 코드가 잠그지 않은 것을 결제 화면이 약속하는 일이 생길 수 없습니다. 이 앱이 예전에 당해 본 실패 방식입니다.
Pro는 월 구독, 연 구독, 그리고 한 번 결제하는 방식으로 제공되며 셋 다 똑같은 것을 엽니다. 차이는 결제 방식뿐입니다. 지금 내 나라의 가격은 App Store 페이지에 있습니다. 여기에 적지 않는 이유는, 마케팅 페이지의 가격은 낡기 마련이고 낡은 가격은 결함이기 때문입니다.
앱 안에 들어 있으면서도 의도적으로 판매하지 않는 기능이 둘 있습니다. 오프라인 지도 팩과 Apple Watch 앱입니다. 팀의 기록에 따르면 둘 다 실제 기기에서 처음부터 끝까지 검증되지 않았습니다. 아무도 동작하는 것을 지켜본 적 없는 물건을 파는 것은 환불 대기열과 심사 거절로 가는 길입니다.
기록은 됩니다. GPS는 수신기입니다. 휴대폰은 위성의 신호를 들어서 스스로 위치를 계산하며, 그러는 데 셀룰러 연결이나 와이파이가 필요하지 않습니다. Roam은 모든 측위를 곧바로 휴대폰에 쓰고 주행 목록도 휴대폰에서 읽으므로, 안테나가 하나도 안 잡히는 골짜기에서 기록한 주행도 온전합니다. 네트워크가 필요한 것은 지도의 배경 이미지 하나뿐입니다. 데이터가 없는 구간에서는 경로 선은 그려지지만 그 뒤의 길은 안 보일 수 있습니다.
주행 중에 앱이 종료되면 어떻게 되나요?
그 순간까지 기록된 것은 이미 휴대폰에 있습니다. 끝날 때 몰아서 쓴 것이 아니라 도착할 때마다 썼기 때문입니다. 앱을 다시 열면 중단된 주행을 찾아내 정리합니다. 버리지도 않고, 조용히 닫아 버리지도 않습니다. 위치 권한을 항상으로 허용해 두었다면 iOS가 백그라운드에서 앱을 다시 띄울 수도 있고, 그러면 앱은 GPS를 다시 켜고 이어 갑니다. 다만 솔직하게 말해 두겠습니다. 이 재실행은 보장이 아니라 보험입니다. 앱이 죽은 시점과 다시 살아난 시점 사이에는 위치 데이터가 아예 존재하지 않고, 나중에 그것을 가져다줄 수 있는 API도 없습니다. 약속할 수 있는 것은 기록된 것이 남는다는 사실이지, 끊김 없이 이어진다는 것이 아닙니다.
왜 다른 앱보다 거리가 짧게 나오나요?
측위가 없는 구간을 Roam이 거리에 넣지 않았기 때문일 가능성이 큽니다. 신호가 끊기면 그 공백은 양쪽 끝을 가진 공백 그대로 저장되고, 두 끝을 잇는 직선 거리는 절대 주행 거리에 더해지지 않습니다. 두 끝을 선으로 이어 버리는 앱은 더 긴 주행과 건물을 관통하는 경로를 보여 줍니다. Roam이 빼놓은 구간은 주행 상세 화면에 그대로 적히므로, 무엇을 세지 않았는지 정확히 확인할 수 있습니다.
상승 고도 숫자는 어디서 나오나요?
휴대폰의 기압계이며, GPS 고도가 아닙니다. 기압 값은 GPS 고도와 나란히 저장되고 값이 있을 때는 언제나 기압 쪽이 우선됩니다. 평지 주행에서 숫자가 부풀지 않는 이유가 이것입니다. 값이 없을 때 Roam은 조용히 0을 보고하는 대신 어떤 이유인지를 압니다. 센서 없음, 권한 미요청, 권한 거부, 제한됨, 설정에서 꺼 둠, 또는 시작했다가 실패함 중 하나입니다.
계정이 필요한가요?
아니요, 만들 계정 자체가 없습니다. 로그인 화면이 없고, 이메일을 수집하지 않으며, 서버로 동기화되는 것도 없습니다. 대신 분명히 해 둘 것이 있습니다. 주행 기록은 이 휴대폰 안에 있으므로, 다른 곳에 두고 싶다면 내보내야 합니다.
무료인가요?
주행을 기록하고, 확인하고, 리플레이하는 것은 무료입니다. Roam Pro는 네 가지를 여는 유료 잠금 해제입니다. 경로 위 촬영·녹음, 내보내기, 위젯, 통계 화면. 월 단위, 연 단위, 또는 한 번 결제 중에서 고를 수 있고 셋 다 똑같은 것을 엽니다. 가격은 App Store 페이지에 있습니다.
내 데이터를 꺼낼 수 있나요?
네, Pro에서 가능합니다. GPX, KML, 또는 CSV이고 CSV는 두 가지 형태입니다. 좌표 한 개가 한 행인 형태와 트랙 한 개가 한 행인 형태. 내보내기는 실행 중인 레코더가 아니라 데이터베이스를 읽기 때문에, 기록이 중단된 뒤 다시 이어지지 못한 주행도 내보낼 수 있습니다.
어떤 활동을 기록할 수 있나요?
자전거, 러닝, 하이킹, 운전을 비롯한 여러 종류가 있고 사용자 지정 활동도 있습니다. 활동 종류는 주행을 어떻게 보여 주고 분석의 일부를 어떻게 처리할지에 영향을 줍니다. 기록 자체는 어느 쪽이든 똑같은 측위 스트림입니다.
스마트폰으로 기록한 궤적은 실제로 어디서 어긋나는가
휴대폰이 "어디를 지나갔는지"를 받아 적을 때 실제로 문제가 되는 곳은 몇 군데뿐입니다. 그 하나하나를 평범한 말로 설명하고, 주머니 속 앱이 그것들을 제대로 처리하고 있는지 판별하는 법까지 적었습니다. 이 앱을 설치하든 안 하든 읽을 만하도록 썼습니다.