2016-07-12 22 views
1

Ich erstelle eine App, in der ich Daten aus dem health-Kit lese. Ich bin in der Lage, die Anzahl der Schritte zu lesen, Running + Walking usw. Jetzt versuche ich das Datum und die Dauer des Radfahrens zu lesen. Das ist, was ich mit für das Ausführen + GehenSo erhalten Sie die Dauer des Radfahrens von HealthKit für die ios app mit Swift

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

Und alles ist in Ordnung, aber wenn ich versuche, Distanz zu lesen zum Radfahren des Code unten verwenden, erhalte ich null Ergebnis. Radfahrdaten werden in der App "appleHealth" angezeigt, aber warum erhalte ich das Ergebnis als "null"? Bitte helfen

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


    } 

Antwort

1

Verwendung unten angegebenen Funktion. Es gibt dir den letzten 7 Rekord. Entsprechend Ihrer Anforderung können Sie es auch ändern.

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

}

Verwenden oben Funktion wie folgt. Hier müssen Sie einen Typ und eine Einheit übergeben.

self.getHealthDataValue(HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBloodPressureDiastolic), strUnitType: "mmHg" 
       ) { (arrHealth) -> Void in     
      } 
+0

wird es mir radfahren Aufzeichnungen? : -o – Byte

+0

Diese Methode geben Sie alles, was Sie wollen. – iMHitesh

+0

Aber Sie müssen Methode richtig aufrufen – iMHitesh