//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.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)
}