Search code examples
ioscrashunrecognized-selectorhealthkit

Exception Using HealthKit


I'm using Xcode to create an app with HealthKit, but whenever I try to authorize HealthKit in the iOS Simulator, it crashes. My code is on the bottom. Does anyone know how to fix this?

func authorizeHealthKit(completion: ((success:Bool, error:NSError!) -> Void)!)
  {
// 1. Set the types you want to read from HK Store
let healthKitTypesToRead = Set(arrayLiteral:[
  HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierDateOfBirth),
  HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBloodType),
  HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBiologicalSex),
  HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass),
  HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight),
  HKObjectType.workoutType()
])

// 2. Set the types you want to write to HK Store
let healthKitTypesToWrite = Set(arrayLiteral:[
  HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex),
  HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned),
  HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning),
  HKQuantityType.workoutType()
])

// 3. If the store is not available (for instance, iPad) return an error and don't go on.
if !HKHealthStore.isHealthDataAvailable()
{
  let error = NSError(domain: "com.TestHKTutorial", code: 2, userInfo: [NSLocalizedDescriptionKey:"HealthKit is not available in this device"])
  if( completion != nil )
  {
    completion(success:false, error:error)
  }
  return;
}

// 4. Request HealthKit authorization
healthKitStore.requestAuthorizationToShareTypes(healthKitTypesToWrite, readTypes: healthKitTypesToRead) {
  (success, error) -> Void in

  if( completion != nil )
  {
    completion(success:success,error:error)
  }
}

}


Solution

  • Your healthKitTypesToRead and healthKitTypesToWrite sets contain arrays of HKObjectTypes, instead of just containing HKObjectTypes. Try this instead:

    let healthKitTypesToRead : Set = [
        HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierDateOfBirth)!,
        HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBloodType)!,
        HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBiologicalSex)!,
        HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)!,
        HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight)!,
        HKObjectType.workoutType()
    ]
    
    // 2. Set the types you want to write to HK Store
    let healthKitTypesToWrite : Set = [
        HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex)!,
        HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned)!,
        HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)!,
        HKQuantityType.workoutType()
    ]