R Roam 获取 Roam

iPhone 上的 GPS 轨迹记录器

它把你去过的地方记下来,而且不会弄丢。

Roam 会在每一个 GPS 定位点到达的那一刻就把它提交到手机上,和这次记录的累计数据写在同一次事务里——所以哪怕 App 被杀掉,无论是 iOS 回收内存、崩溃,还是被强制退出,这段路依然完整。隧道里信号断了,它会把这个缺口标出来,而不是画一条自己根本没有证据的直线。无账号,无登录,不同步。

在 App Store 下载

iPhone · 需 iOS 17 或更高版本 · 记录、查看、回放全部免费 · 无需账号

这个 App 究竟做了什么

你还来不及弄丢,定位点就已经落盘了

一次定位回调就是一个批次,一个批次就是一次数据库事务,轨迹点和这次记录的累计数据在同一次事务里一起提交。没有任何缓冲区等着你按下停止,写入这条路上也没有任何一个分支会把某个点悄悄丢掉——提交不下去的批次会直接报错并被挂进告警,而不是被默默吞掉。它带来的好处正是路边最要紧的那一个:如果 App 在第四十公里被杀掉,第四十公里早就写在磁盘上了。恢复时不需要把两万八千个点重放一遍来推算你走到了哪里,因为汇总那一行从一开始就不被允许和它背后的轨迹点对不上。

缺口就画成缺口

隧道、深谷、地下车库、贴着墙的那侧外套口袋。当定位点不再送来,Roam 会把当前这一段收尾,等信号回来再开一段新的,中间那个洞在数据库里是一个有头有尾的真实对象。它永远不会被插值补上,它两端之间的直线长度也永远不会被加进你的里程——引擎手上没有任何证据能说明洞里发生过什么,而凭空编一个出来,恰恰是一台轨迹记录器唯一不能做的事。地图上那截虚线,和详情页上那句「信号中断了 N 分钟」,出自同一次计算,所以图和数字不可能各说各话。

爬升来自气压计,不是 GPS 海拔

GPS 海拔是手机给出的所有数字里最不可靠的一个,把它一路累加的 App,会在一段平路上还给你六百米爬升。Roam 读的是气压传感器,把气压高度和 GPS 高度并排存下来,只要有气压读数就优先用它。没有读数的时候,它还会记下究竟是为什么没有——没有这个硬件、权限从没申请过、权限被拒绝、被配置描述文件限制、在 Roam 自己的设置里关掉了,或者启动了却失败了——因为传感器不存在和传感器不出声,从外面看长得一模一样,而分清这两者,就是一个能修的 bug 和一个谁也解释不了的数字之间的区别。

你记录下来的东西,一条都不会被删掉

滤波、平滑和自动暂停从不删除任何一行。它们只是作为标记写在那个点上,原始数据流按它到达时的样子原样留在磁盘上。这是有意留的一份保险,而不是存储上的将就:启发式算法在真实路况上是会判断错的,而一旦判断错了,原始采样点还在,以后的版本可以拿它们重新推导出一条更好的轨迹。一个把自己不认同的采样点悄悄丢掉的 App,等于亲手销毁了唯一能证明它当时判断错了的证据。

它分得清等红灯和丢信号

在一串坐标里,停着不动和收不到信号看起来非常像,而分不清这两者的 App,要么在隧道口把你的记录暂停掉,要么在你去买咖啡的时候让计时器一直跑着。Roam 用手机的运动数据把这两件事区分开,这也是它唯一一次申请「运动与健身」权限的原因。

只有一项后台能力,再无其他

打开,按下开始,把手机揣进口袋,关掉屏幕,出发。Roam 只声明了一项后台模式——定位——并且仓库里有一道构建闸门,这份清单只要多出一条,构建就直接失败。万一 iOS 还是在中途把 App 关掉了,给它「始终允许」的定位权限,系统就有可能在后台把它重新拉起来,让记录自己接着做下去——这是一道保险,不是保证;不给这个权限也照样能记录,而且 App 会在弹窗里把这句话说清楚,而不是暗示你非给不可。

把那一刻一起带回来

