如何使用Swift从HealthKit for ios app获得骑行时间

时间:2016-07-12 07:29:35

标签: ios swift swift2 health-kit hksamplequery

我正在创建一个应用程序,我正在从health-Kit读取数据。我能够读取步数,跑步+步行等。现在我正在尝试阅读骑自行车的日期和持续时间。这就是我用于跑步+散步的原因

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 app中,但为什么我的结果为nil?请帮忙

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


    }

1 个答案:

答案 0 :(得分:1)

使用下面给出的功能。它给你最好的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                  
            }