Estoy tratando de obtener los pasos del usuario de HealthKit y me di cuenta de que los usuarios pueden agregar pasos manualmente que no quiero recuperar. (Por ejemplo, si hacen trampa y establecen 50 mil pasos en un día).

Así que estaba pensando en una solución sobre cómo resolver este problema y descubrí que tal vez podría simplemente filtrar todos los resultados y obtener los datos si los datos fueron establecidos por un dispositivo. Quiero decir que podría configurarse con un iPhone, pero también se puede configurar con un Apple Watch.

Así es como se ve cuando un usuario agrega sus propios pasos manualmente en la aplicación Salud:

Steps added by an user

Así es como se ve cuando un dispositivo agrega los pasos:

Steps added by a watch

Entonces, cuando los datos son configurados por un dispositivo, podemos ver más información del dispositivo en la aplicación Salud en lugar de un usuario que configura los datos manualmente.

La pregunta es: ¿cómo puedo saber si hay un dispositivo en el resultado?

Mi código actual para obtener los resultados:

func getSteps(completion: @escaping (Double, Error?) -> ()) {
    let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!

    let query = HKSampleQuery(sampleType: stepsQuantityType, predicate: nil, limit: 0, sortDescriptors: nil){ query, results, error in
        if let error = error {
            // Handle error
        } else if let results = results, !results.isEmpty {
            for result in results {
                // Detect and add result if result is from a device
            }
        }
    }

    HKHealthStore().execute(query)
}
2
Jacob Ahlberg 16 oct. 2018 a las 19:13

2 respuestas

La mejor respuesta

Me acabo de dar cuenta de que puedo detectar si existe un dispositivo mediante result.device donde device es un valor opcional. Al hacerlo, puedo verificar si el valor es nil o no.

func getSteps(completion: @escaping (Double, Error?) -> ()) {
    let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!


    let query = HKSampleQuery(sampleType: stepsQuantityType, predicate: nil, limit: 0, sortDescriptors: nil){ query, results, error in
        if let error = error {
            // Handle error
        } else if let results = results, !results.isEmpty {
            for result in results {
                if result.device != nil {
                    // Result is from a device
                } else {
                    // Not a device
                }
            }
        }
    }

    HKHealthStore().execute(query)
}
1
Jacob Ahlberg 16 oct. 2018 a las 16:13
let predicateAvoidManuallyLoggedData = HKQuery.predicateForObjects(withMetadataKey: HKMetadataKeyWasUserEntered, operatorType: .notEqualTo, value: true)

Utilice el predicado anterior con consultas HKSample o Statistics.

También puede combinar predicados como este

  let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: 
  [predicateSource, predicateTimePeriod, predicateAvoidManuallyLoggedData])
0
noobiont 1 abr. 2020 a las 14:24