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

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

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

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

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

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

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

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

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

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

Вот ссылка на реализацию исходного кода

Как указано в Справочнике classа HKWorkout :

Класс HKWorkout является конкретным подclassом classа 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-секундных интервалов дает гораздо более подробный обзор тренировки, но требует значительно большего объема памяти и обработки.

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

  1. Нам не нужно расширение WatchKit для получения данных о частоте сердечных сокращений.
  2. Вам просто нужно иметь iPhone с парными часами Apple (что очевидно)
  3. Приложение Apple Watch Heart Rate Monitor по умолчанию обновляет данные HealthKit немедленно, только когда оно находится на переднем плане.
  4. Когда приложение «Монитор сердечного ритма по умолчанию Apple Watch» находится в фоновом режиме, оно обновляет данные HealthKit с интервалом в 9-10 минут.
  5. Чтобы получать данные о частоте сердечных сокращений из 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) } } 

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

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

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

     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); } }]; 
  2. В AppDelegate на iPhone ответьте на этот запрос

     -(void)applicationShouldRequestHealthAuthorization:(UIApplication *)application{ [healthStore handleAuthorizationForExtensionWithCompletion:^(BOOL success, NSError * _Nullable error) { if (success) { NSLog(@"phone recieved health kit request"); } }]; } 
  3. Затем реализуйте 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; } }); } 
  4. Теперь пришло время написать **[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 *sampleObjects, NSArray *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's not over yet, this is the update handler [heartQuery setUpdateHandler:^(HKAnchoredObjectQuery *query, NSArray *SampleArray, NSArray *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. Оставьте комментарий ниже, если у вас есть какие-либо вопросы.

  • UILongPressGestureRecognizer вызывается дважды при нажатии
  • используя objc_msgSend для вызова функции Objective C с именованными аргументами
  • Как скопировать объект в объекте c
  • Стилизация кнопки отмены в UISearchBar
  • Остановить UIWebView от «подпрыгивания» по вертикали?
  • Что такое простой способ разбить NSArray с 4000+ объектами в нем на несколько массивов с 30 объектами каждый?
  • Что делает флаг компоновщика -all_load?
  • Понимание подсчета ссылок с помощью Cocoa и Objective-C
  • Могу ли я передать блок как @selector с Objective-C?
  • Как я могу «разрезать» прозрачное отверстие в UIImage?
  • Содержимое HTML соответствует UIWebview без масштабирования
  • Давайте будем гением компьютера.