这名开发者分享了为 Apple Watch 打造优秀地图体验的长达六年的历程。整个过程始于一个依赖服务器生成地图的简陋原型,随后为了性能和离线功能,转向自研一个完全基于 SwiftUI 的地图渲染引擎。在解决了技术基础后,最大的挑战在于界面设计,开发者在地图交互性和数据显示之间反复挣扎,尝试了多种布局但都不理想。最终,通过与制图师合作,为 watchOS 的 Liquid Glass 风格量身定制了新的地图底图和深色模式,并在一系列迭代后,在专业设计师的帮助下,确定了最终的交互方案,实现了他心目中 App Store 上最好的 watchOS 地图体验。
最初的探索与局限
作者从 Apple Watch 推出之初就渴望在手腕上拥有一张好用的地图。早期的尝试完全依赖服务器生成地图图像,这意味着每次刷新都需要将数据发送到服务器再传回,这种方式速度缓慢、无法离线使用,仅能用来验证想法,不具备实用性。
为了真正取得进展,开发者意识到必须在更底层的层面上工作。
自研地图渲染引擎
开发工作的核心是构建一个完全由 SwiftUI 驱动的原生地图渲染引擎。选择 SwiftUI 是因为它当时是 watchOS 唯一支持的框架,并且这一选择也为后续将地图功能集成到小组件中提供了便利。
到 2021 年,这个引擎已经能够可靠、高效地在 watchOS 上渲染瓦片地图,并叠加位置信息。
我知道,如果我想朝着这个目标前进,我需要在更低的层次上工作。
漫长而痛苦的界面设计
为 watchOS 设计应用是一个充满乐趣但又令人沮丧的挑战。你需要在极小的屏幕上进行设计,并且必须考虑到用户单手操作的场景。
开发者最初采用了一种“模态”方法,通过按钮在地图和数据指标屏幕之间切换。但这感觉像是一种糟糕的妥协,因为它为了实现地图的平移和缩放,牺牲了流畅的滑动体验。
- 核心矛盾:如何让用户既能自由地与地图交互(平移/缩放),又能通过滑动查看其他锻炼指标。
- 失败的尝试:开发者尝试了无数种设计,试图将指标放在屏幕底部或其他位置,但这些设计都存在一个根本问题——它们都只能显示一组固定的数据字段,缺乏灵活性。
- 设计原则:在 watchOS 上,任何需要用户花费超过几秒钟的交互都应该避免。因此,提供一个需要用户自行配置的复杂界面不是一个好的选择。
为新系统定制地图视觉
当开发者仍在为界面布局挣扎时,Apple 推出了以 Liquid Glass(液体玻璃)设计语言为特色的新版 watchOS。这种风格强调元素的层叠感和特定的色彩搭配。
开发者发现之前使用的 Thunderforest Outdoors 地图底图在 Liquid Glass 效果下表现不佳。于是,他做出了一个重大决定:
- 委托定制地图:与制图师 Andy Allen 合作,创建了一款全新的、为 Liquid Glass 优化的地图底图。
- 视觉优化:他们简化了地图视觉元素,提高了对比度,并增加了元素的饱和度,以防止在玻璃效果下变得模糊不清。
- 引入深色模式:这次合作也带来了另一个机会——终于可以为地图创建深色模式版本。这在 watchOS 上尤为重要,能让地图在手臂长度的距离上保持极高的可读性。
最后的冲刺与定稿
虽然有了出色的地图视觉,但应用的整体设计仍然不匹配。为了打破设计僵局,开发者寻求了设计师 Rafa Conde 的帮助。
这次合作很快就取得了成果。最终的设计方案是:
将数据指标层叠在屏幕的左上角,地图本身作为一个垂直堆栈的顶部页面。这种设计通过要求用户先点击地图进入“浏览模式”来解决交互问题。
这个方案巧妙地平衡了信息显示和地图交互的需求。经过数百英里的实地测试和细节打磨,开发者最终确定了现在发布的设计。这个设计既感觉是 watchOS 的原生体验,又具有独特的创新性。
为什么不直接使用 MapKit?
尽管苹果后来在 watchOS 上推出了 MapKit,但作者解释了为什么坚持使用自己的定制方案。他认为 MapKit 虽然适用于基本用途,但在可配置性和功能性上远不能满足他的需求。
- 缺乏用户选择:watchOS 上的 MapKit 强制使用深色模式,剥夺了用户的选择权和某些场景下的可访问性。
- 功能限制:在动画和自定义覆盖物方面,MapKit 的功能仍然有限。
- 地图覆盖范围不足:在许多地区,尤其是一些偏远的徒步路线上,MapKit 的地图信息几乎是空白的,而定制地图可以提供更丰富的细节。