我做了一个「把走路变成探索面积」的iOS App——成就系统的数据建模:为什么我把用户状态抽成一个纯值快照

iOS游戏开发实战:基于健康数据与地图服务的像素领地占领应用 在移动应用开发领域,位置服务与健康数据集成是构建创新体验的关键技术。其原理在于通过系统框架(如Core Location、HealthKit)安全、高效地获取用户的实时地理位置与运动信息,并将这些物理数据转化为应用层的逻辑与价值。这项技术的核心价值在于能够将用户的日常行为(如步行、跑步)游戏化,创造出兼具趣味性与实用性的应用场景,例如运动激励、社交探索和基于位置的互动游戏。本文以一款名为“像素征途”的iOS游戏为例,深入探讨了如何利用SwiftUI、MapKit和Combine等原生框架,实现将用户行走路径 阅读详情

先说我做了什么

这个 App 做的事情说白了很简单:后台 GPS 静默记录你走过的路,然后把轨迹转成一个数字——你这辈子真正踩过的土地面积,单位 km²。

不是打卡了几个地点,不是走了多少步,是面积。25米精度的网格,一格一格叠起来。

我发现,当你 citywalk 结束后打开 App,看到「今天新开垦了 0.3 km²」,那种感觉和「走了 8000 步」完全不一样。面积有一种领土感,有一种真实的积累感——你这块地方是真的踩过去了,不是飘过去的。

App 叫「雁过留痕」,大雁飞过,在天空留下痕迹。你走过,在地图上留下面积。文末有下载方式。


成就系统是这个 App 的灵魂,但建模挺麻烦的

游戏化是核心玩法之一。用户每次出行都可能解锁新省份、新城市、新徽章、新等级。

成就系统一旦做复杂,数据结构就很容易变成一坨。我试了好几个方案,最后的思路是:把「判断成就需要的所有用户状态」单独抽成一个纯值类型 BadgeMetrics,所有成就计算都只从这一个快照做判断,不再散落地查数据库。

BadgeMetrics 目前有 19 个字段,大致分四类:行为统计(总距离、总时长、记录天数、连续打卡天数)、地理覆盖(中国省市数量、中国面积、全球面积、城市解锁数)、出行特征(夜间记录次数、周末记录天数、单次最长距离)、会员状态(是否激活 Pro、已激活天数)。字段多是因为成就系列跨度大,从「走了100km」到「连续打卡30天」到「解锁全部直辖市」,驱动维度差异很大,合并不了。

字段全貌大概是这样:

