Ошибка авторизации, когда запрос связанного компоновщика начинает сбор - PullRequest
0 голосов
/ 26 апреля 2019

Я работаю над трекером активности для часовых ОС.Я хотел бы иметь возможность читать данные о частоте сердечных сокращений с помощью 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...