2016-04-11 6 views
4

Meine Swift iOS-App stellt eine Verbindung mit HealthKit her, um dem Benutzer anzuzeigen, wie viele Schritte er bis zu diesem Tag gemacht hat. In den meisten Fällen ist dies erfolgreich. Wenn die einzige Schrittquelle Schritte sind, die von der integrierten Schrittzählerfunktion des iPhones aufgenommen wurden, funktioniert alles einwandfrei und die von meiner App angezeigte Schrittanzahl stimmt mit der Schrittanzahl der Health-App überein. Wenn jedoch mehrere Datenquellen - auf meinem persönlichen iPhone - vorhanden sind, führen meine Pebble Time-Smartwatch und der Schrittzähler des iPhones beide Schritte zur Gesundheit - meine App läuft durch und zeichnet alle Schritte von beiden auf. Während die iOS Health App doppelte Schritte durchläuft (was möglich ist, weil sowohl mein iPhone als auch mein Pebble-Bericht alle 60 Sekunden auf "Gesundheit" gehen) und eine genaue tägliche Schrittzahl zeigt, enthalten die Daten, die meine App von HealthKit bezieht, alle Schritte von beiden Quellen, die große Ungenauigkeiten verursachen.Gesundheit behandelt mehrstufige Quellen anders als HealthKit-swift

Wie kann ich das Endergebnis der Health-App abrufen, in dem die Schrittanzahl korrekt ist, anstatt den überladenen Schritt von HealthKit zu verwenden?

UPDATE: Hier ist der Code, den ich täglich Gesundheitsdaten zu erhalten verwenden:

func recentSteps2(completion: (Double, NSError?) ->()) 
    { 

     checkAuthorization() // checkAuthorization just makes sure user is allowing us to access their health data. 
     let type = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount) // The type of data we are requesting 


     let date = NSDate() 
     let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
     let newDate = cal.startOfDayForDate(date) 
     let predicate = HKQuery.predicateForSamplesWithStartDate(newDate, endDate: NSDate(), options: .None) // Our search predicate which will fetch all steps taken today 

     // The actual HealthKit Query which will fetch all of the steps and add them up for us. 
     let query = HKSampleQuery(sampleType: type!, predicate: predicate, limit: 0, sortDescriptors: nil) { query, results, error in 
      var steps: Double = 0 

      if results?.count > 0 
      { 
       for result in results as! [HKQuantitySample] 
       { 
        steps += result.quantity.doubleValueForUnit(HKUnit.countUnit()) 
       } 
      } 

      completion(steps, error) 
     } 

     storage.executeQuery(query) 
    } 
+0

Bitte fügen Sie ein Code-Snippet ein, das zeigt, wie Sie die Anzahl der Schritte berechnen, die der Benutzer unternimmt. Welche Art von Abfrage verwenden Sie? – Allan

+0

@Allan Ich habe meine Frage aktualisiert, um den Code einzubeziehen, mit dem ich die Schritte des Benutzers berechne. – owlswipe

Antwort

8

Ihr Code ist über Zählschritte, weil es einfach die Ergebnisse einer HKSampleQuery fasst. Eine Beispielabfrage gibt alle Stichproben zurück, die mit dem angegebenen Prädikat übereinstimmen, einschließlich überlappender Stichproben aus mehreren Quellen. Wenn Sie die Schrittzahl des Benutzers unter Verwendung von HKSampleQuery genau berechnen möchten, müssen Sie überlappende Stichproben erkennen und vermeiden, diese zu zählen, was mühsam und schwierig wäre.

Health verwendet HKStatisticsQuery und HKStatisticsCollectionQuery, um Aggregatwerte zu berechnen. Diese Abfragen berechnen die Summe (und andere Aggregatwerte) für Sie und tun dies auf effiziente Weise. Am wichtigsten ist jedoch, dass sie überlappende Samples duplizierten, um ein Überzählen zu vermeiden.

Die documentation for HKStatisticsQuery enthält Beispielcode.

+0

Danke! Kann ich ein wenig mehr Informationen über HKStatisticsQuery haben? Vielleicht ein Code-Beispiel oder ein Link zu einem Tutorial (Ich suchte Google und es ist ziemlich spärlich)? – owlswipe

+0

Haben Sie versucht, den Beispielcode in der Referenzdokumentation zu sehen? https://developer.apple.com/library/ios/documentation/HealthKit/Reference/HKStatisticsQuery_Class/ – Allan

Verwandte Themen