2017-04-13 2 views
0

Nehmen wir an, wir verwenden Schrittzähler als Auslöser - wenn der Benutzer 10 Schritte unternimmt, möchte ich eine Benachrichtigung zu Pop sag es so.HealthKit: Erhalten einer Benachrichtigung ausgelöst durch körperliche Aktivität, Hintergrund und abgeschlossenen Zustand (Obj-C, iOS 10.3)

Diese Frage wurde beantwortet: Healthkit background delivery when app is not running

aber ich habe es nicht in der Lage gewesen, zu arbeiten. Wenn ich mit der App im Vordergrund herumlaufe, wird die Schrittzahl aktualisiert. Wenn ich die App im Hintergrund belasse, scheint die Anzahl der Schritte erst nach dem Öffnen der App aktualisiert zu werden. Die Hintergrundabfrage scheint also nicht zu funktionieren.

Ich habe versucht, Hintergrundmodi zu aktivieren, kein Effekt; Ich habe versucht, die App für mehrere Stunden im Hintergrund zu lassen und dachte, es könnte eine Weile dauern, bis die Daten gesendet werden - nichts.

Jemand anderswo hat gesagt, dass er StatisticsCollectionQuery ausprobieren soll, weil StatisticsQuery kaputt war - keine Wahrheit? StatisticsCollectionQuery ist nicht wirklich ideal für das, was ich mache.

Hier ist meine Abfrage-Code:

[self.healthStore enableBackgroundDeliveryForType:[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount] 
             frequency:HKUpdateFrequencyImmediate 
            withCompletion:^(BOOL success, NSError * _Nullable error) { 
             if (error) { 

              // Perform Proper Error Handling Here... 
              NSLog(@"*** An error occured while setting up background updates. %@ ***", 
               error.localizedDescription); 
             } 
             if (success == YES) { 
              backgroundEnabled = YES; 
             } 
            }]; 


// set up running observer 

HKSampleType *sampleType = 
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]; 

HKObserverQuery *query = 
[[HKObserverQuery alloc] 
initWithSampleType:sampleType 
predicate:nil 
updateHandler:^(HKObserverQuery *query, 
       HKObserverQueryCompletionHandler completionHandler, 
       NSError *error) { 

    if (error) { 

     // Perform Proper Error Handling Here... 
     NSLog(@"*** An error occured while setting up the stepCount observer. %@ ***", 
       error.localizedDescription); 
     // Error popup 

     return; 
    } 

    // Take whatever steps are necessary to update your app's data and UI 
    // This may involve executing other queries 
    [self updateDailyStepCount]; 

    // If you have subscribed for background updates you must call the completion handler here. 
    completionHandler(); 

}]; 

[self.healthStore executeQuery:query]; 

Antwort

1

Die Tatsache, dass Sie aufgefordert HKUpdateFrequencyImmediate empfiehlt Ihnen nicht sorgfältig studiert für enableBackgroundDeliveryForType:frequency:withCompletion: die Dokumentation haben. Die Dokumente haben ein großes "Notiz" -Feld, das erklärt, dass Schrittanzahl niemals öfter als stündlich bereitgestellt wird.

Wenn das der Fall ist, empfehle ich, die Diskussion in diesem Abschnitt genau zu lesen, weil HK schwierig und nicht offensichtlich ist. Rufen Sie diese Abfrage beispielsweise in application:didFinishLaunchingWithOptions: auf? Haben Sie versucht, Ihre App neu zu installieren (ich würde löschen und neu von Grund auf neu installieren). Wenn Sie die completionHandler() nicht dreimal anrufen, wird iOS Sie nicht mehr benachrichtigen. Ich empfehle, eine kleine, einfache App zu erstellen, die nur die Schrittanzahl protokolliert. nutze das, um alle Details abzuarbeiten.

Siehe auch HealthKit (iOS) wont deliver data in background (objC). Es ist unklar, ob Sie diese Punkte bereits aus Ihrer Diskussion implementiert haben.

+0

Ich habe HKUpdateFrequencyImmediate nur verwendet, um das schnellste Ergebnis zu erhalten, aber ich weiß, dass es standardmäßig auf stündlich eingestellt ist, kann ich versuchen, das zu ändern. Ich rufe die Abfrage in der Anwendung auf: didFinishLaunchingWithOptions. Ich lese die Diskussion, es heißt, Sie müssen CompletionHandler einmal aufrufen, und ich tat das (die drei Mal ist etwas anderes). – Adam

+0

Sorry, nur dreimal gemeint, wenn iOS dich dreimal fragt und du nicht antwortest, dann hört es auf dich zu fragen. Aber du scheinst schon oben drauf zu sein. –

Verwandte Themen