世界を動かす技術を、日本語で。

うっかり「PureGym」の非公式Apple Wallet開発者になってしまった

概要

  • PureGymの入館体験 の非効率さとUXの問題点を指摘
  • 8年間変わらないPINコード と毎分更新されるQRコードのセキュリティ矛盾
  • Apple Wallet連携による入館高速化 の実現プロセス
  • API解析・自作バックエンド・自動化 の技術的アプローチ
  • エンジニア視点の教訓 と倫理的ジレンマ

47秒:悪役誕生の瞬間

  • PureGymの入口 でアプリ起動、電波の悪さに苦戦
  • WiFi接続→アプリ起動→QRコード表示 まで47秒かかる現実
  • 無駄なフィード・通知・オファー表示 が体験をさらに悪化
  • 6日/週のジム通いで毎週282秒 を無駄に消費
  • Amazon Freshのシームレス体験 との対比によるUXへの不満

8年間変わらないPINの謎

  • 8桁PINコード が8年間変更不要で利用可能
  • QRコードは1分ごとに更新、まるで機密情報のような扱い
  • 物理キーパッドは古いPINでOK、デジタルは過剰なセキュリティ
  • セキュリティ・シアター (見せかけの安全性)の典型例
  • APIパスワードも8桁PIN で、実質的なセキュリティの形骸化

mitmproxyで見えた真実

  • QRコードのスクリーンショット運用に失敗
  • PureGymのQRコードは動的で1週間有効、1分ごとに更新
  • GitHub上にAPI情報が多数公開、エンジニアの不満の証拠
  • API認証はベーシック認証+PINのみ、実質的な無防備
  • mitmproxy等で通信を解析、QRコードの生成ロジックを特定

PassKit:Apple Wallet連携

  • Apple WalletのPassKitは自己更新・通知・位置連動可能
  • Pass作成にはJSON、画像、署名、Webサービスが必要
  • 証明書取得と署名作業は非常に煩雑
  • .pkpassファイル(ZIPアーカイブ)で動作
  • Walletパスはロック画面表示や自動更新も可能

Swift製バックエンドの構築

  • Node.jsではなくSwift(Vapor)でサーバー構築
  • デバイス登録・Push通知・パス配信のAPIを実装
  • QRコード更新時にサイレントPushで自動反映
  • ユーザーは操作不要で常に最新のQRコードを利用可能
  • Apple Watchとも自動連携、3秒で入館完了

ジム位置情報とロック画面表示

  • PureGym全店舗の座標をAPIから取得・スクレイピング
  • 最寄り店舗情報をパスに追加し、ロック画面自動表示を実現
  • ショッピングセンター内店舗の場合、買い物時も表示されるジレンマ

Apple Watch連携

  • Walletパスは自動でApple Watchに同期
  • サイドボタン2回で即表示・スキャン可能
  • 入館時間は3秒、従来比93%短縮

効果測定

  • 従来:47秒→Wallet運用:3秒
  • 週6回通うことで年間3.8時間の短縮
  • 他の会員から「公式アプリ?」と23回聞かれる現象
  • 著作権や公式非対応の説明も同数回発生

ボーナス:Home Assistant連携

  • ジム混雑状況APIを利用し、Home Assistantに表示
  • 混雑状況データで効率的なジム通いを実現
  • 自分の“避け力”のデータ分析も可能

不都合なエンジニアの真実

  • 週末だけで解決した問題、企業は何年も未対応
  • ユーザー体験はJiraやKPIよりも重要
  • 外部エンジニアのプロトタイピング力の高さ
  • 公式未対応の理由(優先度・KPI・ロードマップ)も推察

倫理的ジレンマ

  • 利用規約違反の可能性、明日にもAPI変更で利用不可リスク
  • 個人利用に限定、サービス公開はせず説明対応
  • キャッシュ活用・自動化制限・破損時の覚悟
  • パッケージ化の是非は保留

