Подтвердить что ты не робот

Данные о сердечном ритме на яблоне

Можем ли мы получить доступ к частоте сердечных сокращений непосредственно из часов яблока? Я знаю, что это дублированный вопрос, но никто не спрашивал об этом, как через 5 месяцев. Я знаю, что вы можете получить к нему доступ из приложения "Здоровье", но я не уверен, как это будет "в реальном времени".

4b9b3361

Ответ 1

Нет прямого способа доступа к датчикам на Apple Watch. Вам придется полагаться на доступ из HealthKit.

Евангелист из Apple сказал это

В настоящее время невозможно создать приложение для мониторинга сердца. данные не гарантируются для отправки на iPhone в режиме реального времени, поэтому вы не будете быть в состоянии определить, что происходит в любой момент.

См. https://devforums.apple.com/message/1098855#1098855

Ответ 2

Информация о сырой информации о сердечном ритме теперь доступна в Watchkit for watchOS 2.0.

WatchOS 2 включает в себя множество улучшений для других существующих фреймворков, таких как HealthKit, что позволяет получать доступ к датчикам работоспособности, которые обеспечивают доступ к частоте сердечных сокращений и медицинской информации в режиме реального времени.

Вы можете проверить эту информацию в следующем сеансе, который является общей 30-минутной презентацией. Если вы не хотите смотреть весь сеанс, то вы сразу переходите к Healthkit API функциям, находящимся между 25-28 минутами:

WatchKit для сессии watchOS 2.0 в WWDC 2015

Вот ссылка на исходный код ссылка

Как указано в Справочник класса HKWorkout:

Класс HKWorkout - это конкретный подкласс класса HKSample. HealthKit использует тренировки для отслеживания широкого спектра действий. объект тренировки не только хранит сводную информацию о деятельности (например, продолжительность, общее расстояние и общая энергия сгорания), это также выступает в качестве контейнера для других образцов. Вы можете связать любые количество образцов с тренировкой. Таким образом, вы можете добавить подробные информация, относящаяся к тренировке.

В этой заданной ссылке следующая часть кода определяет частоту выборки heartRate

NSMutableArray *samples = [NSMutableArray array];

HKQuantity *heartRateForInterval =
[HKQuantity quantityWithUnit:[HKUnit unitFromString:@"count/min"]
                 doubleValue:95.0];

HKQuantitySample *heartRateForIntervalSample =
[HKQuantitySample quantitySampleWithType:heartRateType
                                quantity:heartRateForInterval
                               startDate:intervals[0]
                                 endDate:intervals[1]];

[samples addObject:heartRateForIntervalSample];

Как они там заявляют:

Вам нужно точно настроить точную длину ваших соответствующих образцов основанный на типе тренировки и потребностях вашего приложения. Использование 5 минут интервалы минимизируют объем памяти, необходимый для хранения тренировки, сохраняя при этом общий смысл изменения интенсивности ход длительной тренировки. Использование 5-секундных интервалов дает гораздо более подробный обзор тренировки, но требует значительно большего памяти и обработки.

Ответ 3

После изучения HealthKit и WatchKit Extension мои выводы заключаются в следующем:

  • Нам не нужно расширение WatchKit для получения данных о частоте сердечных сокращений.
  • Вам просто нужно иметь iPhone с парными часами Apple (что очевидно)
  • Приложение для мониторинга сердечного ритма Apple Watch по умолчанию проверяет данные HealthKit немедленно, только когда оно находится на переднем плане.
  • Когда приложение "Монитор сердечного ритма по умолчанию для Apple Watch" находится в фоновом режиме, оно обновляет данные HealthKit с интервалом в 9-10 минут.
  • Чтобы получать данные о частоте сердечных сокращений из HealthKit, необходимо периодически запускать следующий запрос.

    func getSamples()
    {
        let heartrate =HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)
        let sort = [
           NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
    ]
    let heartRateUnit = HKUnit(fromString: "count/min")
    let sampleQuery = HKSampleQuery(sampleType: heartrate!, predicate: nil, limit: 1, sortDescriptors: sort, resultsHandler: { [unowned self] (query, results, error) in
        if let results = results as? [HKQuantitySample]
        {
             let sample = results[0] as HKQuantitySample
    
            let value = sample.quantity.doubleValueForUnit(self.heartRateUnit)
            print (value)
            let rate = results[0]
            print(results[0])
            print(query)
            self.updateHeartRate(results)
        }
      })
        healthStore?.executeQuery(sampleQuery)
    
    }
    
    func updateHeartRate(samples: [HKSample]?)
    {
        guard let heartRateSamples = samples as? [HKQuantitySample] else {return}
        dispatch_async(dispatch_get_main_queue()) {
            guard let sample = heartRateSamples.first else{return}
            let value = sample.quantity.doubleValueForUnit(self.heartRateUnit)
            self.heartRateLabel.text = String(UInt16(value))
            let date = sample.startDate
            let dateFormatter = NSDateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
            self.timeStampLabel.text = dateFormatter.stringFromDate(date)
        }
    }
    

