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

Posted

技术标签:

【中文标题】应用程序在后台时如何查询 HealthKit (HKWorkout) 更新?【英文标题】:How to query for HealthKit (HKWorkout) updates when app is in background? 【发布时间】:2018-04-02 16:05:23 【问题描述】:

编辑添加我基于 WWDC 2016 充分利用 Healthkit 演讲的更新代码,但除非我打开应用程序,否则我仍然没有得到我的打印声明与新的锻炼触发?

我正在尝试在 iPhone 上观察新的锻炼,这些锻炼已保存在 Apple Watch 上。下面是我在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!)")

【问题讨论】:

【参考方案1】:

原来这段代码?有效,只是我在模拟器中进行测试,显然观察者查询在模拟器中运行时会触发NOT,但在设备上运行时会触发

【讨论】:

即使设备被锁定也能正常工作吗?即使应用程序处于后台或设备被锁定,只要有更改,我想将健康工具包数据的更新发送到我的服务器。这可能吗? 是的,即使设备被锁定,它也会处理。 但这只有在我在功能中添加背景模式时才有效,对吧?这将仅获取 180 秒的数据。如果我错了,请纠正我。那么如何在应用处于后台时持续监控健康数据呢? 只要用打印语句测试一下,当手机被锁定时,Xcode 仍然会运行你的打印语句。 ? @GarySabo 那个松散的小组还在吗?我想要一个更新的邀请链接。 --标记

以上是关于应用程序在后台时如何查询 HealthKit (HKWorkout) 更新?的主要内容,如果未能解决你的问题,请参考以下文章

HealthKit 后台交付

在后台访问 healthkit 锻炼

在后台访问 healthkit 锻炼

当应用程序处于后台模式时,HealthKit Observer 不工作

当 Healthkit 在后台唤醒我的应用程序时,AppDelegate 是不是会初始化?

当 Healthkit 在后台唤醒我的应用程序时,AppDelegate 是不是会初始化?