我正在尝试从HealthKit提取用户步骤,并且意识到用户可以手动添加不想提取的步骤。 (例如,如果他们一天作弊并设置5万步)。
因此,我在考虑如何解决此问题的解决方案,结果发现,如果数据是由设备设置的,也许我可以过滤所有结果并提取数据。我的意思是它可以由iPhone设置,但也可以由Apple 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)
}
答案 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])