Как определить, установлены ли данные HealthKit с устройства?
Я пытаюсь получить шаги пользователя из HealthKit и понял, что пользователи могут добавлять шаги вручную, которые я не хочу получать. (Например, если они обманывают и устанавливают 50k шагов в один день).
Поэтому я подумал над решением, как решить эту проблему, и обнаружил, что, возможно, я мог бы просто отфильтровать весь результат и извлечь данные, если данные были установлены устройством. Я имею в виду, что он может быть установлен на iPhone, но он также может быть установлен на Apple Watch.
Вот как это выглядит, когда пользователь добавляет свои шаги вручную в приложение Health:
Вот как это выглядит, когда шаги добавляются устройством:
Поэтому, когда данные устанавливаются устройством, мы можем видеть больше информации с устройства в приложении Health, а не о пользователе, который устанавливает данные вручную.
Вопрос в том, как мне найти устройство в результате?
Мой текущий код для получения результатов:
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)
}
1 ответ
Я только что понял, что могу определить, существует ли устройство по result.device
где device
это необязательное значение. Таким образом, я могу проверить, является ли значение nil
или нет.
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)
}
let predicateAvoidManuallyLoggedData = HKQuery.predicateForObjects(withMetadataKey: HKMetadataKeyWasUserEntered, operatorType: .notEqualTo, value: true)
используйте вышеуказанный предикат с запросами HKSample или Statistics.
вы также можете комбинировать такие предикаты
let predicate = NSCompoundPredicate(andPredicateWithSubpredicates:
[predicateSource, predicateTimePeriod, predicateAvoidManuallyLoggedData])