一张照片、一段短视频,或者一句说出口的语音备忘,不用下车就能拍下、录下,并被钉在你按下它时所在的那个路线点上。回头看,它们就待在地图上和时间轴上真正发生的位置,这比一个只有时间戳的照片文件夹,更能索引一整天的经历。沿途记录属于 Roam Pro。

你的轨迹,一份能在别处打开的文件

把一条轨迹导出成 GPX、KML,或者两种形态的 CSV——一种是一个点一行,适合拿去分析;另一种是一条轨迹一行,适合做成你这一年的表格。导出读的是数据库,不是正在跑的记录器,所以哪怕某次记录进程被杀掉之后再也没回来,那条中断的轨迹本身照样导得出来。导出属于 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 Store 下载

大家最先问的几个问题

完全没信号也能用吗?

记录可以,没问题。GPS 是接收端——你的手机是靠听卫星来算出自己在哪儿的,这件事不需要蜂窝网络,也不需要 Wi-Fi。Roam 把每个定位点直接写进手机,记录列表也是从手机上读的,所以在一格信号都没有的山谷里记下的那段路,是完整的。唯一需要网络的是地图底图,所以在一条没有数据信号的路线上,线会画出来,但线背后的街道可能没有。

记录到一半 App 被杀掉,会怎么样?

到那一刻为止记下的东西已经在手机上了,因为它是一到就写,而不是等到最后才写。你再打开 App,它会找到这条被打断的记录并把它对齐,而不是把它丢掉或者悄悄结束掉。如果你给了「始终允许」的定位权限,iOS 还有可能在后台把它重新拉起来,它会重新启动 GPS 接着记。但这里得说句实话:重新拉起来是一道保险,不是保证——从被杀掉到被拉起来的这段时间里,根本不存在任何位置数据,事后也没有任何接口能把它补给你。Roam 能承诺的是已经记下的东西不会丢,不是记录能天衣无缝地接上。

为什么我的里程看着比另一个 App 少?

多半是因为有一段路 Roam 手上没有定位点,它就没有算进去。信号断掉时,那个洞是作为一个有头有尾的洞被存下来的,它两端之间的直线长度永远不会被加进你的里程。一个把两端直接连起来的 App,会给你一个更长的里程,和一条穿楼而过的路线。Roam 没算进去的每一段,都会在这次记录的详情页上被点名,所以它到底漏掉了什么,你看得一清二楚。

爬升这个数字是从哪儿来的?

来自手机的气压计,不是 GPS 海拔。气压读数会和 GPS 高度并排存着,只要有就优先采用,这也是为什么在一段平路上这个数字不会莫名其妙膨胀起来。如果没有读数,Roam 知道是哪种原因——没有传感器、权限从没申请过、权限被拒绝、被限制、在设置里关掉了,或者启动了却失败了——而不是闷声报一个零。

需要注册账号吗?

不需要,而且也没有账号可注册。没有登录页,不收集邮箱,也没有任何东西会同步到服务器。这件事的另一面值得说清楚:你的记录就活在这部手机上,所以想让它们出现在别的地方,就导出。

是免费的吗?

记录、查看和回放一次行程都是免费的。Roam Pro 是一次付费解锁,解锁四样东西——沿途记录、导出、小组件和统计页面——可以按月、按年或者一次性买断,三种方式解锁的内容完全相同。价格请看 App Store 页面。

我能把数据拿出来吗?

能,用 Pro:GPX、KML,或者两种形态的 CSV——一个点一行,或者一条轨迹一行。导出器读的是数据库,不是正在跑的记录器,所以哪怕某次记录中途被打断、之后再也没有恢复,它照样导得出来。

它能记录哪些活动?

骑行、跑步、徒步、开车,还有其他若干种,也包括一个自定义类型。活动类型会影响这次记录的呈现方式和其中一部分分析的做法;至于记录本身,无论选哪种,都是同一串定位点。

手机记录轨迹,到底会出哪些岔子

手机记录一趟路,真正会出问题的地方就那么几处。这里把它们一个个说清楚,也顺便说清楚怎么判断你口袋里那个 App 有没有把它们处理好。装不装这个 App,都一样能看。

全部文章