SwiftUIで作る筋トレアプリ|回数カウント+音だけのインターバルタイマーを追加した話

前回のおさらい

前回、回数を数えるだけの筋トレアプリをSwiftUIで自作しました。

記録も分析もなし。ただ回数を表示するだけ。

実際に使ってみて、不足を感じたのは1つだけです。

インターバルの終了が分からない。

画面を見る余裕がない場面では、

「音が鳴るだけ」で十分だと気づきました。

今回追加した機能

今回追加したのは、以下だけです。

  • 秒数をカウントダウンする
  • 0になったら音を鳴らす
  • 画面遷移なし、設定なし

相変わらず、割り切り全振りです。

実装方針(シンプル重視)

  • Timer を1本使う
  • 状態管理は @State のみ
  • 音はシステム効果音を使う
  • 永続化・バックグラウンド対応はしない

「筋トレ中に確実に使えること」を最優先にしました。

コードサンプル:インターバルタイマー(最小構成)

インターバル管理用の状態

@State private var remainingTime: Int = 60
@State private var timer: Timer?

タイマー開始・停止処理

func startTimer() {
timer?.invalidate()

timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
if remainingTime > 0 {
remainingTime -= 1
} else {
stopTimer()
playSound()
}
}
}

func stopTimer() {
timer?.invalidate()
timer = nil
}

音を鳴らす(システム効果音)

import AudioToolbox

func playSound() {
AudioServicesPlaySystemSound(1005)
}

※ 1005 は標準の短い通知音です。

「うるさすぎない」のがポイント。

画面への組み込み例

VStack(spacing: 16) {

Text("休憩")
.font(.headline)

Text("\(remainingTime) 秒")
.font(.largeTitle)

HStack {
Button("開始") {
startTimer()
}

Button("停止") {
stopTimer()
}
}
}

これで

開始 → カウントダウン → 音が鳴る

という最低限の流れが完成します。

あえてやらなかったこと

  • 秒数のカスタマイズ
  • バックグラウンド実行
  • バイブレーション切替
  • Apple Watch対応

どれも「やろうと思えばできる」ですが、

今は不要 と判断しました。

使ってみて分かったこと

  • 音が鳴るだけで十分
  • 画面を見なくていいのが楽
  • 実装が軽いので壊れにくい

回数カウントと同様、

機能を足したのに、思考は増えていない のが良い点です。

次にやるなら(予定)

  • 秒数を3パターンだけ切替
  • 音量を固定値にする
  • トレーニング開始時のワンタップ化

ただし、必要になるまでやりません。

関連記事

筋トレアプリがサービス終了。回数を数えるだけのiOSアプリを自作した話

自分だけの筋トレアプリを作ってみよう! 〜アプリ開発の楽しさと挑戦〜

おわりに

筋トレ中に欲しいのは、

「正確さ」より「邪魔しないこと」。

回数カウント+音だけのインターバル。

これ以上でも以下でもない構成が、今の自分には最適でした。

本日はここまで。では、また次の記事でお会いしましょう。

おすすめの記事