Я работаю над трекером активности для часовых ОС.Я хотел бы иметь возможность читать данные о частоте сердечных сокращений с помощью Healthkit.Приложение написано на Objective C, и для этой конкретной задачи существует не так много примеров кода.
Из прочтения документации Apple и просмотра видео WWDC 2018 года «Новые способы работы с тренировками» я сформулировал то, что, по моему мнению, должно работать в Objective C. Все, кажется, работает нормально, пока я не дохожу до сути.где я вызываю строитель, чтобы начатьCollectionWithStartDate.Обработчик завершения возвращает ошибку: Ошибка Domain = com.apple.healthkit Code = 4 «Не авторизован» UserInfo = {NSLocalizedDescription = Не авторизован}
Это меня удивляет, потому что я вижу это на iOSУстройство под Настройки> Конфиденциальность> Здоровье> myAppName разрешения выглядят ОК.Процесс авторизации, при котором приложение Watch вызывает на устройстве iOS запрос на подтверждение запрошенного доступа к Healthstore, запускается, как описано в документации Apple и как показано в вышеупомянутом видео.
Я пробовал это на симуляторе ина настоящие часы с сопряженным телефоном.
Может кто-нибудь помочь, пожалуйста?Я вытаскиваю свои волосы этим!
Вот соответствующий код Objective C, который я написал, чтобы добраться до этой точки (возможно, я что-то упустил?).
На расширении часов:
Запрос на авторизацию (обрабатывается приложением iOS)
// awakeWithContext
if (!appHasStarted) {
healthStore = [HKHealthStore new];
[healthStore requestAuthorizationToShareTypes:[self dataTypesToShare] readTypes:[self dataTypesToRead] completion:^(BOOL success, NSError * _Nullable error) {
if (error) {
NSLog(@"Error:requestAuthorizationToShareTypes: %@",[error localizedDescription]);
}
}];
}
- (IBAction)watchStartButtonPressed {
NSLog(@"Pressed start button on watch");
if (watchStartButtonState == startbuttonstatestart) {
dateWhenPressedStart = [NSDate date];
configuration = [[HKWorkoutConfiguration alloc] init];
[configuration setActivityType:HKWorkoutActivityTypeCycling];
NSError *error;
workoutSession = [[HKWorkoutSession alloc] initWithHealthStore:healthStore configuration:configuration error:&error];
if (error) {
NSLog(@"Error:unable to establish a workout session: %@",[error localizedDescription]);
return;
}
workoutSession.delegate = self;
builder = workoutSession.associatedWorkoutBuilder;
builder.delegate = self;
HKLiveWorkoutDataSource* dataSource = [[HKLiveWorkoutDataSource alloc] initWithHealthStore:healthStore workoutConfiguration:configuration];
builder.dataSource = dataSource;
[workoutSession startActivityWithDate:dateWhenPressedStart];
[builder beginCollectionWithStartDate:dateWhenPressedStart completion:^(BOOL success, NSError * _Nullable error) {
if (error) {
NSLog(@"Error:beginCollectionWithStartDate: %@",[error localizedDescription]);
}
}];
//This is the point where I get the error message.
- (NSSet *) dataTypesToShare
{
HKQuantityType *heartRate = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
HKQuantityType *energy = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned];
HKQuantityType *distance = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceCycling];
return [NSSet setWithObjects:heartRate,energy,distance,nil];
}
- (NSSet *)dataTypesToRead
{
HKQuantityType *heartRate = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
HKQuantityType *energy = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned];
HKQuantityType *distance = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceCycling];
return [NSSet setWithObjects:heartRate,energy,distance,nil];
}