struct BadgeMetrics {
    let totalDistanceKilometers: Double
        let totalDurationHours: Double
            let totalPoints: Int
                let recordedDays: Int
                    let segmentCount: Int
                        let currentStreakDays: Int
                            let longestStreakDays: Int
                                let nightSegmentCount: Int
                                    let weekendRecordDays: Int
                                        let longestSegmentKilometers: Double
                                            let recordingMonths: Int
                                                let chinaProvinceCount: Int
                                                    let chinaMacroRegionCount: Int
                                                        let chinaAreaKm2: Double
                                                            let unlockedCountryCount: Int
                                                                let cityUnlockCount: Int
                                                                    let globalAreaKm2: Double
                                                                        let proMembershipActive: Bool
                                                                            let proMembershipDays: Int
                                                                            }
                                                                            ```
`build` 方法从三个持久层对象组装:`TraceStats`(行为统计聚合)、`[TraceSegment]`(分段轨迹列表)、`GeographicProfile`(地理覆盖状态)。调用时机是每次用户进入成就页面时同步执行一次,实测耗时在 0.5ms 以内,不需要缓存或异步。

这个分层的好处是成就判断逻辑全部变成纯函数——给定同样的 `BadgeMetrics`,判断结果永远一致,单测直接传一个 struct 进去就行,不需要 mock 数据库。后来加新成就系列,只需要在 `BadgeSeriesCatalog` 里注册一条记录,UI 层完全不动。

成就徽章分了五个 Track,用枚举管理:

```swift
enum BadgeTrack: String, CaseIterable {
    case exploration   // 累计探索面积/距离
        case consistency   // 连续打卡/月度记录
            case china         // 中国省市解锁
                case world         // 全球探索
                    case pro           // Pro 会员专属
                    }
                    ```
每个 Track 下有多个系列(Series),每个系列有多个等级(Tier)。`BadgeSeriesProgress` 负责计算当前到了哪一级、离下一级还差多少,UI 层只消费这个 progress 对象,不碰底层阈值逻辑。

---

## 中国坐标系这件事,绕不过去

做中国地图类 App 有个绕不过去的问题:GCJ-02(火星坐标)和 WGS-84(GPS 原始坐标)的偏移。

GPS 收到的是 WGS-84,国内地图服务普遍用 GCJ-02,不处理的话轨迹叠加到地图上会明显错位,省市边界判断也会出问题。我用的是 [eviltransform](https://github.com/googollee/eviltransform) 的算法逻辑自行移植到 Swift,在上海市区实测偏差约 3-5 米,基本可以接受。但边界附近的判断仍然存在问题——偏差不大,却刚好可能跨过省界。内置行政区边界数据做 point-in-polygon 判断时,如果用户走在省界附近几十米的地方,解锁结果有时候不太稳定。现在还没找到特别好的办法,这个坑算是留着的。

偶尔有用户反馈某个省明明去过但没解锁,基本上都是这个原因。说实话有点难受,但短期内边界精度问题很难彻底解决。

---

## 桌面 Widget:小细节但用户挺喜欢

做了一个 Widget,实时展示当日探索面积进度和离下一等级还差多少。用户开着 Widget 跑步时能看到数字慢慢涨,这个反馈还挺有意思的。

`WidgetKit` 的时间线刷新在低电量模式下会降得很厉害,靠系统调度根本不够用。我现在的方案是:用户结束出行回到 App 主界面时,在 `onAppear` 里主动调用 `WidgetCenter.shared.reloadAllTimelines()`,实测从 App 切回桌面大概 2-3 秒内 Widget 就能更新。另外在轨迹保存完成的回调里也触发一次 reload,确保数据落库之后 Widget 拿到的是最新值,不会出现「明明刚走完但 Widget 还是旧数据」的情况。

---

## 数据备份:GPX 导出和自定义格式

用户的轨迹数据是很私人的东西,我不想让它只锁在服务器上。支持两种导出格式:

**GPX** 是通用格式,可以导入 Strava、Garmin Connect 等 App。**Wingprint Backup** 是自定义的 `.wingprintbackup` 格式,本质是 JSON,注册了 `com.xun.wingprint.backup` 这个 UTType,可以完整恢复成就进度、统计数据、地理标注等 GPX 里没有的字段。

注册自定义 UTType 有个容易踩的坑:Info.plist 里要区分 `Exported Type Identifiers` 和 `Imported Type Identifiers`,自己定义的格式用 Exported,引入别人格式(比如 GPX)用 Imported。搞混了的话 Files App 里点击文件会打不开,排查起来有点费劲,我当时找了半天。

---

## 现在的状态

坦白说,下载量还在冷启动阶段,刚上线不久。评分是 5.0,两条评论,有一条写「人生总要留下一些什么——走过的路,见过的人,看过的风景」,我看到的时候挺触动的,感觉做这个东西的方向没走偏。

产品的核心链路已经跑通:GPS 记录 → 网格化面积计算 → 行政区解锁 → 成就徽章 → 社交分享,这条链路是通的,剩下的是推广和口碑积累的问题。

---

## 几个可以直接参考的点

如果你在做类似方向的 iOS App,这些坑我已经踩过了:

成就系统的数据建模,把「用户当前状态快照」抽成一个纯值 struct,所有判断逻辑做成纯函数,测试和维护都省事很多。字段多不是问题,分类清楚就行。

中国地图类 App,坐标系偏移一定要在数据入库前处理,别留到展示层。eviltransform 算法移植到 Swift 不难,市区精度够用,但省界附近的判断要做好心理准备。

自定义文件格式,注册 UTType 区分 Exported 和 Imported,别踩我踩过的坑。

Widget 刷新,别指望系统时间线足够及时。关键节点——用户回到 App、数据落库完成——这两个时机主动 `reloadAllTimelines()`,基本能保证 2-3 秒内同步。

---

App Store 搜「雁过留痕」可以找到(ID: 6759516186)。如果你也在做鸿蒙或 iOS 的地图、运动、游戏化方向的 App,欢迎交流,遇到的奇怪问题大概率我也遇到过。
主观健康感受如何量化?动态锚点+情境快照评估法 主观健康感受是慢病管理、术后康复与数字健康产品中的核心但难测指标,其本质是人体对生理异常的早期行为反馈。传统量表因依赖抽象回忆、模糊选项和长周期回溯,导致依从性低、记忆偏差大、临床映射弱。基于‘可验证动作’与‘72小时情境快照’原理,动态锚点设计将‘疲惫’‘焦虑’等模糊概念转化为如‘站立时头晕’‘突然手抖’等具身化、有临床金标准支撑的行为信号;情境快照则通过绑定生理节律节点(如‘午饭后30分钟’)和生物钟校准,显著提升短期记忆可靠性。该方法兼具医学严谨性与用户友好性,已成功应用于慢性病居家自评、职场疲劳监测 阅读详情

相关推荐

混元Hy3preview:轻量级大模型在元宝App的场景化落地实践

大模型轻量化是当前AI工程化落地的核心路径之一,其本质是在推理效率、响应延迟与任务精度之间寻求最优平衡。混元Hy3preview并非参数缩减的妥协版本,而是面向终端用户真实交互场景(如健康咨询、财务诊断、消费决策)深度优化的‘最小可行体验单元’。它通过多模态理解增强、指令微调结构适配、端云协同推理架构等关键技术,显著降低首token延迟与用户认知成本。该方案特别适用于移动端原生AI集成、高频低复杂度任务自动化及专业领域知识即时调用等典型场景,代表了从‘能算’到‘好用’的关键跃迁。

无花的专栏 635

做了一个把走路面积量化的 iOS App,25m 网格精度下踩了不少坑

iOS CoreLocation 给的是 WGS-84,但中国行政区数据用的是 GCJ-02。简化方案是 Douglas-Peucker 算法,tolerance 设在 0.005°(约 500m 级别),每个省压缩到几百个点,总文件从 40MB 降到 2MB 左右。后来想明白了——线是一维的,但你实际「占领」的地面是二维的。面积计算的核心思路是把地图切成 25m × 25m 的格子,GPS 坐标落入哪个格子,那个格子就被「点亮」。用的是阿里云 DataV 的 GeoJSON,精度够用且免费。

same4869的博客 108

超小型可穿戴传感器平台hSensor:从硬件选型到低功耗链路全解析

在可穿戴设备设计中,“低功耗蓝牙”与“传感器”的集成往往决定产品成败。面对尺寸、功耗和射频性能的多重约束,硬件开发者需要同时兼顾高集成度原理图、微型PCB布局、电源管理及固件优化。hSensor Platform提供了一套从传感器到App的完整参考设计,覆盖主控SoC选型、传感器FIFO突发传输、BLE连接参数调优、天线净空区及PPG光学通道调试等关键环节,实测数据表明其可实现1.2cm见方核心板、数天续航和稳定数据传输。适用于手环、贴片式监测器、运动标签等场景,帮助团队快速完成原型验证与产品落地。

weixin_34384557的博客 342

湾区4.4级地震,这些APP用得着!

硅谷Live / 实地探访 / 热点探秘 / 深度探讨相信湾区的小伙伴们都知道昨天半夜伯克利方向发生4.4级地震了。。小探第一时间赶紧搜谷歌新闻,没发现,于是一度以为错觉…… 想想不对劲,赶紧刷朋友圈、Facebook,倒是各种发了,我们深夜2点多还在工作群里热烈讨论的场景,真是难忘啊。。。湾区已经开启了“震动模式"...据说在亚马逊上,地震的报警器都已经卖脱销了...而且还有新闻称,2018年的

硅谷密探 795

DisFlow:基于距离场的动态场景6DoF位姿跟踪新范式

距离场(SDF)作为一种隐式几何表征,正逐渐成为动态场景理解的核心基础——它天然具备连续性、可微性与抗噪能力,能将表面几何与运动语义统一建模。相比传统光流、场景流或分割驱动的方法,SDF通过空间梯度表达法向、时间导数编码速度,使刚体运动约束内生于网络结构,显著提升6DoF位姿估计的鲁棒性与实时性。该技术已在AR工业维修、自动驾驶V2X协同感知及机器人动态抓取等强时序-空间耦合场景中验证价值,尤其适用于单目视频输入下的多物体解耦跟踪。DisFlow正是这一思想落地的代表性框架。

weixin_30460489的博客 338

奥维地图会员实战指南:CAD精准导入与离线地图高效应用

地理信息系统(GIS)与计算机辅助设计(CAD)的集成是工程测绘与户外规划中的关键技术。其核心原理在于通过坐标转换与数据融合,将设计图纸与真实地理空间精准匹配,从而打通从室内设计到野外作业的数据流。这项技术的工程价值在于能大幅提升数据精度与作业效率,减少因坐标偏差导致的返工。典型的应用场景包括户外测绘、路线规划、土地调查与工程项目管理。本文以奥维地图会员功能为例,深入解析如何利用其高清地图下载与海量数据管理能力,实现CAD图纸的精准导入、离线环境下的高效数据采集与协同分析,为相关领域从业者提供一套完整的实战

weixin_34192816的博客 477

相关性不是因果:从Pearson到Spearman的底层逻辑与避坑指南

相关性是衡量两个变量线性协同程度的基础统计量,其核心原理在于标准化协方差以消除量纲影响,从而获得-1到1之间的无量纲度量。它并非因果证据,而是一种受多重假设约束的描述性工具——对离群值敏感、依赖线性关系、要求双变量近似正态。技术价值在于为特征筛选、EDA和模型诊断提供可解释的初始洞察,但必须配合散点图、正态性检验与分组分析才能避免误读。典型应用场景包括用户行为分析(如停留时长与付费金额)、风控变量筛查(如收入与信用分)及多变量共线性识别。本文聚焦Pearson相关系数的本质推演与三大致命假设,并系统对比Sp

weixin_30321449的博客 381

豆包2.0深度评测:即插即用的数字同事如何重塑工作流

‘即插即用’正成为新一代AI工具的核心技术范式,它跳过传统AI依赖提示词工程、模型调参和多平台切换的复杂路径,将专业能力封装为零学习成本的操作入口。其底层融合多模态理解、动态检索增强(RAG)、弹性算力调度与实时上下文感知等关键技术,实现从‘能回答’到‘懂场景’的跃迁。这种设计显著降低知识应用门槛,使行政、教育、医疗、电商等高频职场与生活场景中的重复劳动可被一键重构——如会议录音自动生成带决策链的纪要,合同审查同步输出法律/财务/执行三维风险图谱。豆包2.0正是这一范式的典型落地,它不强调AI有多强,而专注

weixin_33861800的博客 475

Hexoskin智能衬衫的BLE设计解析:从织物电极到Cypress模块

在可穿戴设备不断向医疗级监测演进的今天,低功耗蓝牙(BLE)已成为连接生理信号与智能手机的核心技术。BLE凭借按需唤醒的射频机制和成熟手机生态,在功耗与实时性之间取得了理想平衡,成为健康监测设备的首选无线方案。医疗级ECG、心率、呼吸率等生物特征数据的稳定传输,依赖精心设计的GATT服务与硬件集成。Hexoskin智能衬衫便是一个典型范例:它采用Cypress EZ-BLE PRoC模块,利用ARM Cortex-M0内核完成信号采集与蓝牙协议栈的整合,通过自定义Profile将多路生理数据可靠送达手机端。

weixin_32349093的博客 346

智能哑铃核心技术解析:从IMU传感器到动作识别的嵌入式实践

在物联网和智能硬件领域,传感器技术是实现设备感知与交互的基石。惯性测量单元(IMU)作为核心传感器,通过融合加速度计、陀螺仪等数据,能够精准捕捉物体的运动状态与姿态变化。其技术原理在于对多维运动数据的实时采集与滤波融合,例如通过卡尔曼滤波算法,有效整合不同传感器的优势,输出稳定可靠的运动信息。这项技术的核心价值在于将物理世界的连续动作转化为可量化、可分析的数字信号,为设备智能化提供了数据基础。其应用场景广泛,从无人机导航到可穿戴设备,都依赖于精准的运动感知。本文聚焦于智能健身器材这一具体应用,深入探讨如何利

weixin_30633405的博客 420

深度学习实操地图:从环境搭建到YOLO部署的12个关键节点

深度学习不是数学推导,而是工程化的问题解决过程。理解模型原理是基础,但真正决定项目成败的是环境兼容性、数据预处理鲁棒性、训练稳定性与端侧部署可行性。PyTorch动态图机制、Hugging Face模型即服务范式、Ultralytics YOLO极简API共同降低了工程门槛;而M1芯片的mps后端支持、Focal Loss应对长尾分布、ONNX+Core ML轻量化路径,则体现了现代深度学习落地中的典型技术选型逻辑。本文聚焦真实开发场景中的高频痛点——CUDA版本错配、YOLO标注越界、学习率震荡、mAP指

张沈鹏,在路上 ... 2177

新能源汽车下半场:从抢滩登陆到阵地防御的护城河构建

在汽车产业智能化、电动化转型浪潮中,核心技术自主可控与全栈自研已成为车企构建长期竞争力的关键。其原理在于,通过掌握从电驱平台、电池管理系统到智能驾驶算法的全链路技术栈,企业不仅能优化产品性能与成本,更能形成数据闭环,持续迭代用户体验。从技术价值看,这直接关乎供应链安全、产品差异化以及盈利能力的提升。在应用场景上,无论是应对激烈的国内市场竞争,还是布局全球化战略,拥有深厚技术护城河的企业都更能抵御风险,实现可持续发展。当前,中国新能源汽车行业正从追求市场份额的‘抢滩登陆’阶段,转向以体系化能力为核心的‘阵地防

weixin_33778544的博客 414

可穿戴设备创新:从技术原理到智能戒指评测与健康监测实践

可穿戴设备正从被动记录工具进化为主动健康助手,其创新核心并非堆砌传感器,而是硬件、算法与场景的深度融合。围绕PPG、生物电阻抗等传感器技术,设备实现了心率、血氧、睡眠等生命体征的连续监测,并借助边缘计算与低功耗设计,在保障隐私的同时提升续航体验。智能戒指等新形态的出现,让全天候健康管理成为可能,通过多维度数据融合与算法分析,可对潜在风险提供预警。设备评测与使用中,数据准确性、佩戴舒适度及生态开放性尤为关键。从智能手表到戒指,从睡眠监测到异常提醒,可穿戴技术正推动医疗级体验下沉至消费端,其价值在于让数据真正服

weixin_42715608的博客 282

《梦幻西游》手游服务器如何实现200万玩家同时在线?(技术篇)

原标题:《梦幻西游》手游服务器如何实现200万玩家同时在线?(技术篇) 去年,网易游戏学院成立并举行首个公开日活动,现场众多重量级嘉宾的干货分享深受广大游戏从业者的认可。6月27日,网易游戏学院第二届公开日活动在广州网易大楼开启,本次为网易游戏学院的技术专场,分享主题为《技术进步引发的灵感革命》。 以下为游戏陀螺整理的部分内容分享。 3 月26日,《梦幻西游》手游登陆iOS平台,它在上线两个多月的时间里,就创造了2000万注册用户,204万玩家同时...

gdou_shelin的博客 1143

Llama-3.3语义共形嵌入与动态稀疏路由技术解析

多语言大模型的核心挑战在于如何实现跨语言的语义一致性与实时推理效率。传统方案依赖翻译中继或平行语料对齐,导致文化专有概念失真、长上下文指代错位及混合语码处理脆弱。Llama-3.3通过语义共形嵌入(Semantic Conformal Embedding)重构词元空间,使不同语言对同一概念在高维向量空间中收敛至同一流形;结合动态稀疏专家路由(DS-MoE),依据输入语义特征实时激活最适配专家子网络,兼顾精度、速度与泛化性。该技术显著提升低资源语言零样本迁移能力与混合语码鲁棒性,已在跨境电商客服、跨国法律比对

weixin_30920853的博客 423

从零DIY AR眼镜:硬件选型、软件架构与实战调试全解析

增强现实(AR)技术通过将虚拟信息叠加到真实世界,为用户提供沉浸式交互体验,其核心在于虚实融合的光学显示与实时数据处理。从技术原理上看,AR系统通常由显示模组、计算单元、传感器和交互模块构成,通过特定的光学方案(如BirdBath、光波导或自由曲面棱镜)实现图像投射,并依赖嵌入式系统或移动设备进行图形渲染与空间计算。这项技术的工程价值在于能够构建轻量化、低功耗的个人信息助手,提升日常效率。其典型应用场景包括辅助导航、实时信息提示与交互式学习等。本文以自制AR眼镜项目为例,深入探讨了基于自由曲面棱镜和ESP3

weixin_30591551的博客 388

【网易公开日】《梦幻西游》手游服务器如何实现200万玩家同时在线?(技术篇)

去年,网易游戏学院成立并举行首个公开日活动,现场众多重量级嘉宾的干货分享深受广大游戏从业者的认可。6月27日,网易游戏学院第二届公开日活动在广州网易大楼开启,本次为网易游戏学院的技术专场,分享主题为《技术进步引发的灵感革命》。 以下为游戏陀螺整理的部分内容分享。 3 月26日,《梦幻西游》手游登陆iOS平台,它在上线两个多月的时间里,就创造了2000万注册用户,204万玩家同时

linking530的专栏 1007

五段式S型算法笔记

又因为有 v-v0= 0.5jt通式: 所以有 vm-v0= 0.5jtm 所以有4vm-4v0= 2jtm。算法1: v=2vm-v0-0.5*jt+2jt*tm-2jtm*tm。加加速度j 自己设置 已知,vmax自己设置已知;所以有4vm-4v0= 2jtm带入算法1。

qq_36658033的博客 680

[COPY] 《梦幻西游》手游服务器如何实现200万玩家同时在线?(技术篇)

去年,网易游戏学院成立并举行首个公开日活动,现场众多重量级嘉宾的干货分享深受广大游戏从业者的认可。6月27日,网易游戏学院第二届公开日活动在广州网易大楼开启,本次为网易游戏学院的技术专场,分享主题为《技术进步引发的灵感革命》。 以下为游戏陀螺整理的部分内容分享。 3 月26日,《梦幻西游》手游登陆iOS平台,它在上线两个多月的时间里,就创造了2000万注册用户,204万玩家同时在线,全

lienen的专栏 1082

汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发

为了兼容这部分手机,车机端在向手机端发送USB控制命令字的同时,需要启动mDNS Server,广播车机端IP地址和HiCar SDK侦听的Server Socket端口(IP地址和端口在HiCar SDK初始化USB driver时,告知车机),在检测到手机断开USB连接时关闭mDNS Server。厂商在集成HiCar SDK开发HMI应用时,不可避免会使用到智能座舱的敏感权限,例如位置权限、摄像头权限、麦克风权限等,SDK初始化时,厂商HMI应用需要设置必要的车机参数供SDK使用。

码农17年的博客 1075

第一讲:halcon模板匹配捆绑测量矩形检测芯片针脚

使用halcon模板匹配捆绑测量矩形,检测位置发生变换的芯片针脚缺陷。

uiopmn1的博客 2994
上一篇: 鸿蒙真机帧率崩了:ArkUI 呼吸动画 GPU/Canvas fallback 排查全过程
下一篇: 我做了一款 HarmonyOS 订阅管理 App:用「斩」这个动作,让停掉订阅变得有成就感
SameX-4869
博客等级 码龄17年 3354粉丝 657原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值