如何从具有HKDevice的保健工具包中查询样品

时间:2018-06-21 19:27:11

标签: ios swift health-kit hkhealthstore hksamplequery

我想从HealthKit查询样本,但是为了防止数据不正确或被操纵,我不希望其他应用程序将样本写入健康状态。有谁知道我可以使用哪些谓词过滤所有应用程序中的数据或仅允许设备中的数据?预先感谢。

编辑:我已经意识到,应用程序可以使用附带的HKDevice将数据保存到健康状态。因此,滤除没有设备的样本将不起作用。

3 个答案:

答案 0 :(得分:1)

如果您要排除手动输入的数据,请参见以下答案:Ignore manual entries from Apple Health app as Data Source

用户通过“健康”添加到HealthKit的样本将具有for($i = $fileCount - 1; $i > 30; $i--){ unlink($files['pathname']); } 键。

答案 1 :(得分:0)

我仍然愿意接受建议和替代解决方案,但这是我的解决方法,因为我无法弄清楚如何使用谓词来完成工作。

 let datePredicate = HKQuery.predicateForSamples(withStart:Date(), end: nil, options: [])

 let sampleQuery = HKAnchoredObjectQuery(type: sampleType,
                                               predicate: predicate,
                                               anchor: nil,
                                               limit: Int(HKObjectQueryNoLimit)) { query,
                                                                                   samples,
                                                                                   deletedObjects,
                                                                                   anchor,
                                                                                   error in
        if let error = error {
            print("Error performing sample query: \(error.localizedDescription)")
            return
        }

        guard let samples = samples as? [HKQuantitySample] else { return }

        // this line filters out all samples that do not have a device
        let samplesFromDevices = samples.filter { 
            $0.device != nil && $0.sourceRevision.source.bundleIdentifier.hasPrefix("com.apple.health") 
        }
        doStuffWithMySamples(samplesFromDevices)
    }

如您所见,我只是对数据进行过滤,而不是事先进行过滤。

编辑:似乎健康状况中列出的来源被分为应用程序和实际设备。不能100%地确定他们如何做到这一点,但是在device部分下的源似乎都带有以com.apple.health为前缀的捆绑标识符。希望这行得通。

答案 2 :(得分:0)

您可以过滤掉不是Apple在查询中存储的结果,而不是遍历所有结果。

首先,您需要获取所需类型的所有源。

let query = HKSourceQuery(sampleType: type,
                                  samplePredicate: predicate) {
                                    query, sources, error in
                                    
                                    // error handling ...
                                    
                                    // create a list of your desired sources
                                    let desiredSources = sources?.filter { 
                                          !$0.bundleIdentifier.starts(with: "com.apple.health")
                                     }
                                    
                                    // now use that list as a predicate for your query
                                    let sourcePredicate = HKQuery.predicateForObjects(from: desiredSources!)

                                    // use this predicate to query for data

        }
        

您还可以使用NSCompoundPredicate

组合其他谓词