salud pasos mide los health funciona descargar contador como apple app ios swift background-process health-kit

ios - pasos - Entrega de fondo Healthkit cuando la aplicación no se está ejecutando



como funciona el contador de pasos del iphone (3)

En iOS 8.1 lo hace. application:didFinishLaunchingWithOptions: embargo, debe asegurarse de volver a crear las consultas de su observador en la aplicación del delegado de su application:didFinishLaunchingWithOptions: . Un error en 8.0 impide que funcione la notificación de fondo de HealthKit.

EDITAR:

En su AppDelegate :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //create/get your HKHealthStore instance (called healthStore here) //get permission to read the data types you need. //define type, frequency, and predicate (called type, frequency, and predicate here, appropriately) UIBackgroundTaskIdentifier __block taskID = [application beginBackgroundTaskWithExpirationHandler:^{ if (taskID != UIBackgroundTaskInvalid) { [application endBackgroundTask:taskID]; taskID = UIBackgroundTaskInvalid; } }]; [healthStore enableBackgroundDeliveryForType:type frequency:frequency withCompletion:^(BOOL success, NSError *error) {}]; HKQuery *query = [[HKObserverQuery alloc] initWithSampleType:healthType predicate:predicate updateHandler: ^void(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) { //If we don''t call the completion handler right away, Apple gets mad. They''ll try sending us the same notification here 3 times on a back-off algorithm. The preferred method is we just call the completion handler. Makes me wonder why they even HAVE a completionHandler if we''re expected to just call it right away... if (completionHandler) { completionHandler(); } //HANDLE DATA HERE if (taskID != UIBackgroundTaskInvalid) { [application endBackgroundTask:taskID]; taskID = UIBackgroundTaskInvalid; } }]; [healthStore executeQuery:query]; }

¿Puede la entrega en segundo plano de HealthKit iniciar la aplicación si no se está ejecutando? ¿Particularmente en un estado terminado?


Esta respuesta es un poco tarde, pero espero que esto ayude a la gente a entender cómo trabajar con HKObserverQuery éxito.

En primer lugar, HKObserverQuery funciona bien en el modo de fondo y cuando la aplicación está cerrada . Pero primero debe establecer algunas opciones para permitir que todo funcione bien.

  1. Necesita configurar los modos de fondo en las capacidades de su aplicación. Vea la imagen de abajo:
  1. Luego debe agregar los Required Background Modes en su info.plist como en la siguiente imagen:
  1. Debe configurar la Background Fetch de la siguiente manera:

    3.1. Desde el menú de la barra de herramientas Esquema, elija un Simulador o Dispositivo iOS.

    3.2. Del mismo menú, elija Editar esquema.

    3.3. En la columna de la izquierda, selecciona Ejecutar.

    3.4. Seleccione la pestaña Opciones.

    3.5. Seleccione la casilla de verificación Obtención de fondo y haga clic en Cerrar.

Luego puede recibir notificaciones cuando la aplicación está en segundo plano o cerrada usando el siguiente código:

import UIKit import HealthKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? let healthKitStore:HKHealthStore = HKHealthStore() func startObservingHeightChanges() { let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight) var query: HKObserverQuery = HKObserverQuery(sampleType: sampleType, predicate: nil, updateHandler: self.heightChangedHandler) healthKitStore.executeQuery(query) healthKitStore.enableBackgroundDeliveryForType(sampleType, 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)") } } }) } func heightChangedHandler(query: HKObserverQuery!, completionHandler: HKObserverQueryCompletionHandler!, error: NSError!) { // Here you need to call a function to query the height change // Send the notification to the user var notification = UILocalNotification() notification.alertBody = "Changed height in Health App" notification.alertAction = "open" notification.soundName = UILocalNotificationDefaultSoundName UIApplication.sharedApplication().scheduleLocalNotification(notification) completionHandler() } func authorizeHealthKit(completion: ((success:Bool, error:NSError!) -> Void)!) { // 1. Set the types you want to read from HK Store let healthKitTypesToRead = [ HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierDateOfBirth), HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBloodType), HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBiologicalSex), HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass), HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight), HKObjectType.workoutType() ] // 2. Set the types you want to write to HK Store let healthKitTypesToWrite = [ HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex), HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned), HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning), HKQuantityType.workoutType() ] // 3. If the store is not available (for instance, iPad) return an error and don''t go on. if !HKHealthStore.isHealthDataAvailable() { let error = NSError(domain: "any.domain.com", code: 2, userInfo: [NSLocalizedDescriptionKey:"HealthKit is not available in this Device"]) if( completion != nil ) { completion(success:false, error:error) } return; } // 4. Request HealthKit authorization healthKitStore.requestAuthorizationToShareTypes(Set(healthKitTypesToWrite), readTypes: Set(healthKitTypesToRead)) { (success, error) -> Void in if( completion != nil ) { dispatch_async(dispatch_get_main_queue(), self.startObservingHeightChanges) completion(success:success,error:error) } } } func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert | .Badge | .Sound, categories: nil)) self.authorizeHealthKit { (authorized, error) -> Void in if authorized { println("HealthKit authorization received.") } else { println("HealthKit authorization denied!") if error != nil { println("/(error)") } } } return true } //Rest of the defaults methods of AppDelegate.swift }

En el método anterior, HKObserver se activa si el usuario concede la autorización de HealthKit y luego activa las notificaciones.

Espero que esto te ayude.


Después de un día completo de pruebas (iOS 9.2), puedo confirmar que la entrega en segundo plano de HealthKit FUNCIONA en todos los siguientes estados de aplicación:

  • fondo (en segundo plano y código de ejecución),
  • suspendido (en el fondo pero no en el código de ejecución),
  • terminado (eliminado por la fuerza por el usuario o purgado por el sistema).

Tenga en cuenta : parte 1

Algunos tipos de datos de HealthKit tienen una frecuencia de actualización mínima de HKUpdateFrequencyHourly . Dicho esto, incluso si configura una entrega en segundo plano con la frecuencia HKUpdateFrequencyImmediate , no obtendrá actualizaciones con más frecuencia que cada hora más o menos.

Desafortunadamente, no hay información en la documentación sobre las frecuencias mínimas por tipo de datos, pero mi experiencia con los Fitness types fue la siguiente:

  • Energía activa: por hora ,
  • Distancia de ciclismo: inmediata ,
  • Vuelos escalados: inmediato ,
  • NikeFuel: inmediato ,
  • Pasos: por hora ,
  • Distancia para caminar + correr: por hora ,
  • Entrenamientos: inmediato .

Nota : immediate NO significa en tiempo real sino más bien "algún tiempo poco después" de que los ejemplos de datos de actividad se hayan escrito en la HealthKit datos / tienda de HealthKit .

Tenga en cuenta : parte 2

Si el dispositivo está bloqueado con una contraseña, no se llamará a ninguno de los observadores de entrega en segundo plano. Esto es intencional debido a los problemas de privacidad (lea más: https://developer.apple.com/library/ios/documentation/HealthKit/Reference/HealthKit_Framework/ ).

Dicho esto, tan pronto como el usuario desbloquea el dispositivo, se HealthKit los observadores de entrega en segundo HealthKit su HealthKit (si ha pasado el tiempo de frecuencia mínimo, por supuesto).

Código de muestra :

Echa un vistazo a la respuesta de Viktor Sigler. Sin embargo, puede omitir los tres pasos desde el comienzo de su respuesta, ya que no son necesarios ni necesarios para que la entrega en segundo plano de HealthKit funcione.