菜鸟教程小白 发表于 2022-12-11 20:04:47

ios - 如何从 HealthKit 中获取与 Health App 的值相同的静息能量值?


                                            <p><p>我正在使用苹果的 <a href="https://developer.apple.com/library/content/samplecode/Fit/Introduction/Intro.html#//apple_ref/doc/uid/TP40014583-Intro-DontLinkElementID_2" rel="noreferrer noopener nofollow">HealthKit sample</a>但是,iPhone 中 <strong>Health app</strong> 中显示的 <strong>resting energy</strong> 值与示例应用中获取的值不匹配。 </p>

<p>根据苹果文档,<strong>HKQuantityTypeIdentifierBasalEnergyBurned</strong> 代表 <strong>resting energy</strong> 所以我从 HealthKit 中获取了这个值,但我收到的值与 <strong>resting 不匹配<strong>健康应用</strong>中显示的能量</strong>。</p>

<p>于是我偶然发现了苹果的<a href="https://developer.apple.com/library/content/samplecode/Fit/Introduction/Intro.html#//apple_ref/doc/uid/TP40014583-Intro-DontLinkElementID_2" rel="noreferrer noopener nofollow">HealthKit sample</a>他们根据公式计算静息能量:</p>

<pre><code>// Calculates the user&#39;s total basal (resting) energy burn based off of their height, weight, age,
    // and biological sex. If there is not enough information, return an error.
    private func fetchTotalBasalBurn(completion: @escaping (HKQuantity?, Error?) -&gt; Void)
    {
      let todayPredicate: NSPredicate = self.predicateForSamplesToday()

      let weightType = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.bodyMass)!
      let heightType = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.height)!

      let queryWeigth: HKCompletionHandle = {
            (weight, error) -&gt; Void in

            guard let weight = weight else {
                completion(nil, error)

                return
            }

            let queryHeigth: HKCompletionHandle = {
                (height, error) -&gt; Void in

                if height == nil {
                  completion(nil, error)

                  return;
                }

                var dateOfBirth: Date!

                do {

                  dateOfBirth = try self.healthStore!.dateOfBirth()

                } catch {

                  completion(nil, error)

                  return
                }

                var biologicalSexObjet: HKBiologicalSexObject!

                do {

                  biologicalSexObjet = try self.healthStore!.biologicalSex()

                } catch {

                  completion(nil, error)

                  return
                }

                // Once we have pulled all of the information without errors, calculate the user&#39;s total basal energy burn
                let basalEnergyButn: HKQuantity? = self.calculateBasalBurnTodayFromWeight(weight, height: height, dateOfBirth: dateOfBirth!, biologicalSex: biologicalSexObjet)

                completion(basalEnergyButn, nil)
            }

            if let healthStore = self.healthStore {

                healthStore.mostRecentQuantitySample(ofType: heightType, predicate: todayPredicate, completion: queryHeigth)
            }
      }

      if let healthStore = self.healthStore {
            healthStore.mostRecentQuantitySample(ofType: weightType, predicate: nil, completion: queryWeigth)
      }
    }

    private func calculateBasalBurnTodayFromWeight(_ weight: HKQuantity?, height: HKQuantity?, dateOfBirth: Date, biologicalSex: HKBiologicalSexObject) -&gt; HKQuantity?
    {
      // Only calculate Basal Metabolic Rate (BMR) if we have enough information about the user
      guard let weight = weight, let height = height else {

            return nil
      }

      // Note the difference between calling +unitFromString: vs creating a unit from a string with
      // a given prefix. Both of these are equally valid, however one may be more convenient for a given
      // use case.
      let heightInCentimeters: Double = height.doubleValue(for: HKUnit(from:&#34;cm&#34;))
      let weightInKilograms: Double = weight.doubleValue(for: HKUnit.gramUnit(with: HKMetricPrefix.kilo))

      let nowDate = Date()
      let ageComponents: DateComponents = Calendar.current.dateComponents(, from: dateOfBirth, to: nowDate)
      let ageInYears: Int = ageComponents.year!

      // BMR is calculated in kilocalories per day.
      let BMR: Double = self.calculateBMRFromWeight(weightInKilograms: weightInKilograms, height: heightInCentimeters, age: ageInYears, biologicalSex: biologicalSex.biologicalSex)

      // Figure out how much of today has completed so we know how many kilocalories the user has burned.
      let (startOfToday, endOfToday): (Date, Date) = self.datesFromToday()

      let secondsInDay: TimeInterval = endOfToday.timeIntervalSince(startOfToday)
      let percentOfDayComplete: Double = nowDate.timeIntervalSince(startOfToday) / secondsInDay

      let kilocaloriesBurned: Double = BMR * percentOfDayComplete

      let basalBurn = HKQuantity(unit: HKUnit.kilocalorie(), doubleValue: kilocaloriesBurned)

      return basalBurn
    }

/// Returns BMR value in kilocalories per day. Note that there are different ways of calculating the
    /// BMR. In this example we chose an arbitrary function to calculate BMR based on weight, height, age,
    /// and biological sex.
    private func calculateBMRFromWeight(weightInKilograms: Double, height heightInCentimeters: Double, age ageInYears: Int, biologicalSex: HKBiologicalSex) -&gt; Double
    {
      var BMR: Double = 0

      if biologicalSex == .male {
            BMR = 66.0 + (13.8 * weightInKilograms) + (5.0 * heightInCentimeters) - (6.8 * Double(ageInYears))

            return BMR
      }

      BMR = 655 + (9.6 * weightInKilograms) + (1.8 * heightInCentimeters) - (4.7 * Double(ageInYears))

      return BMR
    }
</code></pre>

<p>我尝试使用示例应用获取<strong>静息能量</strong>,但健康应用中显示的静息能量值与示例应用的值不同。</p>

<p>谁能告诉我如何获取静息能量或<strong>Health App</strong>使用什么计算来找到<strong>静息能量</strong>?</p>

<p>如果有人可以给我一些指示,那就太好了,我对 HealthKit 还是很陌生。</p>

<p>谢谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>Apple 的示例似乎已过时。从 iOS 8 和 watchOS 2 开始,可以调用检索此信息的方式与检索事件卡路里的方式相同;只需更改标识符。 <a href="https://developer.apple.com/documentation/healthkit/hkquantitytypeidentifier/1615512-basalenergyburned" rel="noreferrer noopener nofollow">Apple Documentation</a> </p>

<pre><code>HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.basalEnergyBurned)
</code></pre>

<p>不要忘记包含读取此数据的额外权限。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何从 HealthKit 中获取与 Health App 的值相同的静息能量值?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/50003294/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/50003294/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何从 HealthKit 中获取与 Health App 的值相同的静息能量值?