Как определить, установлены ли данные 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])
Другие вопросы по тегам