如何使用 Swift 从 ios 应用程序的 HealthKit 获取循环持续时间
How to get cycling duration from HealthKit for ios app using Swift
我正在创建一个从 health-Kit 读取数据的应用程序。我能够读取步数,运行 + 步行等。现在我正在尝试读取骑自行车的日期和持续时间。这就是我在 运行 + Walking
中使用的
func readDistanceWalkingRunning(completion: (([AnyObject]!, NSError!) -> Void)!) {
let runningWalking = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)
let predicate = HKQuery.predicateForSamplesWithStartDate(NSDate().dateByAddingTimeInterval(-86400.0), endDate: NSDate(), options: HKQueryOptions.None)
let stepsSampleQuery = HKSampleQuery(sampleType: runningWalking!,
predicate: predicate,
limit: 100,
sortDescriptors: nil)
{ [weak self] (query, results, error) in
if let results = results as? [HKQuantitySample] {
for result in results {
print(" Distance was " + " \(result.quantity.doubleValueForUnit(HKUnit.mileUnit())) ")
print("Date was " + "\(result.startDate)")
}
}
}
// Don't forget to execute the Query!
executeQuery(stepsSampleQuery)
}
一切都很好,但是当我尝试使用下面的代码读取骑自行车的距离时,我得到的结果为零。循环数据显示在 appleHealth 应用程序中,但为什么我得到的结果为零?请帮助
func readDistanceCycling(completion: (([AnyObject]!, NSError!) -> Void)!) {
let distanceCycling = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceCycling)
let predicate = HKQuery.predicateForSamplesWithStartDate(NSDate(), endDate: NSDate(), options: HKQueryOptions.None)
let query = HKSampleQuery(sampleType: distanceCycling!, predicate: predicate, limit: 100, sortDescriptors: nil, resultsHandler: { query, result, error in
if result != nil
{
print("We have some Data")
}
else
{
print("Result is nil")
}
if let results = result as? [HKQuantitySample] {
for result in results {
print(" Quantity type " + " \(result.quantityType) ")
print("Date was " + "\(result.startDate)")
}
}
})
executeQuery(query)
}
}
使用下面给出的函数。它给你至少 7 条记录。根据您的要求,您也可以更改它。
func getHealthDataValue ( HealthQuantityType : HKQuantityType , strUnitType : String , GetBackFinalhealthData: ((( healthValues : [AnyObject] ) -> Void)!) )
{
if let heartRateType = HKQuantityType.quantityTypeForIdentifier(HealthQuantityType.identifier)
{
if (HKHealthStore.isHealthDataAvailable() ){
let sortByTime = NSSortDescriptor(key:HKSampleSortIdentifierEndDate, ascending:false)
// let timeFormatter = NSDateFormatter()
// timeFormatter.dateFormat = "hh:mm:ss"
//yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
let query = HKSampleQuery(sampleType:heartRateType, predicate:nil, limit:7, sortDescriptors:[sortByTime], resultsHandler:{(query, results, error) in
guard let results = results else {
//include the healthkit error in log
if let errorDescription = error!.description as String?
{
GetBackFinalhealthData (healthValues: ["nodata"])
}
return
}
var arrHealthValues = [AnyObject]()
for quantitySample in results {
let quantity = (quantitySample as! HKQuantitySample).quantity
let healthDataUnit : HKUnit
if (strUnitType.length > 0 ){
healthDataUnit = HKUnit(fromString: strUnitType)
}else{
healthDataUnit = HKUnit.countUnit()
}
let tempActualhealthData = "\(quantity.doubleValueForUnit(healthDataUnit))"
let tempActualRecordedDate = "\(dateFormatter.stringFromDate(quantitySample.startDate))"
if (tempActualhealthData.length > 0){
let dicHealth : [String:AnyObject] = [HealthValue.kIdentifierValue :tempActualhealthData , HealthValue.kRecordDate :tempActualRecordedDate , HealthValue.kIdentifierDisplayUnit : strUnitType ]
arrHealthValues.append(dicHealth)
}
}
if (arrHealthValues.count > 0)
{
GetBackFinalhealthData (healthValues: arrHealthValues)
}
else
{
GetBackFinalhealthData (healthValues: [HealthValue.kNoData])
}
})
(self.HealthStore as! HKHealthStore).executeQuery(query)
}
}
}
使用上面的函数如下。
这里需要传递一个类型和单位。
self.getHealthDataValue(HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBloodPressureDiastolic), strUnitType: "mmHg"
) { (arrHealth) -> Void in
}
我正在创建一个从 health-Kit 读取数据的应用程序。我能够读取步数,运行 + 步行等。现在我正在尝试读取骑自行车的日期和持续时间。这就是我在 运行 + Walking
中使用的func readDistanceWalkingRunning(completion: (([AnyObject]!, NSError!) -> Void)!) {
let runningWalking = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)
let predicate = HKQuery.predicateForSamplesWithStartDate(NSDate().dateByAddingTimeInterval(-86400.0), endDate: NSDate(), options: HKQueryOptions.None)
let stepsSampleQuery = HKSampleQuery(sampleType: runningWalking!,
predicate: predicate,
limit: 100,
sortDescriptors: nil)
{ [weak self] (query, results, error) in
if let results = results as? [HKQuantitySample] {
for result in results {
print(" Distance was " + " \(result.quantity.doubleValueForUnit(HKUnit.mileUnit())) ")
print("Date was " + "\(result.startDate)")
}
}
}
// Don't forget to execute the Query!
executeQuery(stepsSampleQuery)
}
一切都很好,但是当我尝试使用下面的代码读取骑自行车的距离时,我得到的结果为零。循环数据显示在 appleHealth 应用程序中,但为什么我得到的结果为零?请帮助
func readDistanceCycling(completion: (([AnyObject]!, NSError!) -> Void)!) {
let distanceCycling = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceCycling)
let predicate = HKQuery.predicateForSamplesWithStartDate(NSDate(), endDate: NSDate(), options: HKQueryOptions.None)
let query = HKSampleQuery(sampleType: distanceCycling!, predicate: predicate, limit: 100, sortDescriptors: nil, resultsHandler: { query, result, error in
if result != nil
{
print("We have some Data")
}
else
{
print("Result is nil")
}
if let results = result as? [HKQuantitySample] {
for result in results {
print(" Quantity type " + " \(result.quantityType) ")
print("Date was " + "\(result.startDate)")
}
}
})
executeQuery(query)
}
}
使用下面给出的函数。它给你至少 7 条记录。根据您的要求,您也可以更改它。
func getHealthDataValue ( HealthQuantityType : HKQuantityType , strUnitType : String , GetBackFinalhealthData: ((( healthValues : [AnyObject] ) -> Void)!) )
{
if let heartRateType = HKQuantityType.quantityTypeForIdentifier(HealthQuantityType.identifier)
{
if (HKHealthStore.isHealthDataAvailable() ){
let sortByTime = NSSortDescriptor(key:HKSampleSortIdentifierEndDate, ascending:false)
// let timeFormatter = NSDateFormatter()
// timeFormatter.dateFormat = "hh:mm:ss"
//yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
let query = HKSampleQuery(sampleType:heartRateType, predicate:nil, limit:7, sortDescriptors:[sortByTime], resultsHandler:{(query, results, error) in
guard let results = results else {
//include the healthkit error in log
if let errorDescription = error!.description as String?
{
GetBackFinalhealthData (healthValues: ["nodata"])
}
return
}
var arrHealthValues = [AnyObject]()
for quantitySample in results {
let quantity = (quantitySample as! HKQuantitySample).quantity
let healthDataUnit : HKUnit
if (strUnitType.length > 0 ){
healthDataUnit = HKUnit(fromString: strUnitType)
}else{
healthDataUnit = HKUnit.countUnit()
}
let tempActualhealthData = "\(quantity.doubleValueForUnit(healthDataUnit))"
let tempActualRecordedDate = "\(dateFormatter.stringFromDate(quantitySample.startDate))"
if (tempActualhealthData.length > 0){
let dicHealth : [String:AnyObject] = [HealthValue.kIdentifierValue :tempActualhealthData , HealthValue.kRecordDate :tempActualRecordedDate , HealthValue.kIdentifierDisplayUnit : strUnitType ]
arrHealthValues.append(dicHealth)
}
}
if (arrHealthValues.count > 0)
{
GetBackFinalhealthData (healthValues: arrHealthValues)
}
else
{
GetBackFinalhealthData (healthValues: [HealthValue.kNoData])
}
})
(self.HealthStore as! HKHealthStore).executeQuery(query)
}
}
}
使用上面的函数如下。 这里需要传递一个类型和单位。
self.getHealthDataValue(HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBloodPressureDiastolic), strUnitType: "mmHg"
) { (arrHealth) -> Void in
}