ios objective-c health-kit

ios - ¿Cómo forzar a HKQuery a cargar los recuentos de pasos más recientes?



objective-c health-kit (1)

Actualmente estoy tratando de usar HKStatisticsQuery para obtener el recuento de pasos entre un cierto intervalo de tiempo. Estoy haciendo una prueba shaking el teléfono yo mismo. Sin embargo, parece que el resultado que obtengo no es el más reciente, a menos que:

  1. Abro el Health.app , lo mantengo ejecutándose en segundo plano y hago la prueba nuevamente en mi aplicación;
  2. Abro la UP app , la mantengo ejecutándose en segundo plano y hago la prueba nuevamente en mi aplicación.

Y si Health.app UP app Health.app o UP app , mi aplicación no podrá volver a obtener los datos más recientes. Entonces UP debe estar haciendo algo que me falta, pero no puedo encontrar ningún método de "recarga" en HKHealthStore , ni ninguna opción relacionada en HKQuery/HKStatisticsQuery .

El código que estoy usando es bastante sencillo como se muestra a continuación. Me pregunto si hay algún permiso o algo que me falta.

let predicate = HKQuery.predicateForSamplesWithStartDate(date_start, endDate: NSDate(), options: HKQueryOptions.StrictStartDate) var type = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning) var query = HKStatisticsQuery(quantityType: type, quantitySamplePredicate: predicate, options: .CumulativeSum | .SeparateBySource, completionHandler: { query, stats, error in ( /*logs here*/ ) }) let healthStore = HKHealthStore() healthStore.executeQuery(query)

Editar: también intenté escribir algunos datos en HealthKit pero la consulta no se actualiza.

Edit2: cuando dije "los pasos más recientes cuentan" quise decir algo como: 1. ejecutar HKQuery; 2. agitar el teléfono; 3. ejecute HKQuery nuevamente. Ejecutando el código anterior 2 veces y siempre obtengo los mismos resultados, pero si dejé Health.app o la aplicación UP en segundo plano, la última consulta obtuvo los resultados actualizados.

También intenté llamar a otras API como:

healthStore.enableBackgroundDeliveryForType(type, frequency:.Immediate, withCompletion:{ (success:Bool, error:NSError!) -> Void in let authorized = healthStore.authorizationStatusForType(type) LF.log("HEALTH callback success", success) LF.log("HEALTH callback authorized", type) }) if HKHealthStore.isHealthDataAvailable() == false { LF.log("HEALTH data not available") return } else { LF.log("HEALTH OK") }

Casi sin razón, pero intenta secretamente "activar" algún tipo de actualización de fondo. Pero ninguno de estos intentos funcionó.


HealthKit no siempre tiene un recuento actualizado de los pasos del usuario y la distancia recorrida. Importa estos valores, que en realidad provienen de CoreMotion.framework, periódicamente y en respuesta a ciertos eventos. Si una aplicación en ejecución tiene un HKObserverQuery o HKStatisticsCollectionQuery abierto, HealthKit transmitirá los valores al cliente, pero de lo contrario, las muestras son solo una instantánea de la última importación.

Entonces, si desea observar los cambios para un tipo de muestra, debe suscribirse a las actualizaciones utilizando un HKObserverQuery y luego consultar HealthKit nuevamente para obtener los últimos valores. HKStatisticsCollectionQuery embargo, un enfoque más eficiente sería usar HKStatisticsCollectionQuery , que tiene un controlador de actualización que se invocará a medida que cambien las estadísticas de las muestras que coinciden con los predicados.

Finalmente, si solo le interesan los recuentos de pasos actualizados o la distancia recorrida durante los últimos 7 días como máximo, le recomiendo que considere usar CoreMotion.framework directamente en su lugar.