R Roam 取得 Roam

iPhone 上的 GPS 軌跡記錄器

它把你去過哪裡寫下來,而且不會弄丟。

Roam 在每一筆 GPS 定位抵達的當下就把它寫進手機,而且和當趟的累計數字放在同一筆交易裡一起寫入 — 所以不管 App 是被 iOS 回收記憶體、當機,還是被你強制退出,這趟路都還在。進隧道訊號斷掉時,它會把那個缺口標示出來,而不是畫一條它根本沒有證據的直線。不用帳號、不用登入、不做同步。

在 App Store 下載

iPhone · 需 iOS 17 或以上 · 記錄、檢視與回放完全免費 · 免帳號

這個 App 實際上在做什麼

定位在你來不及弄丟之前就已經落地

一次定位回呼就是一個批次、就是一筆資料庫交易,軌跡點和這趟路的累計數字會一起寫進去。沒有任何緩衝區在等你按下停止,寫入端也沒有任何一條路徑會默默丟掉一個點 — 寫不進去的批次會拋出錯誤、留在警示裡等人處理,不會被悄悄吸收掉。這件事的意義要在路邊才看得出來:騎到第四十公里時 App 被砍掉,第四十公里早就已經寫下來了。復原時也不必把兩萬八千個點重跑一遍才知道你騎到哪裡,因為摘要那一列從來不被允許和它背後的點對不起來。

缺口就畫成缺口

隧道、深谷、地下停車場,或者外套口袋剛好貼著牆。當定位不再進來,Roam 會把目前這段收掉、另外開一段新的,而中間那個洞是資料庫裡一個有頭有尾的真實物件。它永遠不會被內插補上,它兩端之間的直線距離也永遠不會被加進你的里程 — 引擎手上沒有任何證據能說明那段路發生了什麼,而憑空生一個出來,正是一個軌跡記錄器最不該做的事。地圖上那條虛線,和詳細頁面上那句告訴你訊號消失了多久的話,是同一個函式算出來的,所以圖和數字不可能各走各的。

爬升讀氣壓計,不讀 GPS 高度

GPS 高度是手機產出的數字裡最脆弱的一個,把它一路加總的 App,會在一趟全平路的行程後面掛上六百公尺爬升。Roam 改讀氣壓感測器,把氣壓高度和 GPS 高度並排存起來,只要有氣壓值就優先採用。沒有的時候,它也會記下究竟是為什麼沒有 — 沒有這個硬體、從未請求權限、權限被拒絕、被設定描述檔限制、在 Roam 自己的設定裡被關掉,或者啟動之後失敗 — 因為感測器不存在和感測器不出聲,從外面看起來一模一樣,而分得出這兩者,就是「一個修得好的錯誤」和「一個誰都解釋不了的數字」之間的差別。

你記錄下來的東西,一筆都不會被刪掉

過濾、平滑化和自動暫停,從來不會刪掉任何一列資料。它們只是被記成軌跡點上的旗標,原始資料流仍然以抵達時的原樣留在手機裡。這是刻意買下的保險,不是儲存機制的巧合:啟發式演算法在真實的路上就是會判斷錯,而一旦判錯,原始取樣還在那裡,日後的版本可以拿它重新推導出更好的軌跡。一個把自己不認同的取樣默默丟掉的 App,等於毀掉了唯一能證明它判斷錯誤的證據。

它分得出等紅燈和收不到訊號

在一串座標裡,站著不動和訊號掉了看起來非常像,而分不清這兩者的 App,不是在隧道口把你的行程暫停掉,就是在你進去買咖啡時繼續讓碼錶跑。Roam 用手機的動作資料來分辨這兩件事,這也是它唯一一次向你要「動作與健身」權限的原因。

只要一項背景能力,其他一概沒有

按下開始、把手機收進口袋、螢幕關掉,然後就騎你的。Roam 只宣告一種背景模式 — 定位 — 而程式碼庫裡有一道建置關卡,只要那份清單多出一項,建置就會失敗。萬一 iOS 還是在半路把 App 收掉了,把定位權限給到「永遠」,系統就有機會在背景把它重新叫起來,讓記錄接著做下去 — 這是一份保險,不是保證;不給這個權限一樣能記錄,而且 App 會在詢問視窗裡把這件事講清楚,不會讓你以為非給不可。

把那一刻一起帶回來

一張照片、一段短片,或一句說出口的筆記,不用下車就能留下,並釘在路線上你當時所在的那個點。之後它們會出現在地圖上、出現在時間軸上它們發生的位置,這比一個只有時間戳記的相片資料夾,更適合當作漫長一天的索引。沿途拍攝記錄屬於 Roam Pro。

