ワークアウトは Apple Watch で毎日使っているので、iOS / iPadOS でどういうことが可能なのか確認してみた。
0:00 – Introduction
- 数百のヘルス・フィットネスアプリが HealthKit の暗号化されたデータベースと強力な API を活用
- ワークアウト API は HealthKit が提供する最も強力な API の一つ
- Apple Watch で既にワークアウトアプリを運用している場合、最小限の変更で同じコードを iPhone と iPad で使用可能
0:56 – Run a workout session
- ワークアウトセッションの基本手順:
- セットアップ:
HKWorkoutConfigurationを作成し、アクティビティタイプを設定(例:ランニング、屋外) - セッション作成:設定を使って
HKWorkoutSessionを作成 - ビルダー取得:ワークアウトセッションから関連する builder を取得し、データソース(
HKLiveWorkoutDataSource)をアタッチ - 準備:
session.prepareを呼び出し、3秒のカウントダウンを表示- オンデバイスセンサーの起動や外部心拍モニターの接続時間を確保
- ワークアウト開始時にメトリクスがすぐに利用可能になることを保証
- 開始:カウントダウン完了後、セッションで
startActivity、関連する workout builder でbeginCollectionを呼び出し
- セットアップ:
- UI 更新の簡素化:
- anchored object query を使用する必要なし
- workout builder の
delegateが新しいデータ収集時に便利な更新を提供 - ワークアウト保存時のメトリクス同期を自動処理
- 終了処理:
session.stopActivityを呼び出し、最終メトリクスの収集を許可- セッションが停止状態に遷移後、builder で
endCollectionを呼び出し - builder 完了後、セッションで
endを呼び出し、ワークアウトサマリーを表示
2:50 – Get session metrics
- 利用可能センサーの違い:
- iPhone と iPad には心拍センサーが内蔵されていない
- 心拍 GAT プロファイル対応デバイス(ウェアラブル心拍モニター、Powerbeats Pro 2 など)とのペアリングが可能
- ペアリング後、HealthKit が心拍データを自動取得し、Health Store にサンプルとして保存
- データタイプの分類:
- Generated types:システムがワークアウト中に生成するデータタイプ(カロリー、距離など)
- Collected types:ライブで観察し、ワークアウトサンプルに追加したいメトリクス
- 例:ワークアウト中の水分摂取量を収集する場合、アプリがサンプルをヘルスデータベースに追加する必要
- データソースの設定:
- 初期化時、データソースの types to collect プロパティには現在のアクティビティで収集可能な全サンプルタイプが含まれる
- 外部心拍センサーがない場合でも心拍数が含まれる
- システム生成またはアプリ保存のサンプルを観察し、live builder に渡す
- コレクションタイプのカスタマイズ:
- enable / disable collection for type メソッドでタイプの追加・削除が可能
- 例:ワークアウト中の水分摂取量収集時、Enable Collection を呼び出し、測定値をサンプルとしてヘルスデータベースに追加
- 保存後のワークアウトメトリクス読み取り:
- ワークアウトオブジェクトの statistics を使用してサマリーを表示
- 期間中のメトリクスをチャート化する場合は statistics collection query を使用
- 細かいデータが必要な場合、
HKQuantitySeriesSampleQueryを使用してより詳細なデータにアクセス
- デバイスロック時の対応:
- iPhone はワークアウト中にロックされる可能性が高い
- 初回ワークアウトセッション開始時、デバイスロック中でもワークアウトデータが利用可能になる旨のシステムプロンプトを表示
- Live Activity でロックスクリーン上に重要なメトリクスを表示可能
- プライバシー配慮:データアクセス不可時はメトリクスを省略し、ワークアウト時間のみ表示
- Siri 対応:
- ロックスクリーンからワークアウトの開始、一時停止、再開、キャンセルが可能
- アプリ内で Intent Handler(
INExtension) を定義し、StartWorkoutIntentなどの各インテントを処理 - アプリデリゲートで Intent に応答する設定が必要
8:35 – Recover from a crash
- クラッシュ復旧の仕組み:
- システムがクラッシュ時にアプリを自動再起動
- ワークアウトセッションと Builder が以前の状態で復元
- ライブデータソースの再設定が必要
- iPhone と iPad 向けの新機能:
- 進行中のワークアウト復旧用の新しい scene delegate を追加
- Siri インテント用に作成したアプリデリゲートにシーンデリゲートを追加してクラッシュ復旧を処理
9:34 – Best practices
- Watch アプリ優先:
- Watch アプリがある場合、そこでワークアウトを開始して全利用可能メトリクスを取得
- Health Store から Start Watch App を呼び出し
- ワークアウトを iPhone にミラーリング
- 認証リクエストの最適化:
- 必要なデータタイプのみ認証をリクエスト
- アプリの焦点と無関係に見えるデータタイプの認証理由をユーザーが疑問に思わないよう配慮
- Workout Builder API の使用:
- ワークアウトの作成と保存には常に workout builder API を使用
- アクティビティリングが適切に更新されることを保証
- 次のステップ:
- セッション添付のデモアプリ
- 既存の iPhone/iPad アプリがある場合は Workout Builder API にアップグレード
- Apple Watch アプリがある場合、同じ API のマルチプラットフォームサポートにより Apple Watch を持たないユーザー向けに提供可能