objective-c xcode watchkit

objective c - Datos de frecuencia cardíaca en Apple Watch



objective-c xcode (4)

Después de explorar HealthKit y WatchKit Extension, mis hallazgos son los siguientes:

  1. No necesitamos la extensión WatchKit para obtener los datos de frecuencia cardíaca.
  2. Solo necesita tener un iPhone con reloj Apple emparejado (lo cual es obvio)
  3. La aplicación de monitor de frecuencia cardíaca predeterminada de Apple Watch actualiza los datos de HealthKit inmediatamente solo cuando está en primer plano.
  4. Cuando la aplicación predeterminada del monitor de frecuencia cardíaca Apple Watch está en segundo plano, actualiza los datos de HealthKit en el intervalo de 9-10 minutos.
  5. Para obtener los datos de frecuencia cardíaca del HealthKit, la siguiente consulta debe activarse periódicamente.

    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) } }

Actualízame si alguien recibe más información.
Feliz codificación.

¿Podemos acceder a la frecuencia cardíaca directamente desde el Apple Watch? Sé que esta es una pregunta duplicada, pero nadie ha formulado esta pregunta en 5 meses. Sé que puede acceder desde la aplicación Health, pero no estoy seguro de cómo será "en tiempo real".


La información de datos sin procesar del Watchkit for watchOS 2.0 ahora está disponible en Watchkit for watchOS 2.0 .

WatchOS 2 incluye muchas mejoras en otros marcos existentes como HealthKit , lo que permite el acceso a los sensores de salud que acceden a la frecuencia cardíaca y la información de salud en tiempo real.

Puede verificar esta información en la siguiente sesión, que es una presentación total de 30 minutos. Si no desea ver la sesión completa, salte directamente a las Healthkit API , que se encuentra entre 25 y 28 minutos:

WatchKit para la sesión watchOS 2.0 en WWDC 2015

Aquí está el link implementación del código fuente

Como se indica en la link :

La clase HKWorkout es una subclase concreta de la clase HKSample . HealthKit utiliza entrenamientos para rastrear una amplia gama de actividades. El objeto de entrenamiento no solo almacena información resumida sobre la actividad (por ejemplo, duración, distancia total y energía total quemada), sino que también actúa como un contenedor para otras muestras. Puede asociar cualquier número de muestras con un entrenamiento. De esta manera, puede agregar información detallada relevante para el entrenamiento.

En ese enlace dado, la siguiente parte del código define la frecuencia de muestreo de 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];

Como dicen allí:

Debe ajustar la longitud exacta de sus muestras asociadas según el tipo de entrenamiento y las necesidades de su aplicación. El uso de intervalos de 5 minutos minimiza la cantidad de memoria necesaria para almacenar el entrenamiento, al tiempo que proporciona una sensación general del cambio de intensidad en el transcurso de un entrenamiento largo. El uso de intervalos de 5 segundos proporciona una vista mucho más detallada del entrenamiento, pero requiere considerablemente más memoria y procesamiento.


No hay forma directa de acceder a ningún sensor en el Apple Watch. Deberá confiar en el acceso desde HealthKit.

Un evangelista de Apple dijo esto

No es posible crear una aplicación de monitor cardíaco en este momento. No se garantiza que los datos se envíen al iPhone en tiempo real, por lo que no podrá determinar qué sucede de manera oportuna.

Ver https://devforums.apple.com/message/1098855#1098855


Puede obtener datos de frecuencia cardíaca iniciando un entrenamiento y consultar datos de frecuencia cardíaca desde el kit de salud.

  1. Solicite autorización para leer datos de entrenamiento .

    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. En AppDelegate en iPhone , responda esta solicitud

    -(void)applicationShouldRequestHealthAuthorization:(UIApplication *)application{ [healthStore handleAuthorizationForExtensionWithCompletion:^(BOOL success, NSError * _Nullable error) { if (success) { NSLog(@"phone recieved health kit request"); } }]; }

  3. Luego implemente 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. Ahora es el momento de escribir **[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''s 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]; }

También puedes activar Healthkit en capbilities. Deje un comentario a continuación si tiene alguna pregunta.