如何检测是否从设备设置了HealthKit数据?

时间:2018-10-16 16:13:17

标签: ios swift health-kit

我正在尝试从HealthKit提取用户步骤,并且意识到用户可以手动添加不想提取的步骤。 (例如,如果他们一天作弊并设置5万步)。

因此,我在考虑如何解决此问题的解决方案,结果发现,如果数据是由设备设置的,也许我可以过滤所有结果并提取数据。我的意思是它可以由iPhone设置,但也可以由Apple Watch设置。

这是用户在“健康”应用程序中手动添加自己的步骤时的外观:

Steps added by an user

这是设备添加步骤时的外观:

Steps added by a watch

因此,当数据是由设备设置的时,我们可以在Health-app中看到来自设备的更多信息,而不是手动设置数据的用户。

问题是:如何查找结果中是否有设备?

我当前要获取结果的代码:

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 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:0)

let predicateAvoidManuallyLoggedData = HKQuery.predicateForObjects(withMetadataKey: HKMetadataKeyWasUserEntered, operatorType: .notEqualTo, value: true)

对HKSample或Statistics查询使用上述谓词。

您还可以组合这样的谓词

  let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: 
  [predicateSource, predicateTimePeriod, predicateAvoidManuallyLoggedData])