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;
}
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. –
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. –