1

独立した watchOS 8 アプリの HealthKit データのバックグラウンド配信を実装しようとしています。私はGettingsのHealthKit WWDCトークを最大限に活用していましたが、最近のiOS 15やwatchOS 8 com.apple.developer.healthkit.background-delivery資格など、バックグラウンド配信に必要なものをすべて追加したようです . しかし、何らかの理由で、アプリがバックグラウンドになってから約 3 ~ 5 時間後に、バックグラウンド配信が機能しなくなります。たとえば、アプリから夕方に更新を受信して​​いますが、夜になると更新の配信が停止し、朝にアプリを再度開いた場合にのみ更新が取得されます。ExtensionDelegate以下のコードを参照してください

class ExtensionDelegate: NSObject, WKExtensionDelegate {
    private let healthStore = HKHealthStore()
    private var anchor: HKQueryAnchor?

    func applicationDidFinishLaunching() {
        print("application did finish launching")

        activateHeathKit()
    }

    func activateHeathKit() {
        let types = Set([HKObjectType.categoryType(forIdentifier: .lowHeartRateEvent)!])

        healthStore.requestAuthorization(toShare: nil, read: types) { [weak self] success, _ in
            guard let `self` = self else {
                return
            }

            guard let lowHeartRateType = HKObjectType.categoryType(forIdentifier: .lowHeartRateEvent) else {
                return
            }

            `self`.healthStore.enableBackgroundDelivery(for: lowHeartRateType, frequency: .immediate) { success, _ in
                print("enableBackgroundDelivery: \(success) for lowHeartRateEvent")
            }

            let query = HKObserverQuery(sampleType: stepsType, predicate: nil) { _, completionHandler, error in
                `self`.updateLowHeartRate {
                    completionHandler()
                }
            }
            `self`.healthStore.execute(query)
        }
    }

    func updateLowHeartRate(completionHandler: @escaping () -> Void) {
        guard let lowHeartRateType = HKObjectType.categoryType(forIdentifier: .lowHeartRateEvent) else {return}

        let anchoredQuery = HKAnchoredObjectQuery(type: lowHeartRateType, predicate: nil, anchor:
                                                    self.anchor, limit: Int(HKObjectQueryNoLimit)) { [unowned self] query, newSamples,
            _, newAnchor, error -> Void in

            for item in newSamples ?? [] {
                let date = item.startDate
                let hour = Calendar.current.component(.hour, from: date)
                let minute = Calendar.current.component(.minute, from: date)

                let message = "Low heart rate from \(hour):\(String(format: "%02d", minute))"
                print(message)
            }

            self.anchor = newAnchor

            completionHandler()
        }

        healthStore.execute(anchoredQuery)
    }    
}
4

1 に答える 1