Healthkit 多个 HKAnchoredObjectQuery 未返回所有样本类型的数据

Healthkit multiple HKAnchoredObjectQuery not returning data for all sample types

我正在使用 HKAnchoredObjectQuery 和 updateHandler 来获取多种类型的 healthkit 示例数据,但它 returns 数据仅适用于“HKQuantityTypeIdentifierStepCount”,不适用于其他 HKSampleType。下面是我正在使用的代码。任何帮助将不胜感激。

func readHealthKitData(type: HKSampleType) {  
    
        let onAnchorQueryResults : ((HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, NSError?) -> Void)! = {
            (query:HKAnchoredObjectQuery, addedObjects:[HKSample]?, deletedObjects:[HKDeletedObject]?, newAnchor:HKQueryAnchor?, nsError:NSError?) -> Void in
            
            if (addedObjects?.count > 0)
            {
                
                // var addDict = [String : AnyObject]()
                for obj in addedObjects! {
                    let hkValue = obj as? HKQuantitySample
                    if(hkValue?.UUID.UUIDString != nil){
                        print("TypeName:",type.isEqual("HKQuantityTypeIdentifierHeartRate"))
                        switch  type {
                        case  HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)!:
                            let val =  (hkValue?.quantity.doubleValueForUnit(HKUnit(fromString: "count/min")))!
                            let uuid : String = (hkValue?.UUID.UUIDString)!
                                                  
                        case HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)!:
                            let val =  (hkValue?.quantity.doubleValueForUnit(HKUnit.countUnit()))!
                            let uuid : String = (hkValue?.UUID.UUIDString)!
                           
                            
                        case HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)!:
                            let val =  ((hkValue?.quantity.doubleValueForUnit(HKUnit.gramUnit()))!/1000.0)
                            let uuid : String = (hkValue?.UUID.UUIDString)!

                        default:
                            break
                            
                        }
                        
                    }
                }
                
            }
            
        }
        
        let queryEndDate = NSDate()
        print("Before Start: ")
        print(self.queryStartDate)
        let predicate: NSPredicate = HKAnchoredObjectQuery.predicateForSamplesWithStartDate(self.queryStartDate, endDate: queryEndDate, options: HKQueryOptions.None)
        
        let anchoredQuery = HKAnchoredObjectQuery(type: type, predicate: predicate, anchor: hkAnchor, limit: 0, resultsHandler: onAnchorQueryResults)
        anchoredQuery.updateHandler = onAnchorQueryResults
        healthStore.executeQuery(anchoredQuery)
        self.queryStartDate = queryEndDate
        
        
    }}

这是意料之中的。查询的初始化程序仅采用类型参数 returns 该类型的结果。您不能通过单个查询查询多种类型的样本。

您可以使用适用于 iOS 15.0 及更高版本的初始化程序。

init(queryDescriptors: [HKQueryDescriptor], 
anchor: HKQueryAnchor?, 
limit: Int, 
resultsHandler handler: @escaping (HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, Error?) -> Void)