Skip to content

hi-yu MVP:設計見直し〜iOS UI 実装

ペアの 2 人が相手の「方向と距離感」だけを感じるアプリ hi-yu。設計書 v0 のレビューから iOS 実装まで一気に進めた。

主要な意思決定

  • 技術スタックを Flutter + Firebase → SwiftUI + CloudKit + APNs に変更(iOS 先行)。
    • 理由:センサー/背景位置/省電力が肝でネイティブが素直、CloudKit は無料・iCloud=ID で 機種変更でもペア維持・位置を自前サーバーに送らず審査が楽。
    • トレードオフ:Android は作り直し(CloudKit ロックイン)。MVP は検証目的なので許容。
  • 位置プライバシーは「生座標を共有し各端末で計算」方式(クライアント計算)で確定。
  • バックエンドはサーバーレス(CloudKit 共有ゾーン+端末計算、近接判定も端末)。

実装したもの(すべて無料 Apple ID・実機で動作確認済み)

  • HiYuCore(SPM):距離/方位/表示角度・距離バンド・鮮度・近接通知判定(テスト 30 項目合格)。
  • 星空テーマのメイン画面:自分=中央の星、相手=方向の星(近いほど大)、空が夜空→ピンク、 背景星空、呼吸する halo。
  • 相手のアイコン写真を相手の星の芯に(PhotosPicker・端末ローカル保存)。
  • ふりふり演出:ハートのバースト(全画面・発生1〜3s/寿命3s/全体6s)→ 相手方向へハートが飛ぶ (左小→右小→中央大、弧を描く)。送信は正面±35°のときだけ。受信は飛行→バーストの逆順。
  • チュートリアル(初回+ヘルプ・日英・SwiftUI ベクター図解 5 枚)。
  • オンボーディング:ペアリング選択/招待QR/受取/位置共有同意/権限事前説明。
  • 設定:通知・電池の 3 段階バー、長押し解除ゲージ、言語、相手写真。

設計上の学び

  • 鮮度は「位置の古さ」ではなく「つながり(presence)の新しさ」で判定すべき。 背景の位置更新は移動イベント駆動なので、静止中に位置時刻基準だと接続中でも old 化する。 presence/lastSeen を別に持ち now - lastSeen で鮮度を出す。
  • 演出方針:不規則な揺れ・コンパス精度ぼかしは世界観に合わず不採用。鮮度はぼかしで表現。

環境・ビルド

  • Xcode 26.5。プロジェクトは XcodeGen 生成(ファイル追加時 xcodegen generate)。
  • Bundle ID hiyu.yur4.net、無料 Personal Team(TEAM 5W85D9C7S8)で自動署名・実機インストール。
  • CLT のみだとテスト FW(XCTest/Testing)が無く、ロジック検証は実行ターゲット(swift run)で。
  • 詳細手順とコード構成は project リポジトリ docs/実装状況.md。

未完(要 Apple Developer Program $99)

CloudKit 実同期 / CKShare 実ペアリング / presence / 背景位置(significant change) / Push通知。 次マイルストーンは CloudKit 着手(CKShare ペアリングがコンセプト最大の山)。