我正在为Apple Watch开发一个应用程序,该应用程序通过DeviceMotion获取加速度计、陀螺仪数据,并通过HKWorkout获取心率。
在应用程序停留在前台之前,一切都很好。然而,当它进入非活动状态时(当用户放下手腕时(,它会工作一段时间,但在某个时刻会停止。此外,当应用程序进入后台时,应用程序会停止收集新的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 Documentation声明(https://developer.apple.com/documentation/healthkit/workouts_and_activity_rings)
当训练课程处于活动状态时,您的应用程序可以继续在后台运行。这可以让你的应用程序监控用户并在整个活动中收集数据。此外,它还可以确保您的应用程序在用户检查手表时出现。
我认为在这些情况下没有必要管理应用程序的行为。然而,似乎必须采取一些措施。在后台状态(和非活动状态(下收集新DeviceMotion数据的最佳方式是什么?
事实证明,由于健康工具包的锻炼,应用程序进入了后台。然而,我使用了太多的资源,系统暂停了应用程序。