Upgrade to Pro — share decks privately, control downloads, hide ads and more …

山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー

Avatar for hinakko hinakko
September 13, 2026

山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー

iOSDC Japan 2026

Avatar for hinakko

hinakko

September 13, 2026

More Decks by hinakko

Other Decks in Technology

Transcript

  1. 個人開発アプリv1.0 概要 iOS 17+ / SwiftUI + SwiftData • 駅チェックイン

    GPS の距離計算で自動発火 +手動ボタン • 位置追跡・地図 3D起伏(.realistic)/進行方向に地図を回転 • 経路案内 MKDirectionsを位置更新のたびに再計算 • 歩行データ HealthKit(距離・歩数・カロリー)
  2. v1.0課題②: バッテリーが持たない • iPhoneのバッテリー消耗が激しい • モバイルバッテリーで2機使用した • 端末発熱が著しい 原因 •

    3D地図の常時GPU描画 GPS最高精度の常時稼働 →バックグラウンドのアプリの設計そのものを見直す必要があった
  3. v1.1改善: GPS・測位の構造を変更 ① CLLocationManager の精度を見直す ② 静止時に測位を止める v1.0 v1.0 desiredAccuracy

    = activityType は未設定(.other 扱い) kCLLocationAccuracyBest pausesLocationUpdatesAutomatically = false v1.1 v1.1 desiredAccuracy = fi kCLLocationAccuracyNearestTenMeters activityType = . tness pausesLocationUpdatesAutomatically = true
  4. v1.1改善: バックグラウンド前提のアプリ設計に見直す v1.0 バックグラウンドでも止めない manager.allowsBackgroundLocationUpdates = true manager.pausesLocationUpdatesAutomatically = false

    manager.startUpdatingLocation() v1.1 ライフサイクルで切替 func handleEnterBackground() { manager.stopUpdatingLocation() manager.startMonitoringSignificantLocationChanges() } func handleBecomeActive() { manager.stopMonitoringSignificantLocationChanges() manager.startUpdatingLocation() manager.monitoredRegions.forEach { manager.requestState(for: $0) } }
  5. v1.1改善: 再描画と再計算の範囲を絞る ④ 3D地図 → 2D地図・回転追従OFF v1.0 .mapStyle(.standard(elevation: .realistic)) cameraPosition

    = .userLocation( followsHeading: true, fallback: .automatic ) v1.1 .mapStyle(.standard(elevation: .flat)) cameraPosition = .userLocation( followsHeading: false, fallback: .automatic )
  6. パフォーマンス比較の条件と方法 v1.0.0: iPhone14Pro (iOS26.6) バッテリー最大容量 88% v1.1.0: iPhone14Pro (iOS26.6) バッテリー最大容量

    88% 同一ルート・同条件で計測 • 低電力モードをオフ • 明るさの自動調節をオフ • 輝度を50% • 自動ロック 30秒
  7. HealthKitとCMPedometerの計測方法 検証条件 • タイマーでCMPedometerと 計測値 API / メソッド 取得する値 CMPedometer

    CMPedometerData .queryPedometerData .numberOfSteps 比較での使用用途 HealthKit同時にクエリ実行 • 山手線一周サンプルを収録 • 30駅ごとに区間(駅間)単位で も比較 HKStatisticsQuery HKStatistics .sumQuantity() CMPedometerの歩数 HealthKitの歩数
  8. HealthKitとCMPedometerの比較結果 区間ごとの歩数・距離(東京駅を起点に3区間) 区間 有楽町→新橋 (約0.9km) 有楽町→新橋 (約1.2km) 新橋→浜松町 (約1.3km) CMPedometer

    歩数 HealthKit 歩数 CMPedometer 距離 HealthKit 距離 1,263歩 0歩 0.881km 0.000km 1,747歩 1,045歩 1.168km 0.684km 2,096歩 1,033歩 1.386km 0.685km 駅間のような短い区間ではHealthKitは即時反映ができない
  9. 解決①: 駅の区間ごとの歩数が動かない 採用 CMPedometer • 歩数と距離の反映が速い HealthKit • 取得可能なデータが幅広い (心拍数・血圧・睡眠)

    • Capability追加が不要 • 取得までに時間がかかる 歩数と距離の即時反映の面でCMPedometerを採用
  10. 計測方法 バッテリー消耗量とCPU使用量の比較 指標 バッテリー残量 API / メソッド 算出方法 比較での使用用途 UIDevice.current

    開始(%) - 終了(%) 消費速度算出(%/h・%/km) .batteryLevel /経過時間 の主指標 CPU使用時間 task̲info(TASK̲BASIC̲INFO) (累積) → user̲time + system̲time セッション完了時の バージョン間の総CPU負荷を比 累積のCPU時間 較