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:
-
Abro el
Health.app
, lo mantengo ejecutándose en segundo plano y hago la prueba nuevamente en mi aplicación; -
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.