Appearance
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 ペアリングがコンセプト最大の山)。