Open2
Background HealthKit

アプリが終了していても、 HealthKit で指定の歩数に達したことを通知できる

Background server queries aren’t supported on the Simulator. Be sure to test your background queries on a device.
実機で確認してね
実装イメージ
healthStore.enableBackgroundDelivery(for: stepType, frequency: .daily) { success, error in
if success {
// ObserverQuery 登録
setupObserverQuery()
}
}
func setupObserverQuery() {
let stepType = HKObjectType.quantityType(forIdentifier: .stepCount)!
let query = HKObserverQuery(sampleType: stepType, predicate: nil) { _, completionHandler, error in
checkDailyStepCount()
completionHandler()
}
healthStore.execute(query)
}
func checkDailyStepCount() {
let stepType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let startOfDay = Calendar.current.startOfDay(for: Date())
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: Date())
let query = HKStatisticsQuery(quantityType: stepType, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, _ in
guard let quantity = result?.sumQuantity() else { return }
let steps = quantity.doubleValue(for: .count())
print("今日の歩数:\(steps)")
if steps >= 10000 {
sendGoalAchievedNotification()
}
}
healthStore.execute(query)
}