apple healthkit数据获取

174 阅读2分钟

  //MARK: 心率获取

static func queryHeartData( ){

let calendar = Calendar.current

let now = Date()

// 开始时间

let startDate = calendar.startOfDay(for: now)

// 结束时间

let endDate = Date(year: startDate.year, month: startDate.month, day: startDate.day, hour: 23, minute: 59,second: 59)

let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: .strictStartDate)

//获取平均心率

// let heartRateStatisticsQuery = HKStatisticsQuery(quantityType: HKObjectType.quantityType(forIdentifier: .heartRate)!,

// quantitySamplePredicate: predicate,

// options: [.discreteMax, .discreteMin, .discreteAverage]) {

// (query, statistics, error) in

//

// guard let statistics = statistics else {

// SimpleLog("获取心率失败,多半是没心率数据")

// closure!(0,0,0,0)

// return

// }

// heartHealthData.append(statistics)

// let object = heartHealthData.first

// heartHealthData.forEach({

// SimpleLog("心率\(String(describing: 0.summaryString))(String(describing:0.summaryString))--\\(String(describing: 0.overviewStrings) )")

//

// })

// SimpleLog("哈哈还是\(String(describing: object?.summaryString))--\(String(describing: object?.overviewStrings) )")

// closure!(0,0,(object?.summaryString.intValue)!,0 )

//

// }

let query:HKAnchoredObjectQuery = HKAnchoredObjectQuery(type: HKObjectType.quantityType(forIdentifier: .heartRate)!, predicate: predicate, anchor: nil, limit: HKObjectQueryNoLimit) { query, samples, deletedObjects, anchor, err in

//printing heart rate

if let samples = samples as? [HKQuantitySample]

{

for quantity in samples

{

SimpleLog("心率\(quantity.quantity.doubleValue(for: HKUnit(from: "count/min")))")

}

}

}

kit.execute(query)

}

//MARK: 喝水获取

static func queryWaterData(){

let calendar = Calendar.current

let now = Date()

// 开始时间

let startDate = calendar.startOfDay(for: now)

// 结束时间

let endDate = Date(year: startDate.year, month: startDate.month, day: startDate.day, hour: 23, minute: 59,second: 59)

let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: .strictStartDate)

let query:HKAnchoredObjectQuery = HKAnchoredObjectQuery(type: HKObjectType.quantityType(forIdentifier: .dietaryWater)!, predicate: predicate, anchor: nil, limit: HKObjectQueryNoLimit) { query, samples, deletedObjects, anchor, err in

//printing heart rate

if let samples = samples as? [HKQuantitySample]

{

for quantity in samples

{

SimpleLog("喝水\(quantity.quantity.doubleValue(for: HKUnit.liter()))")

}

}

}

kit.execute(query)

}

//MARK: HRV获取

static func getHRV(startDate:Date,endDate:Date ) {

let type = HKQuantityType.quantityType(forIdentifier: .heartRateVariabilitySDNN)

let sort = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)

let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: .strictStartDate)

let query = HKSampleQuery(

sampleType: type!,

predicate: predicate,

limit: HKObjectQueryNoLimit,

sortDescriptors: [sort])

{ (query, results, error) in

guard error == nil else {

return

}

let unit = HKUnit.second()

for p in results as! [HKQuantitySample]{

let value = p.quantity.doubleValue(for: unit)

let dateFormat = DateFormatter()

dateFormat.locale = Locale.init(identifier: "en_BG")

dateFormat.dateFormat = "yyyy-MM-dd HH:mm:ss"

closure!( 0,0,(value * 1000).intValue,0 )

SimpleLog("HRV--\(dateFormat.string(from: p.startDate)): SDNN為 :\(value)")

}

}

kit.execute(query)

}

//MARK: 卡路里获取

static func queryKcal(quantityType:HKQuantityType,predicate:NSPredicate){

let query = HKSampleQuery(sampleType: quantityType, predicate: predicate, limit: 0, sortDescriptors: nil, resultsHandler: {

(query, results, error) in

if results == nil {

print("There was an error running the query: \(error)")

}

DispatchQueue.main.async {

var totalKcal = 0.0

for activity in results as! [HKQuantitySample]

{

let calories = activity.quantity.doubleValue(for: HKUnit.kilocalorie())

SimpleLog(" 卡路里 = \(calories) + \(activity.startDate.toFormat("yyyy-MM-dd HH-mm-ss"))")

totalKcal = totalKcal + calories

}

SimpleLog("总共消耗 卡路里 = \(totalKcal)")

}

})

self.kit.execute(query)

}

//MARK: 步数获取

//这里的步数是总步数,和各个来源 包含手动编辑录入的

// HKStatisticsOptionCumulativeSum 总步数

// HKStatisticsOptionSeparateBySource 健康App所有步数数据的来源,包括iPhone、iWatch、健康App、第三方App等

static func queryTotalStepCount(quantityType:HKQuantityType,predicate:NSPredicate){

let query = HKSampleQuery.init(sampleType: HKSampleType.quantityType(forIdentifier: .stepCount)!, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: [NSSortDescriptor.init(key: HKSampleSortIdentifierEndDate, ascending: false)], resultsHandler: { (query, results, error) in

for sameple in results ?? []{

let model = sameple as! HKQuantitySample

if model.sourceRevision.productType!.contains(find: "iPhone") {

let setupCount = model.quantity.doubleValue(for: HKUnit.count())

SimpleLog("步数 \(model.startDate.toFormat("yyyy-MM-dd HH-mm-ss")) \( model.startDate.toFormat("yyyy-MM-dd HH-mm-ss")) \( setupCount)")

userEnteredCount = userEnteredCount + setupCount

}

}

SimpleLog("步数\(userEnteredCount)")

})

self.kit.execute(query)

}

//MARK: 睡眠数据获取

static func querySleepData(quantityType:HKCategoryType,predicate:NSPredicate){

let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)

let query = HKSampleQuery(sampleType: quantityType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: [sortDescriptor]) { (query, tmpResult, error) in

if error != nil {

SimpleLog("获取睡眠失败,多半是没睡眠数据")

self.closure!(0,Int(userEnteredCount),0,0)

return

}

if let result = tmpResult {

for item in result {

if let sample = item as? HKCategorySample {

let value = (sample.value == HKCategoryValueSleepAnalysis.inBed.rawValue) ? "InBed" : "Asleep"

SimpleLog("获取睡眠\(sample.startDate.toFormat("yyyy-MM-dd HH-mm-ss"))")

if value == "Asleep" {

userSleepCount = userSleepCount + (sample.endDate.secondStamp - sample.startDate.secondStamp)

}

}

}

self.closure!(0,Int(userEnteredCount),userSleepCount,0)

SimpleLog("睡眠时间\(userSleepCount.hmWithHourMinuteForSetSleep)")

}

}

kit.execute(query)

}