- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我们的应用程序中,我们向 HealthKit 查询过去 7 天的步数,每天汇总,以午夜为基准。所以范围是 D-6 午夜到明天午夜(因为我们想要今天的步数到现在)。
是否可行,我们总是能够获取过去 6 天的数据,除了今天始终为 0。
但奇怪的是,如果我们随后打开 iOS 8.0 附带的默认 iHealth 应用程序,它会计算健康数据并在图表中显示今天的步数。然后,如果我们重新打开我们的应用程序并重新加载图表数据,今天的步数奇迹般地存在,与“iHealth”显示的相匹配。
那么 iPhone 是否只在午夜自动生成每日步数,并缓存它或其他什么?在检索任何健康指标之前,我们是否需要单独调用以计算今天的数据或其他内容?
这是我们调用来获取数据的函数:
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)
}
最佳答案
如果您只需要当前或最近的步数和距离数据,您应该使用 Core Motion CMPedometer 类而不是 HealthKit。界面更简单,数据返回快速准确。我有同样的问题并切换到 Core Motion 方法来解决它。
关于iOS HealthKit 今天的步数始终为 0(但尾随天数没问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29708829/
我不确定如何根据输入大小 N 确定运行时间,尤其是当它进入具有某些限制的循环时。这就是我尝试过的。我猜常数是正确的。它看起来如何? i = 1;
我想检索 1 小时前的步数。我不需要做任何特别的事情,我只需要知道用户自上一小时以来完成了多少步。 即使我的 iPhone 记录了一些步数,检索步数的查询返回“nil”。 这是代码: let c
我正在为 Android Wear 开发一款面部 watch 。我想读取 watch 计算的步数(显示在卡上的步数)。是否有任何简单的方法来访问数据?我的研究表明我可以创建自己的步数计数器(由于准确性
我是一名优秀的程序员,十分优秀!