出于对 PureGym 应用程序长达 47 秒的繁琐入场流程的极度不满,一位开发者通过逆向工程其 API,为自己打造了一个解决方案。他利用苹果的 PassKit 框架和 Swift 后端,创建了一个能自动更新二维码的 Apple Wallet 通行证,将入场时间缩短至仅需 3 秒。这个个人项目不仅解决了核心痛点,还额外实现了健身房位置提醒和实时人数监控等功能,生动地展示了当大公司忽视用户体验时,个人开发者如何以技术和热情填补空白。
一场长达 47 秒的噩梦
在健身房门口,打开手机、连接信号不佳的 Wi-Fi、启动 PureGym 应用,整个过程充满了不必要的等待。应用会加载你永远不会做的推荐锻炼、过时的活动记录和心灵鸡汤语录,还会弹出各种请求。最终,点击“进入健身房”后,二维码才姗姗来迟。
- 整个过程耗时: 47 秒。
- 每周重复频率: 6 次。
- 每周浪费时间: 282 秒。
对于一个以优化 iOS 应用为生的人来说,每天忍受这种糟糕的用户体验简直是一种折磨。相比之下,亚马逊的无人商店能让顾客直接拿走商品,而进入健身房却像是在完成一项移动设备障碍赛。
荒谬的安全悖论
这个项目中最令人费解的一点,是 PureGym 矛盾的安全策略。
- 8 位数的 PIN 码: 八年未变,从未过期,可以在任何健身房的实体键盘上使用。
- 应用内的二维码: 每 60 秒刷新一次,仿佛在保护国家机密。
这就是典型的 安全作秀 (security theatre)。就像给前门装了一把价值一万英镑的智能锁,却把窗户都开着。
实体键盘暴露在外,接受着一个古老的 PIN 码;而数字二维码却需要堪比国安级别的加密轮换。这种设计逻辑让人啼笑皆非。
揭开 API 的神秘面纱
最初,作者天真地尝试截取二维码图片并将其作为静态卡片添加到 Apple Wallet,结果在第二天就因二维码失效而失败。这证实了二维码是动态的。
通过在 GitHub 上搜索,发现已有其他开发者对 PureGym 的 API 进行了探索。结合 mitmproxy 等代理工具拦截应用流量,作者得以亲眼见证其工作流程。
- 认证接口: 使用用户的 8 位数 PIN 码 作为 API 密码,授权信息
ro.client:甚至没有经过像样的加密。 - 二维码接口:
GET https://capi.puregym.com/api/v2/member/qrcode - 接口响应: 返回的数据明确告知二维码的刷新时间为 1 分钟后,尽管其过期时间长达一周。这等于是在请求客户端每分钟轮询一次。
用 PassKit 和 Swift 打造解决方案
解决方案的核心是利用苹果的 PassKit 框架,它允许 Apple Wallet 中的通行证动态更新。
构建一个动态通行证需要:
- 一个 JSON 清单文件。
- 符合特定尺寸的图片。
- 复杂的加密签名过程。
- 一个用于处理更新和推送通知的 Web 服务。
作者选择使用自己熟悉的 Swift 语言和 Vapor 框架来构建后端服务。当通行证需要更新时,后端会向设备发送一个静默的推送通知。手机收到通知后,会自动在后台获取包含新二维码的通行证文件,并更新 Wallet 中的卡片,整个过程对用户完全透明。
最棒的部分是:当二维码需要更新时,我只需发送一个静默的推送通知。设备会自动唤醒,获取新的通行证,更新二维码,而用户对此一无所知。
意外收获:更多实用功能
在深入研究 API 的过程中,作者还发现了一些可以利用的额外功能。
- 位置感知: 通过抓取
https://capi.puregym.com/api/v1/gyms/接口提供的全英所有 PureGym 的地理坐标,他可以将附近健身房的位置信息添加到通行证中。这样,每当他靠近任何一家 PureGym 时,通行证就会自动出现在手机锁屏上。 - Apple Watch 支持: Apple Wallet 通行证会自动同步到 Apple Watch,无需任何额外开发。现在,他只需双击手表侧边按钮,用手腕扫描即可进入,全程仅需 3 秒。
- 健身房人数监控:
https://capi.puregym.com/api/v1/gyms/{id}/attendance接口可以返回健身房内的实时人数。作者将这个数据集成到了自己的 Home Assistant 智能家居面板中,以便在出门前判断健身房是否拥挤。
项目成果与反思
这个周末项目带来了惊人的效率提升,也引发了一些关于产品开发的深思。
- 原始应用时间: 47 秒
- Apple Wallet 时间: 3 秒
- 效率提升: 93%
- 每年节省时间: 3.8 小时
但用户不关心你的 Jira 工单。他们关心的是 体验。有时候,我们这些身处组织之外、手持
mitmproxy和过多空闲时间的人,可以比一场规划会议更快地将这些体验原型化。
PureGym 可能有其内部的产品路线图和优先级考量,导致这个显而易见的体验问题迟迟得不到解决。但这个项目证明,有时最好的功能创新来自于外部。虽然这种行为可能在技术上违反了服务条款,但它也直接回应了用户的真实需求。目前,作者满足于享受自己优化的成果,并笑称如果 PureGym 的人看到这篇文章,他很乐意聊一聊。