カルボナーラ街道

計測と観察

自分用運動記録アプリ ver.3を作った

開発環境

$ Xcode 14.3
Build version 14E222b

モチベーション

  • 運動継続のモチベーションを維持したい
  • 距離・時間・回数を月ごとや年ごとにまとめたい
  • 公式のフィットネスアプリやヘルスケアアプリもあるが、前述の情報をまとめて見るには自分で作るしかない

つくったもの

データはHelathKit*1、見た目はSwiftUI、グラフはSwift Charts*2を使った。

自分の実データ。ほぼ家にいる割に結構運動できてる。

過去ver

ver.1 ver.2

ver.1はiOSアプリ書き始めのころに勉強用に作った。ver.2は走行距離の合計を出したかったのと、WWDC22で発表されたSwift Chartsを試すために作った。

今回は自分で長く使うために距離・時間・頻度といったモチベーションの維持に有用そうな数値を月ごとや年ごとに表示するために作った。今までは勉強というか、試す側面が強かったけど今回は実用性を強く意識して作った。

メモ

屋内のワークアウト判定はmetadataから取る

屋内の自転車、HKWorkoutActivityType*3に定義が無くて手間取った。

対応として、metadataとして屋内か否かの情報を持っているので取る。

// workout: HKWorkout
if let isIndoor = workout.metadata?[HealthKit.HKMetadataKeyIndoorWorkout] as? Int {
    return isIndoor == 1 ? .indoorCycling : .cycling
} else {
    return .cycling
}

Apple Watchや公式のフィットネスアプリでは屋外・屋内は別物扱いされているので定義があると思ったよ〜

Chartには整頓したデータを渡すと良いかも

ワークアウトの配列をそのままChartに渡すと、少なくともBarMarkを使う場合は同じY軸の値ごとにまとまらなかった。

対応として、X軸としてDateを評価させるが、表示するアイテムとしてはまとまりをもたせて配列に入れてあげるとグラフのバーの色がまとまるので表示が綺麗かも。

今回の場合だと、

  • 1月1日にサイクリング
  • 1月2日にランニング
  • 1月3日にサイクリング

このようなデータがある場合に、ランニングの間にサイクリングが挟まっているのでグラフの色が跡切れてしまう。

  • 1月1日にサイクリング
  • 1月3日にサイクリング
  • 1月2日にランニング

上記のようにワークアウトの種別ごとにまとめてあげる、みたいなことをした。

もっと書けそうだけどどこかのLTとかで発表したいのでここまでにしておく。