- PureGym アプリの動作の遅さと複雑な入館手順の不便さを解消するため、個人的に Apple Wallet 向けへ最適化した
- 既存の QRコード は毎回アプリを開いて情報を読み込む必要があり、約47秒かかる非効率な入館方式だった
- さまざまな リバースエンジニアリング、mitmproxy の使用、PassKit フレームワークなどの技術的プロセスを通じて、自動更新可能な Wallet パス を実装した
- この過程で PIN コードのセキュリティ上の弱点、API 認証構造、店舗の位置情報など、Web 上で見えてくる PureGym の内部動作を確認した
- 最終的に 3秒で入館 できるユーザー体験を作り上げ、個人的な実験にとどめ、公式サービスではないこと を明確にした
47秒: 不便さの始まり
- 平日の午前11時15分、PureGym の入口でアプリを開くのに47秒かかった
- 電波が弱く、Wi-Fi 接続とアプリ起動、各種プッシュ通知、特別割引の提案などを越えてようやく QR コードが表示される
- 実際に QR コードが出るまで時間がかかり、ほかの会員の視線も気になる
- これを週6回繰り返すと、毎週282秒が失われる非効率な体験になる
- Amazon Fresh のようなシームレスな体験と比べると、PureGym の入館 UX は大きく見劣りする
8年間変わらない PIN の謎
- 筆者は 8桁の PIN コード を8年間ずっと同じまま使っている
- この PIN は失効も変更もされない
- 一方で アプリ内の QR コード は1分ごとに新しい値へ置き換わる
- 実質的なセキュリティ水準と実装の間に大きな矛盾が存在する
- PIN 方式は極端に長く維持される一方で、QR コードだけが厳格に保護されるという「セキュリティの見せかけ」になっている
mitmproxy で PureGym を理解する
- 最初は QR コードのスクリーンショットを Apple Wallet に入れて使おうとしたが、すぐに動かなかった
- PureGym の QRコード は動的に生成され、おおよそ1週間で失効するが、アプリでは1分ごとに更新される
- GitHub で "PureGym" 関連のリポジトリを検索し、API 認証構造を見つけた
- ログイン用の8桁 PIN が API パスワードとしてもそのまま使われていた
- Base64 でエンコードされた Basic 認証情報もセキュリティは低かった
- アプリのトラフィックを分析するため、mitmproxy などのプロキシツールでリクエストを傍受した
- QR コードの JSON 構造は part1(固定 id)、part2(タイムスタンプ)、part3(更新用 salt)で構成されていた
- API は更新タイミングや失効条件まで案内していた
PassKit: Apple Wallet の可能性
- Apple Wallet パスは静的なカードではなく、自動更新・プッシュ通知・位置反応などが可能なミニアプリのような仕組みだ
- PassKit の実装には JSON 仕様、画像リソース、証明書署名、リアルタイム更新用 Web サービスなどが必要だ
- Apple のデベロッパーポータルで Pass Type ID と WWDR 証明書の発行が必要になる
- 証明書の署名と管理は煩雑だが、成功すれば実機で滑らかな体験が実現できる
Swift バックエンド構築
- 一般的には Node.js を使うが、筆者は Swift ベースの Vapor で PassKit Web サービスを自作した
- パスの更新が必要になると、サイレントプッシュで自動更新を提供する
- ユーザーが意識しない自然なパス更新を実現した
全国の PureGym 拠点を自動化
- Apple Wallet パスは指定した場所で自動表示できる
- PureGym の公式サイトには詳細な座標がないが、API から全国店舗の座標リストを取得できた
- すべての店舗座標をパースし、各パスに最寄りの店舗を設定した
- 欠点として、ショッピングセンター内の PureGym では、ただ買い物に行くだけでもパスが表示されるという小さな不便がある
Apple Watch 連携
- Apple Wallet パスは追加の作業なしで Apple Watch に自動同期される
- 手首でダブルクリックしてスキャンし、入館まで 3秒 へと大幅に短縮された
- 93%以上の時間短縮を実現した
数字で見る変化
- 従来の PureGym アプリでの入館時間: 47秒
- Apple Wallet パスでの入館時間: 3秒
- 1週間あたりの平均削減時間: 4.4分(年間3.8時間)
- 周囲の会員から「こんなアプリあるの?」と23回聞かれ、そのたびに非公式だと説明した
- 要望はあるが、著作権やサービス規約の都合上、配布する予定はない
おまけ: Home Assistant 連携
- PureGym API の 館内人数 エンドポイントを通じて、IoT ダッシュボードに現在のジム混雑度を表示した
- データに基づいて空いている時間に再訪する判断ができ、トレーニング効率やモチベーション向上にもつながった
エンジニアリングの現実と倫理
- もともとは純粋に個人的な不便を解消するためだったが、PureGym 内部では何年も改善されてこなかった領域だった
- 組織の外で作られたプロトタイプが、ときに公式ロードマップより早く問題を解決する
- ただしこれは公式には利用規約違反となる可能性があり、PureGym がいつでも遮断できる
- 自動化や共有は一切行わず、あくまで個人実験用途に限り、安定性のためキャッシュなどの原則も守った
次のステップと締めくくり
- 今後は「羞恥心プッシュ通知」のような拡張アイデアも提案できる
- 実質的な効用は小さくても、年間3.8時間の「不要な操作」を最適化できたことに満足している
- PureGym が公式実装すれば、より多くの利用者の利便性を高められる
- 「非公式だが効果的な体験」を生み出した事例として記録された
まだコメントはありません。