Запрос Healthkit должен вернуть объект массива, который содержит шаги, расстояние и калории.
Я смог вернуть их по отдельности,
Шаг активности / час
func activitySteps(_ startDate:NSDate, endDate:NSDate, anchorDate:NSDate, completion: @escaping (Array<NSObject>, NSError?) -> ()) {
let type = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)
let interval = NSDateComponents()
interval.hour = 1
let predicate = HKQuery.predicateForSamples(withStart: startDate as Date, end: endDate as Date, options: .strictEndDate)
let query = HKStatisticsCollectionQuery(quantityType: type!, quantitySamplePredicate: predicate, options: [.cumulativeSum], anchorDate: anchorDate as Date, intervalComponents:interval as DateComponents)
query.initialResultsHandler = { query, results, error in
if let myResults = results{
var stepsArray: [NSObject] = []
myResults.enumerateStatistics(from: startDate as Date, to: endDate as Date) {
statistics, stop in
if let quantity = statistics.sumQuantity() {
let steps = quantity.doubleValue(for: HKUnit.count())
// print("\(statistics.endDate.timeIntervalSince1970): steps = \(steps)")
let ret = [
"steps": steps,
"startDate" : statistics.startDate.timeIntervalSince1970 * 1000.0,
"endDate": statistics.endDate.timeIntervalSince1970 * 1000.0
] as [String : Any]
stepsArray.append(ret as NSObject)
}
}
completion(stepsArray, error as NSError?)
}
}
healthKitStore.execute(query)
}
Активность Расстояние / час
func activityDistance(_ startDate:NSDate, endDate:NSDate, anchorDate:NSDate, completion: @escaping (Array<NSObject>, NSError?) -> ()) {
let type = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceWalkingRunning)
let interval = NSDateComponents()
interval.hour = 1
let predicate = HKQuery.predicateForSamples(withStart: startDate as Date, end: endDate as Date, options: .strictEndDate)
let query = HKStatisticsCollectionQuery(quantityType: type!, quantitySamplePredicate: predicate, options: [.cumulativeSum], anchorDate: anchorDate as Date, intervalComponents:interval as DateComponents)
query.initialResultsHandler = { query, results, error in
if let myResults = results{
var distanceArray: [NSObject] = []
myResults.enumerateStatistics(from: startDate as Date, to: endDate as Date) {
statistics, stop in
if let quantity = statistics.sumQuantity() {
let distance = quantity.doubleValue(for: HKUnit.meter())
print("\(statistics.endDate.timeIntervalSince1970): distance = \(distance)")
let ret = [
"distance": distance,
"startDate" : statistics.startDate.timeIntervalSince1970 * 1000.0,
"endDate": statistics.endDate.timeIntervalSince1970 * 1000.0
] as [String : Any]
distanceArray.append(ret as NSObject)
}
}
completion(distanceArray, error as NSError?)
}
}
healthKitStore.execute(query)
}
калорий активности / час
func activityCalories(_ startDate:NSDate, endDate:NSDate, anchorDate:NSDate, completion: @escaping (Array<NSObject>, NSError?) -> ()) {
let type = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.activeEnergyBurned)
let interval = NSDateComponents()
interval.hour = 1
let predicate = HKQuery.predicateForSamples(withStart: startDate as Date, end: endDate as Date, options: .strictEndDate)
let query = HKStatisticsCollectionQuery(quantityType: type!, quantitySamplePredicate: predicate, options: [.cumulativeSum], anchorDate: anchorDate as Date, intervalComponents:interval as DateComponents)
query.initialResultsHandler = { query, results, error in
if let myResults = results{
var caloriesArray: [NSObject] = []
myResults.enumerateStatistics(from: startDate as Date, to: endDate as Date) {
statistics, stop in
if let quantity = statistics.sumQuantity() {
let calories = quantity.doubleValue(for: HKUnit.kilocalorie())
print("\(statistics.endDate.timeIntervalSince1970): calories = \(calories)")
let ret = [
"calories": calories,
"startDate" : statistics.startDate.timeIntervalSince1970 * 1000.0,
"endDate": statistics.endDate.timeIntervalSince1970 * 1000.0
] as [String : Any]
caloriesArray.append(ret as NSObject)
}
}
completion(caloriesArray, error as NSError?)
}
}
healthKitStore.execute(query)
}
Вместо этого я хотел бы объединить все это в один объект.
[
{
steps: 70,
distance:10,
calories: 200,
startDate: ...,
endDate: ...,
},...
]
Можно ли генерировать данные в указанном формате с почасовым интервалом непосредственно из самого HealthKit?
Если это невозможно, как я могу объединить все 3 данные в один объект, где данные могут варьироваться от одного дня до недели.