Clarification on HealthKit Observer Delivery Frequency and BGTaskScheduler Behavior

Hi Team,

We are implementing HealthKit data sync using HKObserverQuery along with enableBackgroundDelivery and BGTaskScheduler for fallback processing.

However, we are observing inconsistent behavior and would like clarification on expected system behavior:

  1. For HKObserverQuery:
    • When using enableBackgroundDelivery with frequency .immediate, we sometimes receive updates promptly, but other times we do not receive any trigger at all.
    • Similarly, when using .hourly, our expectation was that updates would be delivered approximately once per hour, but in practice, triggers are delayed, batched, or skipped.
  2. For BGTaskScheduler:
    • We are scheduling BGAppRefreshTask with earliestBeginDate set (e.g., 1 hour), but tasks are sometimes delayed by several hours or not triggered predictably.
    • In some cases, tasks are not executed even after extended periods.

We would like to understand:

  • Are HKObserverQuery delivery frequencies (.immediate, .hourly, .daily) strictly best-effort hints rather than guaranteed intervals?
  • Under what conditions can observer updates be skipped or significantly delayed?
  • Is there any recommended approach to ensure more reliable periodic syncing of HealthKit data?
  • For BGTaskScheduler, what factors most strongly influence scheduling delays or missed executions?

Our goal is to design a reliable sync mechanism, but the lack of deterministic behavior is making it difficult to define expected system behavior.

Any clarification or recommended best practices would be greatly appreciated.

Thanks in advance!

Clarification on HealthKit Observer Delivery Frequency and BGTaskScheduler Behavior
 
 
Q