エンジニア視点でのUX改善・API解析・自作連携の実践例 として、現状アプリの課題、セキュリティの矛盾、Apple Wallet連携のメリット、そして倫理的な配慮までを網羅的に解説。

Hackerたちの意見

「その機能を作ったら、私たちが責任を持たなきゃならないね。」 「その通り、2028年のロードマップに入れておこう。」 これが私のテック業界での経験だね。

うちの部署の会議で、ロードマップや計画について話し合う経験から言うと、「これでお金稼げるの?だってやるのにはお金かかるし」って感じなんだよね。ほんとそれだけシンプル。やることリストは実際に長いけど。今、PureGymができる一番いいことは?アプリのために数千ドル払って、その人に生涯会員権をあげることだね。

「Apple Walletを実装しない理由はとても良くわかる。」 スクリーンショットを見る限り、モバイル最適化されたウェブサイトの薄いラッパーみたいだし、せいぜいFlutterみたいなものだね。だから、AppleのAPIの奥深い部分に詳しい社内開発者がいる可能性は低いと思う。

そうだね、もしApple Walletを追加したら、Android Walletも作らなきゃいけなくなるし、それでメンテナンスするコードが増えちゃう。でも、社内アプリは起動時にQRコードを常に表示するようにできるかもね。

なんで学ばないんだろう?Googleもあるし、Stack Overflowもあるし、LLMもあるのに。俺の皮肉な見方だと、UXに気を使ってる人がいないんじゃないかな。おそらく、バックエンドを作ったチームはもういなくて(辞めたか解雇された)、今は最安のエンジニアたちが運営してるだけのスケルトンチームなんだろうね。

アプリはスマホに入れてるよ(PINキーパッドを使ってるだけだけど)。実際、彼らのウェブサイトをラッピングしただけのものだね。

俺はいつも物理的なPINコードを使って入ってる。アプリがちゃんと読み込まれるか信じられないからね。だから、こういうのを見るとすごく納得できる。

PureGymには行ったことないんだけど、PINパッドを使って入るってことは、無人の24時間営業のジムみたいな感じなのかな?それとも、もしスタッフがいるなら、昔みたいに「こんにちは」って迎えてくれればいいのにね。

PINとアプリはどっちもひどいアイデアだと思う。私が通ってるジムは、ターンスタイルやロッカー用にNFCリストバンドを使ってるよ。

これって、毎分プッシュ通知を送って新しいコードをダウンロードするように携帯に指示するってこと?そうだとしたら、バッテリーの問題になりそうだね…。

記事には毎週更新が必要だって書いてあったから、せいぜい週に一回だと思う。

バックグラウンドプッシュ通知を送ることができて、電話が受け取れる準備ができたときに配信されるよ。バッテリーが少ないときや省電力モードのときは配信されない。バッテリー消費を減らすために特に作られてるんだ。優先度の高いプッシュ通知は、ユーザーが目にするUI要素が必要で、特定の低電力状況でも配信できるよ。

セキュリティシアターについて:俺のクソ会社を運営してるバカどもは、ログインするためにメールアドレスとパスワードだけじゃなくて、セキュリティ質問も求めてくるんだ。しかも、請求書を払うためにね。これが使える機能なんだ。例のセキュリティ質問:好きな本。もちろん、大文字小文字も区別される。誰かがこれを書いたせいで、俺のパスワードを盗まれて請求書を払われるのを防ごうとしてるんだ。

昔は、どの会社も自分たちが次のFacebookだと思って、明日には100万人のユーザーがどこからともなく現れて同時にログインしようとするから、複雑で超スケーラブルなアーキテクチャを作る必要があるって考えてた。今はみんな自分たちが次のExperianだと思って、明日には100万人のハッカーが攻撃して、みんなのプライベート情報を盗むって考えてる。

ゴミ会社はメールアドレスとパスワードだけじゃなくて、セキュリティ質問も要求する。これをやってくれて本当に助かる。だって、ゴミと同じメールアドレスとパスワードをビットコインウォレットや証券口座、オンラインの愛人探しアプリでも使ってるから。

