Visionフレームワークでのテキスト認識を実装した後、次はアプリ内で簡単な歩数表示をしたいと考え、Core Motionでの活動データ取得に挑戦しました。
1. HealthKitと同じデータを扱っていると思い込んでいた
以前HealthKitでヘルスデータを連携した経験があったため、Core Motionも同じヘルスケアアプリのデータベースを参照する仕組みだと思い込んでいました。
let pedometer = CMPedometer()
実際にはCore Motionはデバイス自体のセンサーから直接歩数や活動状態を取得する仕組みで、HealthKitのようにヘルスケアアプリに蓄積されたデータを横断的に参照するものとは別物でした。用途によってはHealthKit経由の方が適している場合もあり、両者の違いを理解せずに実装を始めてしまったことで、途中で設計をやり直す羽目になりました。
2. 権限リクエストのタイミングを誤っていた
アプリ起動直後に歩数データの取得を開始しようとしたところ、権限ダイアログが表示される前にデータ取得の呼び出しがエラーになってしまいました。
発生したエラー:
motion access not authorized
Core Motionの利用にはInfo.plistへの利用目的の記載に加え、実際にデータ取得のAPIを呼び出したタイミングで初めて権限ダイアログが表示される仕組みになっており、ダイアログの表示・許可を待たずに続けて処理を呼んでしまっていたことが原因でした。権限確認の結果を待ってから本来の処理を実行する流れに書き直しました。
3. 過去の履歴データも同じ感覚で取得できると思っていた
その日の歩数だけでなく、過去1週間分の歩数もまとめて取得したいと考えていたのですが、最初はリアルタイムの歩数取得と同じ感覚で実装しようとして混乱しました。
pedometer.queryPedometerData(from: startDate, to: endDate)
リアルタイムの更新を受け取るstartPedometerUpdatesと、指定期間の過去データをまとめて取得するqueryPedometerDataは別のAPIで、目的に応じて使い分ける必要があると気づくまで、片方のAPIだけで両方を実現しようとして無駄な実装を重ねてしまいました。
4. シミュレータでは実際の歩数が反映されないことに戸惑った
シミュレータ上で動作確認をしていたところ、実際に自分が歩いた歩数がまったく反映されず、実装がうまくいっていないのかと不安になりました。
シミュレータの制約:
実際のモーションセンサーが存在しないため歩数データは生成されない
これはバグではなく、シミュレータには歩数を検知するモーションセンサー自体が搭載されていないための制約でした。Xcodeのデバッグメニューから位置情報のシミュレーションはできても、歩数データの生成はシミュレートされないと分かり、動作確認は実機を持って実際に歩く形で行うようにしました。
まとめ
- Core MotionはHealthKitとは別物。デバイスのセンサーから直接データを取得する仕組み
- 権限ダイアログはAPI呼び出しのタイミングで表示される。許可結果を待ってから本処理を実行する
- リアルタイム更新の取得と過去期間の取得は別のAPI。目的に応じて使い分ける
- シミュレータでは歩数データは生成されない。動作確認は実機で行う
歩数を表示するだけのシンプルな機能に見えて、権限まわりとAPIの使い分けを正しく理解するまでにいくつもの回り道をした実装でした。
次は、SKStoreReviewControllerでのアプリ内レビュー依頼について分かったことをまとめます。
本記事は生成AI(Claude)を活用して執筆・編集しています。内容は実体験に基づき、執筆者本人が確認・監修しています。


コメント