iOS/Swift

[HealthKit] enableBackgroundDelivery

태애니 2025. 7. 9. 23:08
728x90

HealthKit Capabilities Entitlement


com.apple.developer.healthkit.access

 

 

앱이 포그라운드/백그라운드 상태로 실행되면, HealthKit은 해당하는 HKObserverQuery의 핸들러를 즉시 실행시킨다.

 

  • 백그라운드에서도 작동하려면, 앱 실행 시점에 observer query를 등록해야 한다.
  • 보통 AppDelegate나 SceneDelegate의 앱 초기화 지점에서 설정해야 백그라운드 전달이 제대로 작동한다
    AppDelegate의 application(_:didFinishLaunchingWithOptions:)에서 설정<<<
  • 쿼리가 등록되어 있지 않으면, HealthKit이 데이터를 보내도 앱이 무시하니까 주의
  • HKObserverQuery 안에서 제공되는 completionHandler()는 반드시 호출!! 그래야만 시스템에서 응답을 확인함.
  • completion handler를 호출하지 않으면, HealthKit은 앱을 다시 실행시키려 시도하되, 점점 지연 간격을 늘리는 backoff 알고리즘을 사용함
  • 앱이 3번 연속 응답에 실패하면, HealthKit은 앱이 데이터를 받을 수 없다고 간주하고 더 이상 백그라운드 업데이트를 보내지 않는다.
private func setupBackgroundDelivery() {
        let query = HKObserverQuery(sampleType: daylightType, predicate: nil) { [weak self] _, completionHandler, error in
            if let error = error {
                DispatchQueue.main.async {
                    self?.addLog(eventType: .backgroundUpdate, message: "Background delivery error: \(error.localizedDescription)")
                }
            } else {
                DispatchQueue.main.async {
                    self?.addLog(eventType: .backgroundUpdate, message: "🔄 Real background delivery triggered - app woken by HealthKit")
                    self?.fetchCurrentDaylight(isAppLaunch: false)
                }
            }
            completionHandler()
        }
        
        backgroundDeliveryQuery = query
        healthStore.execute(query)
        
        healthStore.enableBackgroundDelivery(for: daylightType, frequency: .immediate) { [weak self] success, error in
            DispatchQueue.main.async {
                if success {
                    self?.addLog(eventType: .manualUpdate, message: "Background delivery enabled successfully")
                } else {
                    self?.addLog(eventType: .manualUpdate, message: "Failed to enable background delivery: \(error?.localizedDescription ?? "Unknown error")")
                }
            }
        }
    }

 

 

HKObserverQueryCompletionHandler 참조

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

 

HKObserverQueryCompletionHandler | Apple Developer Documentation

The completion handler for background deliveries.

developer.apple.com

 

Executing Observer Queries

https://developer.apple.com/documentation/healthkit/executing-observer-queries

 

Executing Observer Queries | Apple Developer Documentation

Create and run observer queries.

developer.apple.com

 

 

 

 

 

728x90