DeviceMotion を介して加速度計、ジャイロスコープ データ、HKWorkout を介して心拍数を取得する Apple Watch 用のアプリケーションを開発しています。
アプリケーションがフォアグラウンドに留まるまで、すべてがうまく機能します。ただし、非アクティブ状態になると(ユーザーが手首を下げると)、しばらくは機能しますが、ある時点で停止します。さらに、アプリがバックグラウンドになると、新しい DeviceMotion の更新を収集するためにアプリが停止しますが、緑の LED が点灯したままなので、心拍数のオブザーバーは引き続き機能していると思います。
DeviceMotion に使用するコードは次のとおりです。
if self.motion.isDeviceMotionAvailable {
self.motion.deviceMotionUpdateInterval = 1.0 / 100.0
self.motion.showsDeviceMovementDisplay = true
self.motion.startDeviceMotionUpdates(using: .xMagneticNorthZVertical, to: OperationQueue.main, withHandler: { (data, error) in
if let d = data {
//collecting data
}
}
}
心拍数に使用するコード:
let workoutConfiguration = HKWorkoutConfiguration()
workoutConfiguration.activityType = .crossTraining
workoutConfiguration.locationType = .indoor
do {
if workoutSession == nil {
workoutSession = try HKWorkoutSession(healthStore: HealthDataManager.sharedInstance.healthStore!, configuration: workoutConfiguration)
workoutSession?.startActivity(with: Date())
}
} catch {
print("Error starting workout session: \(error.localizedDescription)")
}
HealthDataManager.sharedInstance.observeHeartRateSamples { (heartRate) -> (Void) in
print("heart rate sample: \(heartRate)")
self.lastHearRateSample = heartRate
}
Apple ドキュメントの状態 ( https://developer.apple.com/documentation/healthkit/workouts_and_activity_rings )から
ワークアウト セッションがアクティブな間、アプリはバックグラウンドで実行し続けることができます。これにより、アプリはユーザーを監視し、アクティビティ全体でデータを収集できます。さらに、ユーザーが時計を確認するたびにアプリが表示されるようにします。
これらの場合、アプリの動作を管理する必要はないと考えていました。しかし、何かをしなければならないようです。バックグラウンド状態 (および非アクティブ状態) で新しい DeviceMotion データを収集する最良の方法は何ですか?