首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS HealthKit今天的步数总是0(但尾随的日子还可以)

iOS HealthKit今天的步数总是0(但尾随的日子还可以)
EN

Stack Overflow用户
提问于 2015-04-17 20:33:47
回答 4查看 2.5K关注 0票数 3

在我们的应用程序中,我们查询HealthKit是否跟踪7天的步数,每天加起来,以午夜为支点。所以范围是D-6午夜到明天午夜(因为我们一直想要今天的台阶)。

我们总是能够得到过去6天的数据,但今天的数据总是0。

但奇怪的是,如果我们打开iHealth 8.0附带的默认iOS应用程序,它会计算健康数据,并在图表中显示今天的步骤。然后,如果我们重新打开应用程序并重新加载图表数据,那么今天的步骤就奇迹般地出现了,与"iHealth“显示的步骤相匹配。

那么,iPhone是否只在午夜自动生成每天的步骤,并缓存它或其他什么?在检索任何健康指标之前,我们是否需要单独打个电话来计算今天的数据或其他数据?

下面是我们调用的获取数据的函数:

代码语言:javascript
复制
func queryDailyStats(metric: NSString!, handler: ([NSDate: Int] -> Void)!) {
    let quantityType = HKObjectType.quantityTypeForIdentifier(metric)
    let calendar = NSCalendar.currentCalendar()
    let now = NSDate()
    let preservedComponents: NSCalendarUnit = (.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay)
    let midnight: NSDate! = calendar.dateFromComponents(calendar.components(preservedComponents, fromDate:now))
    let dailyInterval = NSDateComponents()
    dailyInterval.day = 1

    let tomorrow = calendar.dateByAddingUnit(.MonthCalendarUnit, value: 1, toDate: midnight, options: nil)
    let oneMonthAgo = calendar.dateByAddingUnit(.MonthCalendarUnit, value: -1, toDate: midnight, options: nil)
    let oneWeekAgo = calendar.dateByAddingUnit(.DayCalendarUnit, value: -6, toDate: midnight, options: nil) // only need to start from 6 days back

    // need tomorrow's midnight as end date to get all of today's data
    let predicate = HKQuery.predicateForSamplesWithStartDate(oneWeekAgo, endDate: tomorrow, options: .None)

    let query = HKStatisticsCollectionQuery(
        quantityType: quantityType,
        quantitySamplePredicate: predicate,
        options: .CumulativeSum,
        anchorDate: midnight,
        intervalComponents: dailyInterval
    )

    query.initialResultsHandler = { query, results, error -> Void in
        var data:[NSDate: Int] = [:]
        if error != nil {
            println(error)
        } else {
            results.enumerateStatisticsFromDate(oneWeekAgo, toDate: midnight) { statistics, stop in
                if let quantity = statistics.sumQuantity() {
                    let date = statistics.startDate
                    let value = Int(quantity.doubleValueForUnit(HKUnit.countUnit()))

                    data[date] = value
                }
            }
        }

        handler(data)
    }

    self.healthKitStore.executeQuery(query)
}
EN

回答 4

Stack Overflow用户

发布于 2015-11-26 11:30:51

尝试这段代码,你只需更改开始日期和结束日期。

代码语言:javascript
复制
-(void) getQuantityResult {
    NSInteger limit = 0;
    NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:currentDate endDate:[[NSDate date]dateByAddingTimeInterval:60*60*24*3] options:HKQueryOptionStrictStartDate];
    
    NSString *endKey =  HKSampleSortIdentifierEndDate;
    NSSortDescriptor *endDate = [NSSortDescriptor sortDescriptorWithKey: endKey ascending: NO];
    
    HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType[HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]
                                                           predicate: predicate
                                                               limit: limit
                                                     sortDescriptors: @[endDate]
                                                      resultsHandler:^(HKSampleQuery *query, NSArray* results, NSError *error){
                                                            dispatch_async(dispatch_get_main_queue(), ^{
                                                              // sends the data using HTTP
                                                              int dailyAVG = 0;
                                                              for(HKQuantitySample *samples in results)
                                                                           {
                                                                  dailyAVG += [[samples quantity] doubleValueForUnit:[HKUnit countUnit]];
                                                               }
                                                              lblPrint.text = [NSString stringWithFormat:@"%d",dailyAVG];
                                                              NSLog(@"%@",lblPrint.text);
                                                              NSLog(@"%@",@"Done");
                                                          });
                                                      }];
    [self.healthStore executeQuery:query];
}
票数 1
EN

Stack Overflow用户

发布于 2015-12-26 18:12:17

如果您只需要当前或最近的步骤计数和距离数据,则应该使用核心运动CMPedometer类而不是HealthKit。接口简单得多,数据可以快速准确地返回。我也有同样的问题,转而采用核心运动的方法来解决它。

票数 1
EN

Stack Overflow用户

发布于 2015-04-28 16:42:26

您的查询只有一个initialResultsHandler。为了让HealthKit在应用程序运行时更频繁地从运动协处理器导入步骤,您需要在这个查询上设置一个updateHandler,或者为步骤打开一个HKObserverQuery。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29708829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档