Open2

Background HealthKit

ykwsykws

https://developer.apple.com/documentation/healthkit/hkobserverquery

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)
}