¿Cómo forzar a un HKQuery a cargar los pasos más recientes?

Actualmente estoy tratando de usar HKStatisticsQuery para contar los 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. Health.app , lo Health.app funcionando en segundo plano y Health.app la prueba nuevamente en mi aplicación;
  2. Abrí la UP app , la mantuve funcionando en segundo plano y volví a hacer la prueba en mi aplicación.

Y si Health.app salir de la UP app Health.app o UP app , mi aplicación no podrá volver a obtener los datos más recientes. Así que 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 directo como el siguiente. 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 traté de 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. sacudir el teléfono; 3. ejecuta HKQuery nuevamente. Ejecutar el código anterior por 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 traté de 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") } 

Por casi ninguna razón, pero intente “activar” en secreto algún tipo de actualización de fondo. Pero ninguno de estos bashs 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 una HKObserverQuery o HKStatisticsCollectionQuery abierta, HealthKit transmitirá los valores al cliente, pero de lo contrario las muestras son solo una instantánea de la última importación.

Por lo tanto, si desea observar los cambios para un tipo de muestra, debe suscribirse a las actualizaciones usando una HKObserverQuery y luego consultar nuevamente HealthKit 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á cuando cambien las estadísticas para las muestras que coinciden con los predicados.

Finalmente, si solo está interesado en recuentos de pasos actualizados o distancias recorridas durante la mayoría de los últimos 7 días, le recomiendo que considere utilizar CoreMotion.framework directamente.

    Intereting Posts