私の電力会社は、以前は請求額をメールに含めてくれてたんだけど、それを銀行アプリで支払ってたんだ。でも、そんなの面白くないよね!だからアプリを作ったんだ。アプリなしの電力会社に何の意味があるんだって。メールから金額を削除して、指先を鍛えるためにわざわざアプリを開かないと金額が見れないようにしたんだ。アプリには支払い機能もあるみたいだけど、私ってちょっと意地悪なところがあるから、それを使うのは拒否して、信頼できる銀行アプリでまだ支払ってるよ。

これ、ChatGPTのつまらない話みたいだね。

君が探してる言葉は「くだらない」だよ。

根拠のないLLMの非難は好きじゃないけど、コードのコメントの部分 > // デバイスはアップデートを求めてる!そのプッシュトークンを2010年のビットコインみたいに保存しろ…には思わず眉をひそめちゃった。あと、エムダッシュとハイフンの混在や、ページ上のAI生成画像も気になった。

AIのダッシュと手動のダブルハイフンが混ざってるから、可能性が高いね。

いくつかスペルミスがあったよ。

俺にはそうは思えない。AIが書いたものは、ストーリーに事実や色を加えない無関係な詳細があるから分かるけど、これはそういうのがあまりない。脱線する部分は人間らしくて、AIが人間の真似をしてる感じじゃない。エムダッシュみたいなものはAIを検出するにはすごく悪い方法だよ。文法的に良くてテキストの可読性を高めることもあるし、カールした引用符も同様。俺は普段から使ってるし、Appleのプラットフォームがこれを強調してきたから、このiOS開発者も同じように感じてるんじゃないかな。

100% 「宝の山?あなたの8桁のジムのドアPINはあなたのAPIパスワードで、たぶん自分で設定してないよね。iPhone 8が最先端だった頃から変わってない同じPIN。」これはそのままChatGPTからの引用。

いい投稿だね!エンジニアの本質をうまく捉えてる。面白くて、興味深くて、インスピレーションも与えてくれる。おめでとう!君は心の中でハッカーだね。アメリカに3ヶ月行ったとき、PureGymに入会してPIN番号をもらったんだけど、その後会員をキャンセルしたんだ。そしたらある日、Chromeが「PureGymのPINが漏洩したかも」って教えてくれた。2年後にまたアメリカに行って再入会したら、同じPINをもらったよ。めっちゃ危険信号だよね。それにアプリやトークン、PINにも興味を持ったんだけど、ハイドロマッサージチェアを起動するシステムにセキュリティの欠陥を見つけたことを覚えてる。自分のPINでも他のPINでも受け入れちゃうんだよね、全然セキュリティがない。

「ChromeがPureGymのPINが漏洩したって言った」これはおそらく誤検知だね。Chromeがhaveibeenpwned APIを使ってる場合。例えば、PINの87623103は558B4C37F6E3FF9A5E1115C66CEF0703E3F2ADEEにハッシュされる。HaveIBeenPwnedから範囲を取得して、https://api.pwnedpasswords.com/range/558B4 を検索して、C37F6E3FF9A5E1115C66CEF0703E3F2ADEEを見たら「漏洩済み」で、過去に3回見られてるってことだね。」

「宝の山?8桁のジムのドアPINがAPIパスワードで、たぶん自分で設定したわけじゃないよね。失敗した試行回数に制限があることを願ってる。だって、誰かのメールアドレスを知ってたら、その後すぐにAPIアクセスできちゃうってこと?それに、要求できるスコープが適切に制限されてることを信じてるよ。」

「Apple Developer PortalからのPass Type ID証明書、これっていくらかかるの?Apple Walletのパスを作りたいんだけど、Apple Developerアカウントを設定するのが面倒で、さらに料金がかかるのが心配なんだ。」

私が知る限りでは、基本製品に含まれてるよ。でも、アクティブに保つためには毎年開発者サブスクリプションを更新しないといけないね。