1

I understand why, but the ambiguity of the errors that HealthKit puts out is a total black box. Why am I getting the error:

An error occurred while adding a sample to the workout: The operation couldn’t be completed.

I've been scouring the web for examples, but most of them are in swift. :(

Here's 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's 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
       }

   }];
}
4

1 回答 1

1

在这里我发现2个问题,

  1. 您尝试在 HealthKit 中保存锻炼之前将样本添加到锻炼中。
  2. Samples数组应包含 HKQuantitySample 或 HKCategorySample 类型的对象。

这工作正常...

- (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's 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
                                           }

                                       }];
}
于 2015-03-24T13:24:22.557 回答