我理解为什么,但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
}
}];
}
答案 0 :(得分:1)
我在这里找到了2个问题,
这很好......
- (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
}
}];
}