你的行程,變成一個到別處也打得開的檔案

把軌跡匯出成 GPX、KML,或兩種形狀的 CSV — 一列一個點,適合拿去分析;一列一趟路,適合做成你這一年的試算表。匯出讀的是資料庫,不是執行中的記錄器,所以一趟記錄行程被系統砍掉、之後再也沒接回來的中斷行程,照樣可以單獨匯出。FIT 是刻意不做,而不是做了一半擺在那裡。匯出屬於 Roam Pro。

一趟路實際上長什麼樣子

沒有東西要註冊,也沒有個人資料要填。整件事就只有這些,讓你在安裝之前就能判斷這是不是你要的。

  1. 打開它,按下開始選你正在做的事 — 單車、跑步、健行、開車等等 — 然後點一下。中間不會卡一個帳號畫面,因為根本沒有帳號這回事。
  2. 把手機收起來口袋、車前包、車衣後袋、置物箱都行,螢幕可以關著。Roam 會在背景繼續記錄,而且每一筆定位都是一抵達就寫入,不會扣在手上等你回來看。
  3. 不用管隧道收不到就收不到。Roam 會把這一段收掉、等著,定位回來時再開新的一段。你什麼都不必做,而那段缺掉的路會被呈現成缺掉的,不會被填起來。
  4. 把你想記住的東西抓下來一張風景照、十秒鐘的下坡,或者一句說出口的話,提醒自己下次該往哪邊轉。它會落在地圖上事情發生的那個位置。這部分屬於 Pro。
  5. 停下來,好好看看它距離、移動時間、速度、來自氣壓計的爬升,以及對於任何訊號消失路段的誠實說明。想看看這一天怎麼走的,就沿著路線回放一次。這些全都在免費版裡。

兩個必須老實說的限制。Roam 記錄你去過哪裡;它不是教練,不會替你設定目標,也不會告訴你這趟騎得好不好。還有,它終究是手機 GPS:一支塞在濕外套底下車衣口袋裡的手機,收訊本來就比專用車錶差,而這正是為什麼缺口要被標示出來,而不是被抹平。

你的行程住在哪裡

在你的手機裡。沒有帳號、沒有登入、沒有同步,所以軌跡根本沒有地方可以被上傳過去。沒有人握有你的電子郵件地址,因為從頭到尾就沒人跟你要過。

列出你所有行程的那個畫面,沒有任何地方可以去抓資料,而這件事是被強制執行的,不是嘴上保證:程式碼庫裡有一道關卡,會掃描整個功能模組裡的網路相關符號 — URLSession、dataTask、Supabase,甚至一個光禿禿的 http:// — 只要出現一個,建置就失敗。它會存在,是因為這個 App 更早的版本是從伺服器讀取行程清單的,結果就是一位騎士在隧道裡打開 App,看到一片空白。不是錯誤訊息,是一份空清單,而空清單讀起來的意思是「你的行程全都不見了」。

整個專案裡只有兩個第三方套件:一個 SQLite 函式庫,和一個地圖繪製引擎。沒有分析 SDK、沒有當機回報 SDK,也沒有任何形式的廣告 SDK。沒有東西在數你打開了幾次,沒有東西知道你都騎哪些路線,世界上也沒有任何一台伺服器上有一列關於你的資料。

有一件事確實會用到網路,不說出來就太不誠實了:地圖的背景圖磚,會像任何地圖一樣從圖磚伺服器取得。那個請求要的是這個世界的一張圖,不是你的軌跡 — 你的座標不會被送到任何地方,路線那條線是從你自己手機上的資料庫畫出來的。

你的軌跡、你的影音,還有你的設定,都會隨著 App 一起被刪掉。想留下來就先匯出,而檔案是走 iOS 標準的分享功能出去的,也就是說它只會去你指定的地方,不會去別的地方。

哪些免費,Roam Pro 又是怎麼收費

完整記錄一趟路、看它、回放它,這些都免費,而且本來就打算一直免費下去。程式碼庫裡把這條規則寫得明明白白:一個沒辦法記錄完整軌跡的記錄器,那不叫免費版,那叫壞掉的 App。距離、移動時間、速度、氣壓計爬升、地圖、缺口標示和回放,全都在免費版裡。

Roam Pro 解鎖四件事,剛好四件:沿途拍攝記錄(照片、影片、語音筆記)、匯出(GPX、KML、CSV)、主畫面小工具,以及統計頁面。原始碼裡就只有這四項的一份清單,付費牆是從這份清單畫出來的 — 所以牆上不可能承諾一個程式碼其實沒有鎖住的東西,而這種失敗模式,這個 App 從前吃過虧。

