如何通过 HealthKit 睡眠查询区分来源
How to differentiate sources with HealthKit sleep query
我目前正在使用以下代码查询用户在过去 24 小时内睡眠的小时数:
func getHealthKitSleep() {
let healthStore = HKHealthStore()
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)
// Get all samples from the last 24 hours
let endDate = Date()
let startDate = endDate.addingTimeInterval(-1.0 * 60.0 * 60.0 * 24.0)
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: [])
// Sleep query
let sleepQuery = HKSampleQuery(
sampleType: HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis)!,
predicate: predicate,
limit: 0,
sortDescriptors: [sortDescriptor]){ (query, results, error) -> Void in
if error != nil {return}
// Sum the sleep time
var minutesSleepAggr = 0.0
if let result = results {
for item in result {
if let sample = item as? HKCategorySample {
if sample.value == HKCategoryValueSleepAnalysis.asleep.rawValue && sample.startDate >= startDate {
let sleepTime = sample.endDate.timeIntervalSince(sample.startDate)
let minutesInAnHour = 60.0
let minutesBetweenDates = sleepTime / minutesInAnHour
minutesSleepAggr += minutesBetweenDates
}
}
}
self.sleep = Double(String(format: "%.1f", minutesSleepAggr / 60))!
print("HOURS: \(String(describing: self.sleep))")
}
}
// Execute our query
healthStore.execute(sleepQuery)
}
如果用户只有一个睡眠应用程序作为数据源,这将非常有用。问题是,如果用户使用 2 个睡眠应用程序,例如,作为源,数据将加倍。如何区分来源?如果能够区分来源,我想要么只从一个来源获取数据,要么取来源的平均值。
循环播放示例时,您可以访问有关每个示例的来源的信息。我只接受一个来源,所以我只保留来源名称的变量,如果当前样本有不同的来源名称,我会继续循环而不处理来自该样本的数据,但如果你愿意,你可以以其他方式组合数据到.
访问源信息的方法如下:
if let sample = item as? HKCategorySample {
let name = sample.sourceRevision.source.name
let id = sample.sourceRevision.source.bundleIdentifier
}
关于 HKSourceRevision
对象 in the docs here 的更多信息。
我目前正在使用以下代码查询用户在过去 24 小时内睡眠的小时数:
func getHealthKitSleep() {
let healthStore = HKHealthStore()
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)
// Get all samples from the last 24 hours
let endDate = Date()
let startDate = endDate.addingTimeInterval(-1.0 * 60.0 * 60.0 * 24.0)
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: [])
// Sleep query
let sleepQuery = HKSampleQuery(
sampleType: HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis)!,
predicate: predicate,
limit: 0,
sortDescriptors: [sortDescriptor]){ (query, results, error) -> Void in
if error != nil {return}
// Sum the sleep time
var minutesSleepAggr = 0.0
if let result = results {
for item in result {
if let sample = item as? HKCategorySample {
if sample.value == HKCategoryValueSleepAnalysis.asleep.rawValue && sample.startDate >= startDate {
let sleepTime = sample.endDate.timeIntervalSince(sample.startDate)
let minutesInAnHour = 60.0
let minutesBetweenDates = sleepTime / minutesInAnHour
minutesSleepAggr += minutesBetweenDates
}
}
}
self.sleep = Double(String(format: "%.1f", minutesSleepAggr / 60))!
print("HOURS: \(String(describing: self.sleep))")
}
}
// Execute our query
healthStore.execute(sleepQuery)
}
如果用户只有一个睡眠应用程序作为数据源,这将非常有用。问题是,如果用户使用 2 个睡眠应用程序,例如,作为源,数据将加倍。如何区分来源?如果能够区分来源,我想要么只从一个来源获取数据,要么取来源的平均值。
循环播放示例时,您可以访问有关每个示例的来源的信息。我只接受一个来源,所以我只保留来源名称的变量,如果当前样本有不同的来源名称,我会继续循环而不处理来自该样本的数据,但如果你愿意,你可以以其他方式组合数据到.
访问源信息的方法如下:
if let sample = item as? HKCategorySample {
let name = sample.sourceRevision.source.name
let id = sample.sourceRevision.source.bundleIdentifier
}
关于 HKSourceRevision
对象 in the docs here 的更多信息。