Apple Watch手表复杂功能在使用HealthKit查询时不会在后台刷新

时间:2016-01-02 18:04:12

标签: watch-os-2 health-kit watch-os apple-watch-complication clockkit

我试图在Apple Watch复杂功能中显示用户的每日步数。我通过调用HKHealthStore的requestAuthorizationToShareTypes方法来设置我的课程,并且复杂性在首次添加到监视面时显示正确的步骤。但是,在进行健康工具包查询时,刷新永远不会成功。我怀疑它与HealthKit权限有关,因为HKSampleQuery的完成处理程序不会被调用。如果我只是注释掉运行状况工具包查询,那么我的代码会按预期刷新。有谁知道我可能会缺少什么?或者,如果不允许复杂背景刷新访问HealthKit?

以下是可行的代码块:

/// Provide the entry that should currently be displayed.
/// If you pass back nil, we will conclude you have no content loaded and will stop talking to you until you next call -reloadTimelineForComplication:.
func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimelineEntry?) -> Void) {

        let calendar = NSCalendar.currentCalendar()
        let now = NSDate()
        var startDate: NSDate? = nil
        var interval: NSTimeInterval = 0
        let endDate = NSDate()

        calendar.rangeOfUnit(NSCalendarUnit.Day, startDate: &startDate, interval: &interval, forDate: now)

        // Show dummy step data...
        let timelineEntry = self.buildTimelineEntry(complication, stepCount: 10, currentDateInterval: NSDate())
        handler(timelineEntry)
}

这是不起作用的代码块。错误情况下的更新甚至不会被调用:

/// Provide the entry that should currently be displayed.
/// If you pass back nil, we will conclude you have no content loaded and will stop talking to you until you next call -reloadTimelineForComplication:.
func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimelineEntry?) -> Void) {

        let calendar = NSCalendar.currentCalendar()
        let now = NSDate()
        var startDate: NSDate? = nil
        var interval: NSTimeInterval = 0
        let endDate = NSDate()

        calendar.rangeOfUnit(NSCalendarUnit.Day, startDate: &startDate, interval: &interval, forDate: now)

        let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: HKQueryOptions.StrictStartDate)
        let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: true)
        let stepSampleType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)!
        let sampleQuery = HKSampleQuery(sampleType: stepSampleType, predicate: predicate, limit: 0, sortDescriptors: [sortDescriptor]) { (sampleQuery, results, error ) -> Void in

            if error != nil {
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    let timelineEntry = self.buildTimelineEntry(complication, stepCount: 10, currentDateInterval: NSDate())
                    handler(timelineEntry)
                })

                return
            }

            self.currentSteps = [HKQuantitySample]()

            if results != nil {
                self.currentSteps = results as! [HKQuantitySample]
            }

            let countUnit = HKUnit(fromString: "count")
            var stepCount = 0.0
            var currentDate = now
            for result in self.currentSteps {
                stepCount += result.quantity.doubleValueForUnit(countUnit)
                currentDate = result.endDate
            }

            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                let timelineEntry = self.buildTimelineEntry(complication, stepCount: stepCount, currentDateInterval: currentDate)
                handler(timelineEntry)
            })
        }

        self.healthStore.executeQuery(sampleQuery)
}

1 个答案:

答案 0 :(得分:3)

尝试在并发症控制器中异步获取(HealthKit)数据将是不可靠的。

此外,尝试在并发症控制器中进行提取或计算将不必要地耗尽分配给并发症的执行时间预算。

Apple recommends您在复杂数据源需要之前获取数据并对其进行缓存。

  

数据源类的工作是尽快为ClockKit提供任何请求的数据。数据源方法的实现应该是最小的。不要使用数据源方法从网络获取数据,计算值或执行任何可能会延迟传输数据的操作。如果您需要获取或计算并发症的数据,请在iOS应用程序或WatchKit扩展的其他部分中进行,并将数据缓存在复杂数据源可以访问的位置。您的数据源方法应该做的唯一事情是获取缓存的数据并将其放入ClockKit所需的格式。