当应用程序在后台时如何查询HealthKit(HKWorkout)更新?

Gar*_*abo 6 background-process ios appdelegate swift healthkit

编辑以添加我的更新代码,该代码是我根据 WWDC 2016 的充分利用 Healthkit 演讲编写的,但除非我打开应用程序,否则我仍然无法获得新锻炼的打印声明。

将新的锻炼项目保存到 Apple Watch 后,我尝试在 iPhone 上进行观察。下面是我正在运行的代码didFinishLaunching。为了测试它,我在我的 iPhone 应用程序上运行 Xcode...构建并运行,然后导航回主屏幕。然后在我的手表上开始并保存锻炼,但是我的打印语句没有在控制台中打印。我缺少什么?

func startObservingNewWorkouts() {

    let sampleType =  HKObjectType.workoutType()

    //1. Enable background delivery for workouts
    self.healthStore.enableBackgroundDelivery(for: sampleType, frequency: .immediate) { (success, error) in
        if let unwrappedError = error {
            print("could not enable background delivery: \(unwrappedError)")
        }
        if success {
            print("background delivery enabled")
        }
    }

    //2.  open observer query
    let query = HKObserverQuery(sampleType: sampleType, predicate: nil) { (query, completionHandler, error) in

        self.updateWorkouts() {
            completionHandler()
        }


    }
    healthStore.execute(query)

}

func updateWorkouts(completionHandler: @escaping () -> Void) {

    var anchor: HKQueryAnchor?

    let sampleType =  HKObjectType.workoutType()

    let anchoredQuery = HKAnchoredObjectQuery(type: sampleType, predicate: nil, anchor: anchor, limit: HKObjectQueryNoLimit) { [unowned self] query, newSamples, deletedSamples, newAnchor, error in

        self.handleNewWorkouts(new: newSamples!, deleted: deletedSamples!)

        anchor = newAnchor

        completionHandler()
    }
    healthStore.execute(anchoredQuery)


}

func handleNewWorkouts(new: [HKSample], deleted: [HKDeletedObject]) {
    print("new sample added = \(new.last.startTime!)")
}
Run Code Online (Sandbox Code Playgroud)

Gar*_*abo 3

事实证明这段代码有效,只是我在模拟器中进行测试,显然观察者查询在模拟器中运行时不会触发,但在设备上运行时会触发