Swift - 从 Apple HealthKit 获取葡萄糖数据

Ali*_*aly 3 ios swift healthkit

我正在做一些关于如何向 Apple HealthKit 应用程序发送数据和从 Apple HealthKit 应用程序接收数据的教程。

我正在做的教程的一部分是如何从 healthKitStore 获取高度。

我想做同样的事情,但要检索葡萄糖数据而不是高度,我完成了所有步骤,但卡在了这段代码中:

var heightLocalizedString = self.kUnknownString;
        self.height = mostRecentHeight as? HKQuantitySample;
        // 3. Format the height to display it on the screen
        if let meters = self.height?.quantity.doubleValueForUnit(HKUnit.meterUnit()) {
            let heightFormatter = NSLengthFormatter()
            heightFormatter.forPersonHeightUse = true;
            heightLocalizedString = heightFormatter.stringFromMeters(meters);
        }
Run Code Online (Sandbox Code Playgroud)

如图所示,meters var 被分配了一个来自meterUnit 的double 值,然后创建了一个常量格式化程序来格式化meters var 并将其分配给预先声明的var (heightLocalizedString)

我的问题是,当我使用这种方法进行葡萄糖读数时,我面临几个问题,第一个问题是我无法弄清楚可用的葡萄糖单位是什么,我唯一得到的是

HKUnitMolarMassBloodGlucose
Run Code Online (Sandbox Code Playgroud)

当我使用它时,出现错误提示“'NSNumber' 不是 'HKUnit' 的子类型”,从错误中可以清楚地看出该参数不是HKUnit该类的子类型。

另一个问题是,如前面的代码所示, height 有一个格式化程序(NSLengthFormatter()),但我看不到 Glucose 的格式化程序。

实际上,我不确定是否必须完全按照教程来获取葡萄糖数据,但我也没有看到其他方法可以这样做。

请问有什么想法吗?

这是我用来检索葡萄糖数据的代码:

func updateGluco(){

    let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBloodGlucose)
    self.healthManager?.readMostRecentSample(sampleType, completion: {(mostRecentGluco, error) -> Void in

        if (error != nil){
            println("Error reading blood glucose from HealthKit store: \(error.localizedDescription)")
            return;
        }

        var glucoLocalizedString = self.kUnknownString;
        self.gluco = mostRecentGluco as? HKQuantitySample
        println("\(self.gluco?.quantity.doubleValueForUnit(HKUnit.moleUnitWithMolarMass(HKUnitMolarMassBloodGlucose)))")
        self.gluco?.quantity.doubleValueForUnit(HKUnit.moleUnitWithMolarMass(HKUnitMolarMassBloodGlucose))
        if let mmol = self.gluco?.quantity.doubleValueForUnit(HKUnit.moleUnitWithMolarMass(HKUnitMolarMassBloodGlucose)) {
            glucoLocalizedString = "\(mmol)"
        } else {
            println("error reading gluco data!")
        }
        dispatch_async(dispatch_get_main_queue(), {() -> Void in
        self.glucoLabel.text = glucoLocalizedString})
    })
}
Run Code Online (Sandbox Code Playgroud)

“mmol”变量返回一个 nil 值。

我不知道这是否与我的问题有关,但我刚刚阅读了一篇文章,说苹果在 iOS 8.2 中带回了血糖跟踪,我的应用程序部署目标是 8.1。(尽管 XCode 已更新到最新版本,但我无法将部署目标升级到最新的 iOS!)

jru*_*ing 5

查看标题,血糖需要单位类型(质量/体积),这意味着您需要指定一个复合单位,其中质量单位除以体积单位:

HK_EXTERN NSString * const HKQuantityTypeIdentifierBloodGlucose NS_AVAILABLE_IOS(8_0);              // Mass/Volume,                 Discrete
Run Code Online (Sandbox Code Playgroud)

通常,人们测量血糖的单位是 mg/dL 和 mmol/L。您可以使用以下方法构建这些:

HKUnit *mgPerdL = [HKUnit unitFromString:@"mg/dL"];

HKUnit *mmolPerL = [[HKUnit moleUnitWithMetricPrefix:HKMetricPrefixMilli molarMass:HKUnitMolarMassBloodGlucose] unitDividedByUnit:[HKUnit literUnit]];
Run Code Online (Sandbox Code Playgroud)

注意 doubleValueForUnit: 需要一个 HKUnit,而不是一个 NSNumber。查看更多信息