What is the reason for this HealthKit error: "An error occurred while adding the sample to the workout"?

I understand why, but the ambiguity of the errors that HealthKit releases is a complete black box. Why am I getting the error message:

An error occurred while adding the sample to the training: the operation could not be completed.

I searched the web for examples, but most of them are quick .:(

Here is my code:

- (NSSet *)dataTypesToRead { HKQuantityType *heartRate = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; return [NSSet setWithObjects:heartRate, nil]; } - (NSSet *)dataTypesToWrite { HKWorkoutType* workout = [HKWorkoutType workoutType]; HKQuantityType *energyBurnedType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned]; return [NSSet setWithObjects:workout, energyBurnedType, nil]; } - (void)saveWorkout { HKHealthStore* healthStore = [[HKHealthStore alloc] init]; NSDate* timeOfWorkout = [NSDate date]; HKWorkoutType* type = [HKWorkoutType workoutType]; [healthStore requestAuthorizationToShareTypes:[self dataTypesToWrite] readTypes:[self dataTypesToRead] completion:^(BOOL success, NSError *error) { if(success == YES) { // This sample uses hard-coded values and performs all the operations inline // for simplicity sake. A real-world app would calculate these values // from sensor data and break the operation up using helper methods. HKQuantity *energyBurned = [HKQuantity quantityWithUnit:[HKUnit kilocalorieUnit] doubleValue:333.0]; HKQuantity *distance = [HKQuantity quantityWithUnit:[HKUnit mileUnit] doubleValue:0.0]; // Provide summary information when creating the workout. HKWorkout *workout = [HKWorkout workoutWithActivityType:HKWorkoutActivityTypeTraditionalStrengthTraining startDate:timeOfWorkout endDate:timeOfWorkout duration:0 totalEnergyBurned:energyBurned totalDistance:distance metadata:nil]; // Save the workout before adding detailed samples. [healthStore saveObject:workout withCompletion:^(BOOL success, NSError *error) { if (!success) { // Perform proper error handling here... NSLog(@"*** An error occurred while saving the " @"workout: %@ ***", error.localizedDescription); abort(); } }]; // Add optional, detailed information for each time interval NSMutableArray *samples = [NSMutableArray array]; HKQuantityType *energyBurnedType = [HKObjectType quantityTypeForIdentifier: HKQuantityTypeIdentifierActiveEnergyBurned]; [samples addObject:energyBurnedType]; // Add all the samples to the workout. [healthStore addSamples:samples toWorkout:workout completion:^(BOOL success, NSError *error) { if (!success) { // Perform proper error handling here... NSLog(@"*** An error occurred while adding a " @"sample to the workout: %@ ***", error.localizedDescription); abort(); } }]; } else { // Determine if it was an error or if the // user just canceld the authorization request } }]; } 
+1
source share
1 answer

Here I find 2 problems,

  • Your attempt to add samples to your workout before saving your workout to HealthKit.
  • An array of samples should contain objects of type HKQuantitySample or HKCategorySample.

This works great ...

 - (NSSet *)dataTypesToRead { HKQuantityType *heartRate = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; return [NSSet setWithObjects:heartRate, nil]; } - (NSSet *)dataTypesToWrite { HKWorkoutType* workout = [HKWorkoutType workoutType]; HKQuantityType *energyBurnedType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned]; return [NSSet setWithObjects:workout, energyBurnedType, nil]; } - (void)saveWorkout { HKHealthStore* healthStore = [[HKHealthStore alloc] init]; NSDate* timeOfWorkout = [NSDate date]; [healthStore requestAuthorizationToShareTypes:[self dataTypesToWrite] readTypes:[self dataTypesToRead] completion:^(BOOL success, NSError *error) { if(success == YES) { // This sample uses hard-coded values and performs all the operations inline // for simplicity sake. A real-world app would calculate these values // from sensor data and break the operation up using helper methods. HKQuantity *energyBurned = [HKQuantity quantityWithUnit:[HKUnit kilocalorieUnit] doubleValue:333.0]; HKQuantity *distance = [HKQuantity quantityWithUnit:[HKUnit mileUnit] doubleValue:0.0]; // Provide summary information when creating the workout. HKWorkout *workout = [HKWorkout workoutWithActivityType:HKWorkoutActivityTypeTraditionalStrengthTraining startDate:timeOfWorkout endDate:timeOfWorkout duration:0 totalEnergyBurned:energyBurned totalDistance:distance metadata:nil]; // Save the workout before adding detailed samples. [healthStore saveObject:workout withCompletion:^(BOOL success, NSError *error) { if (!success) { // Perform proper error handling here... NSLog(@"*** An error occurred while saving the " @"workout: %@ ***", error.localizedDescription); // abort(); } else { // Add optional, detailed information for each time interval NSMutableArray *samples = [NSMutableArray array]; HKQuantityType *energyBurnedType = [HKObjectType quantityTypeForIdentifier: HKQuantityTypeIdentifierActiveEnergyBurned]; HKQuantity *energyBurnedQuantity = [HKQuantity quantityWithUnit:[HKUnit kilocalorieUnit] doubleValue:334]; HKQuantitySample *energyBurnedSample = [HKQuantitySample quantitySampleWithType:energyBurnedType quantity:energyBurnedQuantity startDate:[NSDate date] endDate:[NSDate date]]; [samples addObject:energyBurnedSample]; // Add all the samples to the workout. [healthStore addSamples:samples toWorkout:workout completion:^(BOOL success, NSError *error) { if (!success) { // Perform proper error handling here... NSLog(@"*** An error occurred while adding a " @"sample to the workout: %@ ***", error.localizedDescription); // abort(); } }]; } }]; } else { // Determine if it was an error or if the // user just canceld the authorization request } }]; } 
+1
source

Source: https://habr.com/ru/post/983490/


All Articles