这个HealthKit错误的原因是什么:“在训练中添加样本时发生了错误”?

时间:2015-03-16 01:04:21

标签: objective-c ios8 health-kit

我理解为什么,但HealthKit提出的错误含糊不清是一个完整的黑盒子。为什么我收到错误:

  

将样本添加到锻炼时发生错误:操作无法完成。

我一直在搜索网络上的例子,但其中大多数都是迅速的。 :(

这是我的代码:

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

   }];
}

1 个答案:

答案 0 :(得分:1)

我在这里找到了2个问题,

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

    - (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
                                               }
    
                                           }];
    }