Date
Nov. 21st, 2024
 
2024年 10月 21日

Post: iOS : HealthKit 牛刀小试

iOS : HealthKit 牛刀小试

Published 12:12 Dec 02, 2015.

Created by @ezra. Categorized in #Programming, and tagged as #iOS.

Source format: Markdown

Table of Content

HealthKit 发布已经很久了,最近有机会用到,小试一把。

Framework

首先要导入 HealthKit.framework 框架,在 Build Phases 下 Link Binary with Libraries 中添加即可。

Capabilities

与 iCloud 等功能类似,也需要在 Capabilities 中开启后才能使用。

System Version

HealthKit 是与 iOS 8 一同推出的,仅有运行 iOS 8 以上版本系统的 iPhone 与 Apple Watch 可以使用。你可以通过这句代码来判断设备是否支持 HealthKit:

HKHealthStore.isHealthDataAvailable()

Authorization

当 HealtKit 可用时,需要进行授权操作:

let healthStore = HKHealthStore()
let readObjectTypes: Setter<HKObjectType> = NSSet(object: HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)!) as! Setter<HKObjectType>
healthStore.requestAuthorizationToShareTypes(nil, readTypes: readObjectTypes, completion: { (success: Bool, error: NSError?) -> Void in
    if success {
        print("授权成功")
    } else {
        print("授权失败")
    }
})

这里用来授权的方法是:

public func requestAuthorizationToShareTypes(typesToShare: Setter<HKSampleType>?, readTypes typesToRead: Setter<HKObjectType>?, completion: (Bool, NSError?) -> Void)
  • typesToShare: NSSet,可能修改数据的类型

  • typesToRead: NSSet,可能会读取数据的类型

  • completion: 授权回调

Get Data

// 表示获取数据为步数
let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)
// 获取数据的时间段,前两个参数为 nil 表示获取全部数据
let predicate = HKQuery.predicateForSamplesWithStartDate(nil, endDate: nil, options: HKQueryOptions.StrictStartDate)
// 对结果排序
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: true)
// 获取数据
let sampleQuery = HKSampleQuery(sampleType: sampleType!, predicate: predicate, limit: Int(HKObjectQueryNoLimit), sortDescriptors: [sortDescriptor], resultsHandler: { (query: HKSampleQuery, results: [HKSample]?, error: NSError?) -> Void in
    if error == nil {
        for samples: HKSample in results! {
            print("\(samples)")
        }
    } else {
        print("error != nil")
    }
})
// 执行数据库查询
healthStore.executeQuery(sampleQuery)

Simple Data

上面我们已经获取到了数据,但我们会发现这些数据比较详细,而大部分情况下我们只需要一些基础信息,例如总的步数。

// 获取数据为步数
let quantityType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)
// 获取步数的间隔
let dateComponents = NSDateComponents()
dateComponents.day = 1
// 查询统计的实例
let collectionQuery = HKStatisticsCollectionQuery(quantityType: quantityType!, quantitySamplePredicate: nil, options: HKStatisticsOptions.CumulativeSum, anchorDate: NSDate(timeIntervalSince1970: 0), intervalComponents: dateComponents)
collectionQuery.initialResultsHandler = { (query: HKStatisticsCollectionQuery, result: HKStatisticsCollection?, error: NSError?) -> Void in
    for statistic in (result?.statistics())! {
        print("\(statistic.startDate) -- \(statistic.endDate)")
        for source in statistic.sources! {
            if source.name == UIDevice.currentDevice().name {
                print("\(source)\n\(statistic.sumQuantityForSource(source)?.doubleValueForUnit(HKUnit.countUnit()))")
            }
        }
    }
}

healthStore.executeQuery(collectionQuery)
Pinned Message
HOTODOGO
The Founder and CEO of Infeca Technology.
Developer, Designer, Blogger.
Big fan of Apple, Love of colour.
Feel free to contact me.
反曲点科技创始人和首席执行官。
开发、设计与写作皆为所长。
热爱苹果、钟情色彩。
随时恭候 垂询