2015-10-28 2 views
5

Ich schreibe eine einfache App, um die Herzfrequenz (HKQuantityTypeIdentifierHeartRate) von HealthKit zu überwachen, wann immer ein neuer Health-Rate-Wert in HealthKit geschrieben wird.Herzfrequenz überwachen von HealthKit -> HKAnchoredObjectQuery nur nach applicationDidBecomeActive (BUG oder FEATURE?) Aufgerufen

Wie auf WWDC2015 (Sitzung 203) zu sehen, verwende ich eine HKAnchoredObjectQuery, die zum Hinzufügen und Löschen von Objekten funktionieren sollte. Wann immer ich die App starte, rufe ich die HKQuery für die neuesten Objekte und executingQuery, die gut funktioniert !!! Aber ich bekomme keine neuen Samples, auch wenn die Samples dort sind, aber wenn ich die App in den Hintergrund und wieder in den Vordergrund bringe, bekomme ich alle neuen Herzfrequenzen. Ist es ein Fehler? Oder was soll ich tun, um die Herzfrequenz zu überwachen, ohne die App in den Vordergrund zu rücken? Hier

ist der Code, ich verwende (alles im AppDelegate gespeichert ist), ich rufe [self requestAccessDataTypes]; von didFinishLaunchingWithOptions:

[healthStore enableBackgroundDeliveryForType:sampleType frequency:HKUpdateFrequencyImmediate withCompletion:^(BOOL success, NSError *error) {}]; 

HKQuery *query = [self createHeartRateStreamingQuery:datum]; 
    if (query) { 
     [healthStore executeQuery:query]; 
    } 
    else 
    { 
     NSLog(@"workout can not start"); 
    } 

-(HKQuery*)createHeartRateStreamingQuery:(NSDate*)workoutStartDate 
{ 
    NSLog(@"%@ - createHeartRateStreamingQuery", [self class]); 

    if ([HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]) { 
     HKQuantityType *quantityType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; 

     HKAnchoredObjectQuery * heartRateQuery = [[HKAnchoredObjectQuery alloc] initWithType:quantityType predicate:nil anchor:anchor limit:HKObjectQueryNoLimit resultsHandler:^(HKAnchoredObjectQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable sampleObjects, NSArray<HKDeletedObject *> * _Nullable deletedObjects, HKQueryAnchor * _Nullable newAnchor, NSError * _Nullable error) { 

      if (!error) { 
       anchor = newAnchor; 
       [self updateHeartRate:sampleObjects]; 

      } 

     }]; 
     heartRateQuery.updateHandler = ^void(HKAnchoredObjectQuery *query, NSArray<__kindof HKSample *> * __nullable addedObjects, NSArray<HKDeletedObject *> * __nullable deletedObjects, HKQueryAnchor * __nullable newAnchor, NSError * __nullable error) 
     { 
      if (!error) { 
       anchor = newAnchor; 
       [self updateHeartRate:addedObjects]; 

      } 

     }; 
     return heartRateQuery; 
    } 
    return nil; 
} 

Antwort

1

Gerade jetzt (iOS 9.1, WatchOS 2.0 .1) ist es nicht möglich, die neuesten Daten von HealthKit über eine iOS-App zu erhalten. Dies war in der WWDC-Demo möglich, da der Code auf dem ExtensionDelegate der WatchOS-App und nicht in der iOS-App ausgeführt wurde. Es gibt einen Rdar-Fehlerbericht, der eingereicht wurde here.

Um die neuesten Daten zu iOS zu erhalten, ist es nicht möglich, eine WatchOS-App zu erstellen. Mit einer WatchOS-App können Sie mit einer Workout Session und Watch Connectivity Herzfrequenzdaten bei jeder Änderung an die iOS-App senden.

Natürlich hilft das nicht, wenn Ihre Herzfrequenzdaten nicht von einer Apple Watch stammen. Hoffentlich wird es in einer kommenden Version behoben werden.

+0

Vielen Dank für Ihre Antwort, aber ich verwende die automatische Übertragung der HealthKit Daten von der Uhr auf die Eltern-App, und wie ich in meiner Anfrage schrieb, werden die Daten mehr oder weniger in Echtzeit übertragen! Immer wenn ich die App starte, rufe ich die HKQuery für die neuesten Objekte an und führe die Abfrage auf der Eltern-App (z. B. iPhone) aus, was gut funktioniert !!! Aber ich bekomme keine neuen Samples, auch wenn die Samples dort sind, aber wenn ich die App in den Hintergrund und wieder in den Vordergrund bringe, bekomme ich alle neuen Herzfrequenzen. –

+1

Sicherlich ist es nicht ideal, dass Sie Ihre App schließen müssen, um die neuesten Daten zu erhalten. Ich habe versucht, auf dieses Problem hinzuweisen, und hoffentlich wird es Apple ermöglichen, die Daten zu bekommen, wenn es auf HealthKit auf iOS kommt, ohne solche Umgehungen wie diese. –

0

Sie verpassen ein entscheidendes Element, um Änderungen in HealthKit zu beobachten. Es heißt HKObserverQuery.

Docs

Observer Abfragen eine lang andauernde Aufgabe auf einem Hintergrund-Warteschlange einrichten. Diese Aufgabe überwacht den HealthKit-Speicher und warnt Sie, wenn übereinstimmende Daten im Speicher gespeichert oder aus dem Speicher entfernt werden . Observer-Abfragen lassen Sie Ihre App auf Änderungen reagieren, die von anderen Apps und Geräten vorgenommen wurden.

Recap:

Sie haben Ihre HKAnchoredObjectQuery in HKObserverQuery mit Hintergrund Lieferung aktivieren, um wickeln benachrichtigt über Updates zu erhalten. Sie können dann Ihre Abfrage ausführen, wenn dies geschieht.

Hinweis 1: HKObserverQuery 's Update-Handler wird Ihnen keine Apple Health-Datenproben geben. Sie müssen Ihren HKAnchoredObjectQuery mit einem richtigen Anker ausführen, um die Proben zu erhalten.

Hinweis 2: Sie müssen bei jedem Start der App HKObserverQuery einrichten.

Weitere Informationen finden Sie in meiner Antwort here.

Verwandte Themen