2016-06-23 9 views
0

Ich versuche, meine App zu synchronisieren, wenn neue Dateneingaben beobachtet werden. Despite some ambiguity in the logic Ich glaube, es ist mir gelungen, die Hintergrundlieferung für die Probentypen zu ermöglichen und die Beobachter bei Bedarf reagieren zu lassen.HKAnchoredObjectQuery wird im Hintergrund nicht zuverlässig zurückgegeben

Allerdings muss ich im Updatehandler des Beobachters ein HKAnchoredObjectQuery zum Abrufen der neuesten Ergebnisse von HealthKit erstellen, aber diese Abfragen werden nicht zuverlässig zurückgegeben, wenn meine App im Hintergrund ausgeführt wird. Wenn ich in HealthKit Beispielpunkte hinzufüge, werden die verankerten Abfragen nur ausgeführt, aber sie werden nur zurückgegeben, wenn ich die Anwendung wieder in den Vordergrund bringe.

Andere Male kehren sie sofort zurück, ohne dass ich die App aktivieren muss. Ein mögliches Problem besteht darin, dass alle meine Observer-Abfragen ihre Updatehandler auslösen, wodurch mehrere AnchoredObjectQueries erstellt werden, die zurückgegeben werden können oder nicht. Ich habe das im verknüpften Thread weiter erklärt, weil es vielleicht nichts damit zu tun hat.

Hier ist ein Beispiel für die Funktion von HKObserverQuery des updatehandler Ich rufe:

func synchronizeRecentData(sampleType: HKSampleType, observerQuery: HKObserverQuery) { 

    let completionHandler: (HKAnchoredObjectQuery, [HKSample]?, Int, NSError?) -> Void = { 
     [unowned self] query, results, newAnchor, error in 

     if error != nil { 
      abort() 
     } 

     // Update queryAnchor 
     self.queryAnchors[sampleType] = newAnchor 

     guard let receivedNewSamples = results as? [HKQuantitySample] else { 
      abort() 
     } 

     // Handle received samples here 
    } 

    let query = HKAnchoredObjectQuery(type: sampleType, 
             predicate: nil, 
             anchor: self.queryAnchors[sampleType]!, 
             limit: HKObjectQueryNoLimit, 
             completionHandler: completionHandler) 
    healthKitStore.executeQuery(query) 
} 
+0

Wenn Sie möchten, dass Ihre App nicht ausgesetzt werden, sollten Sie einen HKWorkoutSession starten. –

Antwort

0

Ich glaube, das liegt daran, dass, wenn Ihre app im Hintergrund geweckt wird Sie sehr begrenzte Zeit auszuführen, bevor die App bekommt wieder ausgesetzt. Wenn Sie UIBackgroundTaskIdentifier verwenden, sollten Sie sicherstellen können, dass Ihre App lange genug ausgeführt wird, um die Ergebnisse von HKAnchoredObjectQuery abzurufen.

1

Nach der HealthKit docs:

Im Gegensatz zu den Beobachtern Abfrage enthält dieses Updates eine Liste der Elemente, die hinzugefügt oder entfernt wurden; verankerte Objektabfragen können jedoch nicht für die Hintergrundlieferung registriert werden. Weitere Informationen finden Sie unter HKAnchoredObjectQuery.

Die einzige Frage, die für den Hintergrund Lieferung registrieren kann, ist die HKObserverQuery

Verwandte Themen