Active Filters: HealthKit


#42: HealthKit Basics 🏥


Let's use HealthKit to retrieve the user's current weight. HealthKit requires itemized authorization for each bit of data we want to read or write. Here we ask to write nothing, and read weight only.

import HealthKit

guard HKHealthStore.isHealthDataAvailable() else { return }

let store = HKHealthStore()

let weightQuantity = HKQuantityType.quantityTypeForIdentifier(

  readTypes: [weightQuantity]
) { succeeded, error in
  guard succeeded && error == nil else { return; }

  // success!

Then the fun part: We execute a sample query, grabbing the latest weight result. Then we format the weight using NSMassFormatter.

let sortDescriptor = NSSortDescriptor(
  key: HKSampleSortIdentifierEndDate,
  ascending: false

let query = HKSampleQuery(
  sampleType: weightQuantity, 
  predicate: nil, 
  limit: 1, 
  sortDescriptors: [sortDescriptor]
) { query, results, sample in
  guard let results = results where results.count > 0 else { return }

  let sample = results[0] as! HKQuantitySample
  let weightInPounds = sample.quantity.doubleValueForUnit(HKUnit.poundUnit())

  let suffix = NSMassFormatter().unitStringFromValue(
    unit: .Pound

  let formattedWeight = NSNumberFormatter.localizedStringFromNumber(
    NSNumber(double: weightInPounds),
    numberStyle: .NoStyle

  print("User currently weighs: \(formattedWeight) \(suffix)")