ios - 如何在应用程序处于后台时查询 HealthKit (HKWorkout) 更新?

标签 ios swift background-process appdelegate healthkit

编辑以添加我基于 WWDC 2016 的“充分利用 Healthkit”演讲的更新代码,但除非我打开应用程序,否则我仍然无法获取新锻炼的打印声明?

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

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!)")
}

最佳答案

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

关于ios - 如何在应用程序处于后台时查询 HealthKit (HKWorkout) 更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49614618/

相关文章:

swift - 在 swift 中的许多情况下纠正 NSNumberFormatter

shell - 如何在 shell 脚本中通过管道传输后台进程

ios - 如何删除/解码 URL 百分比编码?

ios - Swift & Core Data - 将实体添加到现有实体

ios - Objective C 到 Swift 的转换

ios - Firebase 功能电子邮件发送问题

ios - Swift WKWebView 未初始化并导致意外的 nil 错误

bash - 如何使用 bash -c 运行后台进程

ios - 推送通知是否可以用于在不通知用户的情况下运行代码?

iOS 本地通知在锁屏时不播放声音