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
'iOS > Swift' 카테고리의 다른 글
[HealthKit] HKObserverQueryCompletionHandler (0) | 2025.07.11 |
---|---|
[Foundation/Class] NotificationCenter (2) | 2025.07.02 |
[문법/키워드] Computed Property / Extension (0) | 2025.05.21 |
[문법/키워드] mutating, Associated Value (연관 값) (0) | 2025.05.20 |
Swift에서 closure 함수 쓸 때 사용되는 @escaping 은 뭘까? (0) | 2025.05.14 |