Данные сердцебиения в реальном времени от Apple Watch с использованием HKHeartbeatSeriesSample - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь получить доступ к данным пульса, записанным с Apple Watch, в режиме реального времени. С HKWorkoutSession я могу получать обратные вызовы на workoutBuilder didCollectDataOf каждые 5 секунд с данными сердечного ритма (ударов / мин).

Этого в реальном времени недостаточно для моего приложения, поэтому я собираюсь использовать для этой цели новый (с iOS 13 и watchOS 6.0) HKHeartbeatSeriesSample (и связанные с ним классы). Насколько я понимаю, в последовательных выборках для данных сердцебиения будут записываться измерения побитовых ударов в виде серий.

Я могу заставить работать API и получать некоторые данные, но не в реальном времени - серии Я получаю данные из некоторых предыдущих записей (неясно, что вызывает эти записи).

Вот разрешение:

            let allTypes: Set<HKSampleType> = Set([
                HKObjectType.workoutType(),
                HKSeriesType.heartbeat(),
                HKObjectType.quantityType(forIdentifier: .heartRate)!,
                HKQuantityType.quantityType(forIdentifier: .heartRateVariabilitySDNN)!,
            ])

            healthStore.requestAuthorization(toShare: allTypes, read: allTypes) { (success, error) in
                ///...
                let workoutSession = WorkoutSession(healthStore: self.healthStore)
                workoutSession.startHeartbeatSampleQuery()
            }

startHeartBeatSampleQuery:

            let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate,
                                                  ascending: false)

            // Query for the heartbeat samples from the specified heartbeat series.
            let heartbeatSeriesSampleQuery = HKSampleQuery(sampleType: HKSeriesType.heartbeat(),
                                                           predicate: nil,
                                                           limit: HKObjectQueryNoLimit,
                                                           sortDescriptors: [sortDescriptor]) {
                (query, results, error) in

                guard let samples = results, let sample = samples.first as? HKHeartbeatSeriesSample else {
                    print("NO SAMPLES MY FRIEND")
                    return
                }

                let heartbeatSeriesQuery = HKHeartbeatSeriesQuery(heartbeatSeries: sample) {
                    (query, timeSinceSeriesStart, precededByGap, done, error) in

                    guard error == nil else {
                        print("error in HKHeartbeatSeriesQuery: \(String(describing: error))")
                        return
                    }

                    print("timeSinceSeriesStart = \(timeSinceSeriesStart), precededByGap = \(precededByGap)")

                }

                self.healthStore.execute(heartbeatSeriesQuery)
            }

            completionHandler()

            self.healthStore.execute(heartbeatSeriesSampleQuery)
        }

Примеры серий Я получаю из этого запроса:

samples: [count=41 5D4F0C84-294D-41A7-8F64-B387A8E767A3 "Vishal’s Apple Watch" (6.1.1), "Watch3,2" (6.1.1)"Apple Watch"  (2020-01-18 12:12:06 -0800 - 2020-01-18 12:13:12 -0800), count=27 32B0B090-CDF8-48F5-BCF6-670982C426F3 "Vishal’s Apple Watch" (6.1.1), "Watch3,2" (6.1.1)"Apple Watch"  (2020-01-15 21:38:41 -0800 - 2020-01-15 21:39:46 -0800), count=67 B485328A-3EA1-49F2-8666-75B3B2143A05 "Vishal’s Apple Watch" (6.1.1), "Watch3,2" (6.1.1)"Apple Watch"  (2020-01-14 21:00:15 -0800 - 2020-01-14 21:01:17 -0800), count=48 9D550B3A-F325-4CA0-B5E7-43BA42E835ED "Vishal’s Apple Watch" (6.1.1), "Watch3,2" (6.1.1)"Apple Watch"  (2020-01-14 17:06:27 -0800 - 2020-01-14 17:07:33 -0800), count=50 278E1BF7-726B-443B-97C3-8BBA3DF06207 "Vishal’s Apple Watch" (6.1.1), "Watch3,2" (6.1.1)"Apple Watch"  (2020-01-13 12:04:28 -0800 - 2020-01-13 12:05:34 -0800), count=33 1215B2C4-F168-4EAD-9C35-5F734CC29637 "Vishal’s Apple Watch" (6.1.1), "Watch3,2" (6.1.1)"Apple Watch"  (2020-01-13 11:55:01 -0800 - 2020-01-13 11:56:06 -0800), count=48 EB2C64F9-9E81-4F5B-BA4A-62FA6816FE29 "Vishal’s Apple Watch" (6.1.1), "Watch3,2" (6.1.1)"Apple Watch"  (2020-01-11 12:20:36 -0800 - 2020-01-11 12:21:37 -0800), count=46 515D467A-51E9-490B-8082-5C8F541A0BD7 "Vishal’s Apple Watch" (6.1.1), "Watch3,2" (6.1.1)"Apple Watch"  (2020-01-11 11:01:38 -0800 - 2020-01-11 11:02:44 -0800)], sample: count=41 5D4F0C84-294D-41A7-8F64-B387A8E767A3 "Vishal’s Apple Watch" (6.1.1), "Watch3,2" (6.1.1)"Apple Watch"  (2020-01-18 12:12:06 -0800 - 2020-01-18 12:13:12 -0800)

Самый последний - 1/18, и он не соответствует моему активному сеансу тренировки - независимо от того, запускаю ли я HKWorkoutSession или выполняю тренировку вручную на мои часы, которые, кажется, не меняются.

Но данные в серии именно то, что я хочу; данные по частям, например:

timeSinceSeriesStart = 1.1875, precededByGap = false
timeSinceSeriesStart = 2.046875, precededByGap = false
timeSinceSeriesStart = 2.92578125, precededByGap = false
timeSinceSeriesStart = 3.8125, precededByGap = false
...

Неправильно ли я использую API? Или это нереальный способ получения данных пульса в реальном времени?

1 Ответ

2 голосов
/ 21 января 2020

Нет способа записать частоту сердечных сокращений более точно, чем вы уже наблюдали с помощью API сеанса тренировки. Образцы типа HKSeriesType.heartbeat() записываются, когда Apple Watch вычисляет вариабельность сердечного ритма (см. Тип образца heartRateVariabilitySDNN). HRV периодически рассчитывается в фоновом режиме Apple Watch. Нет API для инициации чтения ВСР.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...