Pro 有月訂閱、年訂閱,以及一次性買斷三種,三者解鎖的東西完全相同 — 差別只在你怎麼付錢。你所在國家或地區的現行價格請看 App Store 頁面;這裡不印出來,因為行銷頁上的價格會過期,而一個過期的價格就是一個瑕疵。

App 裡有兩項能力是刻意不拿出來賣的:離線地圖包,以及 Apple Watch App。團隊自己的筆記寫著,這兩項都還沒有在真實硬體上做過完整的端到端驗證,而賣一個沒人親眼看它跑起來的東西,最後就是換來一排退款和一次審核被拒。

在 App Store 下載

大家最先問的問題

完全沒有訊號也能用嗎?

記錄的話,可以。GPS 是接收端 — 你的手機是靠聽衛星來算出自己在哪裡的,不需要行動網路或 Wi-Fi 也做得到。Roam 把每一筆定位直接寫進手機,行程清單也是從手機讀出來的,所以在一個一格訊號都沒有的山谷裡錄下來的行程,一樣是完整的。真正需要網路的只有地圖的背景圖資,所以在沒有數據的路線上,線會畫出來,但線後面的街道可能不會。

騎到一半 App 被砍掉會怎麼樣?

在那一刻之前記下來的東西,早就已經在手機裡了,因為它是一抵達就寫入,不是等到最後才寫。你再打開 App 的時候,它會找到那趟被中斷的行程並把它接續起來,而不是把它丟掉或悄悄結案。如果你給了「永遠」的定位權限,iOS 也有機會在背景把它重新叫起來,它會重新啟用 GPS 繼續錄。不過這裡要老實說:重新叫起來是一份保險,不是一個保證,而在被砍掉到重新啟動之間,那段時間根本沒有任何定位資料,事後也沒有任何 API 補得回來。我們保證的是已經寫下來的東西不會不見,不是保證整趟無縫接軌。

為什麼我的距離看起來比別的 App 少?

多半是因為 Roam 沒有把它手上沒有定位的那段路算進去。訊號斷掉時,那個洞會被當成一個有頭有尾的洞存起來,它兩端的直線距離永遠不會被加進你的里程。一個把兩端用直線接起來的 App,會給你一個比較長的里程,和一條穿過建築物的路線。Roam 沒有算進去的每一段,都會寫在那趟行程的詳細頁面上,所以它沒算什麼,你看得一清二楚。

爬升的數字是哪裡來的?

手機的氣壓計,不是 GPS 高度。氣壓讀數會和 GPS 高度並排存起來,只要有就優先採用,這也是為什麼在一趟平路上這個數字不會膨脹。如果沒有讀數,Roam 知道是哪一種原因 — 沒有感測器、從未請求權限、權限被拒絕、被限制、在設定裡被關掉,或者啟動之後失敗 — 而不是默默回報一個零。

我需要註冊帳號嗎?

不用,而且根本沒有帳號可以註冊。沒有登入畫面,不會收集電子郵件,也沒有任何東西會同步到伺服器。這件事的另一面值得講清楚:你的行程住在這支手機裡,所以想把它們放到別的地方,就要自己匯出。

這是免費的嗎?

記錄、檢視和回放一趟行程都是免費的。Roam Pro 是針對四件事的付費解鎖 — 沿途拍攝記錄、匯出、小工具,以及統計頁面 — 可選月訂閱、年訂閱或一次性買斷,三種解鎖的內容完全一樣。價格請看 App Store 頁面。

我可以把資料拿出來嗎?

可以,需要 Pro:GPX、KML,或兩種形狀的 CSV — 一列一個點,或一列一趟路。匯出器讀的是資料庫,不是執行中的記錄器,所以就算是一趟記錄被中斷、之後再也沒有接回來的行程,也匯得出來。

它可以記錄哪些活動?

單車、跑步、健行、開車,還有其他好幾種,包括一個自訂類型。活動類型會影響這趟行程怎麼呈現,以及部分分析怎麼做;至於記錄本身,不管選哪一種,都是同一串定位資料流。

用手機記錄軌跡,到底會在哪裡出錯

手機把你去過的地方記下來的時候,真正會出問題的地方就那幾處。這裡把它們一個一個講清楚,順便也講清楚要怎麼判斷你口袋裡那個 App 有沒有把它們處理好。裝不裝這一個,都讀得下去。

全部文章