5

gesperrt Hallo Ich versuche, die Gesundheits-Shop Beobachter mit Hintergrund Lieferung Setup aktiviert. Mein Problem ist, dass es nichts liefert, wenn der Bildschirm gesperrt ist. Ich habe meinen Code vereinfachte für diese Frage auf den Punkt zu bekommen :) ich HealthKit in meinem plist habe, und ich habe healthStore Typen Schrittzahl angenommen. Alles ist in Ordnung, wenn die Anwendung geöffnet ist, und wenn der Bildschirm gesperrt ist nicht. Aber wenn der Bildschirm gesperrt ist, bekomme ich keine Beobachtungen. Zu Testzwecken wird die Frequenz auf sofort gesetzt.HealthStor enableBackgroundDelivery wenn Bildschirm

Mein Code ist wie folgt

- (void)setupHealthStore{ 
if ([HKHealthStore isHealthDataAvailable]) 
{ 
    NSSet *readDataTypes = [self dataTypesToRead]; 
    self.healthStore = [[HKHealthStore alloc]init]; 
    [self.healthStore requestAuthorizationToShareTypes:nil readTypes:readDataTypes completion:^(BOOL success, NSError *error) 
    { 
     if (success) 
     { 
      HKQuantityType *quantityType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]; 
      [self.healthStore enableBackgroundDeliveryForType:quantityType frequency:HKUpdateFrequencyImmediate withCompletion:^(BOOL success, NSError *error) 
      { 
       if (success) 
       { 
        [self setupObserver]; 
       } 
      }]; 
     } 
    }]; 
} 

}

Das obige Verfahren in AppDelegate didfinishLaunchWithOptions genannt wird

Die nächste Methode

- (void)setupObserver{ 
HKQuantityType *quantityType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]; 
HKObserverQuery *query = [[HKObserverQuery alloc]initWithSampleType:quantityType predicate:nil updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) 
{ 
    if (!error) 
    { 
     [self alarm]; 
     if (completionHandler) 
     { 
      NSLog(@"Completed"); 
      completionHandler(); 
     } 
    } 
    else 
    { 
     if (completionHandler) 
     { 
      completionHandler(); 
     } 
    } 
}]; 
[self.healthStore executeQuery:query]; 

}

ist

Wenn ich die App öffne, gibt sie sofort die Beobachtung zurück.

+0

Schauen Sie sich meine Antwort hier an: http://stackoverflow.com/a/35073904/1677480 – damirstuhec

Antwort

2

konnte ich dieses Gewicht und Blutzucker Veränderungen HealthKit zur Arbeit kommen zu beobachten.

In ApplicationDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Override point for customization after application launch.   

    GlobalHealthManager.startObservingWeightChanges() 

    return true 
} 

HealthManager.swift

let past = NSDate.distantPast() as NSDate 
    let now = NSDate() 
    return HKQuery.predicateForSamplesWithStartDate(past, endDate:now, options: .None) 

    }() 

    //here is my query: 
    lazy var query: HKObserverQuery = {[weak self] in 
    let strongSelf = self! 
    return HKObserverQuery(sampleType: strongSelf.weightQuantityType, 
     //predicate: strongSelf.longRunningPredicate, 
     predicate : nil, //all samples delivered 
     updateHandler: strongSelf.weightChangedHandler) 
    }() 




func startObservingWeightChanges(){ 
     healthKitStore?.executeQuery(query) 
     healthKitStore?.enableBackgroundDeliveryForType(weightQuantityType, 
      frequency: .Immediate, 
      withCompletion: {(succeeded: Bool, error: NSError!) in 

      if succeeded{ 
       println("Enabled background delivery of weight changes") 
      } else { 
       if let theError = error{ 
        print("Failed to enable background delivery of weight changes. ") 
        println("Error = \(theError)") 
       } 
      } 

    }) 
} 