Пожалуйста, обновите меня, если кто-нибудь получит дополнительную информацию.
Счастливое кодирование.

Ответ 4

Вы можете получить данные о частоте сердечных сокращений, начав тренировку и запросить данные о частоте сердечных сокращений от healthkit.

  • Попросите предлога для чтения данных тренировки.

    HKHealthStore *healthStore = [[HKHealthStore alloc] init];
    HKQuantityType *type = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
    HKQuantityType *type2 = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning];
    HKQuantityType *type3 = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned];
    
    [healthStore requestAuthorizationToShareTypes:nil readTypes:[NSSet setWithObjects:type, type2, type3, nil] completion:^(BOOL success, NSError * _Nullable error) {
    
    if (success) {
        NSLog(@"health data request success");
    
    }else{
        NSLog(@"error %@", error);
    }
    }];
    
  • В AppDelegate на iPhone ответьте на этот запрос

    -(void)applicationShouldRequestHealthAuthorization:(UIApplication *)application{
    
    [healthStore handleAuthorizationForExtensionWithCompletion:^(BOOL success, NSError * _Nullable error) {
            if (success) {
                NSLog(@"phone recieved health kit request");
            }
        }];
    }
    
  • Затем выполните Healthkit Delegate:

    -(void)workoutSession:(HKWorkoutSession *)workoutSession didFailWithError:(NSError *)error{
    
    NSLog(@"session error %@", error);
    }
    
    -(void)workoutSession:(HKWorkoutSession *)workoutSession didChangeToState:(HKWorkoutSessionState)toState fromState:(HKWorkoutSessionState)fromState date:(NSDate *)date{
    
    dispatch_async(dispatch_get_main_queue(), ^{
        switch (toState) {
            case HKWorkoutSessionStateRunning:
    
                //When workout state is running, we will excute updateHeartbeat
                [self updateHeartbeat:date];
                NSLog(@"started workout");
            break;
    
            default:
            break;
        }
        });
    }
    
  • Теперь пришло время написать **[self updateHeartbeat:date]**

    -(void)updateHeartbeat:(NSDate *)startDate{
    
        //first, create a predicate and set the endDate and option to nil/none 
        NSPredicate *Predicate = [HKQuery predicateForSamplesWithStartDate:startDate endDate:nil options:HKQueryOptionNone];
    
        //Then we create a sample type which is HKQuantityTypeIdentifierHeartRate
        HKSampleType *object = [HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
    
        //ok, now, create a HKAnchoredObjectQuery with all the mess that we just created.
        heartQuery = [[HKAnchoredObjectQuery alloc] initWithType:object predicate:Predicate anchor:0 limit:0 resultsHandler:^(HKAnchoredObjectQuery *query, NSArray<HKSample *> *sampleObjects, NSArray<HKDeletedObject *> *deletedObjects, HKQueryAnchor *newAnchor, NSError *error) {
    
        if (!error && sampleObjects.count > 0) {
            HKQuantitySample *sample = (HKQuantitySample *)[sampleObjects objectAtIndex:0];
            HKQuantity *quantity = sample.quantity;
            NSLog(@"%f", [quantity doubleValueForUnit:[HKUnit unitFromString:@"count/min"]]);
        }else{
            NSLog(@"query %@", error);
        }
    
        }];
    
        //wait, it not over yet, this is the update handler
        [heartQuery setUpdateHandler:^(HKAnchoredObjectQuery *query, NSArray<HKSample *> *SampleArray, NSArray<HKDeletedObject *> *deletedObjects, HKQueryAnchor *Anchor, NSError *error) {
    
         if (!error && SampleArray.count > 0) {
            HKQuantitySample *sample = (HKQuantitySample *)[SampleArray objectAtIndex:0];
            HKQuantity *quantity = sample.quantity;
            NSLog(@"%f", [quantity doubleValueForUnit:[HKUnit unitFromString:@"count/min"]]);
         }else{
            NSLog(@"query %@", error);
         }
    }];
    
        //now excute query and wait for the result showing up in the log. Yeah!
        [healthStore executeQuery:heartQuery];
    }
    

У вас также есть возможность включения Healthkit в capbilities. Оставьте комментарий ниже, если у вас есть какие-либо вопросы.