/** this should get called in the background */ 
func weightChangedHandler(query: HKObserverQuery!, 
    completionHandler: HKObserverQueryCompletionHandler!, 
    error: NSError!){ 

     NSLog(" Got an update Here ") 

    /** this function will get called each time a new weight sample is added to healthKit. 

    //Here, I need to actually query for the changed values.. 
    //using the standard query functions in HealthKit.. 

     //Tell IOS we're done... updated my server, etc. 
     completionHandler()   
} 


} 
+0

Ich sollte beachten, dass dies funktioniert, auch wenn die App nicht ausgeführt wird, vorausgesetzt, Sie haben die richtigen Berechtigungen. – cmollis

+0

Vielen Dank für die Antwort. Können Sie den HealthStore tatsächlich nach Daten abfragen?Denn nach den Docs HealthStore ist geschützt, wenn der Bildschirm gesperrt ist .. Mit gesperrt, ich meine mit Passcode gesperrt. Wie auch immer, es ist schön, wenn es funktioniert, aber ich brauche es für den Schritt-Datentyp. – Thomas

+0

Ja, ich bin in der Lage, die Daten mit den HK-Abfrage-APIs abzufragen. Ich bin verwirrt über das Passcode-Problem. Wenn der Bildschirm gesperrt ist und Ihre App (oder welche App diese Daten schreibt) in der Lage ist, die Schritte in die HK-Datenbank zu schreiben, würde ich denken, dass die Hintergrundbeobachter funktionieren. – cmollis

0

Schritte weisen eine minimale Aktualisierungsfrequenz von 1 Stunde, Ihre App wird also nur einmal pro Stunde geweckt. Sobald Sie die App öffnen, werden Ihre Beobachteranfragen sofort ausgelöst. Beachten Sie den Hinweis in der Diskussion zu enableBackgroundDeliveryForType.

https://developer.apple.com/library/prerelease/ios/documentation/HealthKit/Reference/HKHealthStore_Class/index.html#//apple_ref/occ/instm/HKHealthStore/enableBackgroundDeliveryForType:frequency:withCompletion:

+0

Ich lese es ein bisschen anders, ich verstehe die Mindestaktualisierungshäufigkeit, wie ich es mindestens einmal pro Stunde bekommen sollte, ich kann es sofort bekommen, wenn ich das will, aber ich kann das Minimum nicht auf etwas mehr als einmal pro Stunde setzen, zB einmal pro Tag ist nicht erlaubt. Ich habe das getestet und ich bekomme sofort Schritte, wenn ich die Frequenz darauf einstelle. – Thomas

+0

Nun, wird dein Experimentieren das bestätigen? Wird Ihre App sofort oder einmal pro Stunde geweckt? – drdaanger

+0

Der Beobachter wird sofort benachrichtigt, aber nur, wenn die Anwendung von anderen Diensten wie dem Standortdienst oder dem Abruf im Hintergrund aktiviert wird. – Thomas

0

Bei HKObserverQuery, haben Sie eine der Hintergrundart der Anwendung zu ermöglichen, für die ObserverQuery im Hintergrund, um informiert (Anmeldung nicht getötet).

enter image description here

8

Wenn das iPhone gesperrt ist, können Sie nicht healthKit Daten mit irgendeiner Art und Weise zuzugreifen.

Wenn das iPhone entsperrt, aber die App im Hintergrund läuft, können Sie nur verwenden HKObserverQuery, die verwendet wird, zu wissen, ob einige neue Proben hinzugefügt werden oder nicht.

Wenn das iPhone entsperrt ist und die App im Vordergrund steht, können Sie alles, was mit HealthKit Framework verwenden.

+0

Dies sollte die richtige Antwort sein. HealthKit kann nicht abgefragt werden, wenn der Gerätebildschirm ausgeschaltet ist und ein Passcode festgelegt wurde (dies wird als gesperrt bezeichnet). – lehn0058