iOS HealthKit 如何保存心率(bpm)值?迅速

Posted

技术标签:

【中文标题】iOS HealthKit 如何保存心率(bpm)值?迅速【英文标题】:iOS HealthKit how to save Heart Rate (bpm) values? Swift 【发布时间】:2014-12-03 10:02:00 【问题描述】:

使用方法:HKUnit

样本类型 单位类型 单位名称 单位字符串 心率计数/时间每分钟跳动次数“计数/分钟”

【问题讨论】:

【参考方案1】:

Swift : 将心率 (bpm) 保存到 healthkit 商店中

 private func saveHeartRateIntoHealthStore(height:Double) -> Void
    
        // Save the user's heart rate into HealthKit.
        let heartRateUnit: HKUnit = HKUnit.countUnit().unitDividedByUnit(HKUnit.minuteUnit())
        let heartRateQuantity: HKQuantity = HKQuantity(unit: heartRateUnit, doubleValue: height)

        var heartRate : HKQuantityType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)
        let nowDate: NSDate = NSDate()

        let heartRateSample: HKQuantitySample = HKQuantitySample(type: heartRate
            , quantity: heartRateQuantity, startDate: nowDate, endDate: nowDate)

        let completion: ((Bool, NSError!) -> Void) = 
            (success, error) -> Void in

            if !success 
                println("An error occured saving the Heart Rate sample \(heartRateSample). In your app, try to handle this gracefully. The error was: \(error).")

                abort()
            

        

        self.healthStore!.saveObject(heartRateSample, withCompletion: completion)

    // end saveHeartRateIntoHealthStore

【讨论】:

你也可以为单元使用便利初始化器:let heartRateUnit = HKUnit(fromString: "count/min")【参考方案2】:

Swift 3 中:

func saveHeartRate(date: Date = Date(), heartRate heartRateValue: Double, completion completionBlock: @escaping (Bool, Error?) -> Void) 
    let unit = HKUnit.count().unitDivided(by: HKUnit.minute())
    let quantity = HKQuantity(unit: unit, doubleValue: heartRateValue)
    let type = HKQuantityType.quantityType(forIdentifier: .heartRate)!

    let heartRateSample = HKQuantitySample(type: type, quantity: quantity, start: date, end: date)

    self.healthKitStore.save(heartRateSample)  (success, error) -> Void in
        if !success 
            print("An error occured saving the HR sample \(heartRateSample). In your app, try to handle this gracefully. The error was: \(error).")
        
        completionBlock(success, error)
    

【讨论】:

【参考方案3】:

在 ObjectiveC 中(对于那些不使用 Swift 的人,为了便于阅读而展开):

#define nilable __nullable
#define kCountPerMinUnitStr @"count/min"

typedef void (^VoidBoolErrorBlock) (BOOL        success,
                                    NSError *   nilable error);

enum 
    // Memory Constants
    kNil       = 0,
    kNilUPP    = 0,
    kNilRefCon = 0
;


/**
 writes a weight sample to HealthKit

 @param weight as HKQuantityTypeIdentifierBodyMass
 */
- (void) writeCDAHeartRateSample: ( NSStringPtr ) valueStr
                        cdaUnits: ( NSStringPtr ) cdaUnits
                            date: ( NSDate * ) date       // was (CGFloat)
    double  theValue = kNil;

    // Each quantity consists of a value and a unit.
    HKUnit *            theMeasurementUnit = nil;
    HKQuantity *        theQuantity        = nil;

    HKQuantityType *    theHeartRateType   = nil;
    NSDate *            theDate            = nil;

    // For every sample, we need a sample type, quantity and a date.
    HKQuantitySample *  theSample = nil;
    VoidBoolErrorBlock  theBlock  = nil;

    theValue           = [ valueStr integerValue ];
//    theMeasurementUnit = [ HKUnit unitFromCDAString: cdaUnits ];
    theMeasurementUnit = [ HKUnit unitFromString: kCountPerMinUnitStr ];    /// FIXME: temp code *** example
    theQuantity        = [ HKQuantity quantityWithUnit: theMeasurementUnit
                                           doubleValue: theValue ];

    theHeartRateType = [ HKQuantityType quantityTypeForIdentifier: HKQuantityTypeIdentifierHeartRate ];
    theDate          = ( date != nil ) ? date : [ NSDate date ];///???: default to today's date?

    theBlock = [ self saveCDAHeartRateObjectBlock: theValue ];

    // For every sample, we need a sample type, quantity and a date.
    theSample = [HKQuantitySample quantitySampleWithType: theHeartRateType
                                                      quantity: theQuantity
                                                     startDate: theDate
                                                       endDate: theDate];
    [ self.healthStore saveObject: theSample
                   withCompletion: theBlock ];




/**
 companion block encapsulation for writeCDAHeartRateSample

 @return  completion block for saveObject: withCompletion in writeCDAHeartRateSample
 */
- ( VoidBoolErrorBlock ) saveCDAHeartRateObjectBlock: ( double ) value 
    VoidBoolErrorBlock theResult = nil;

    theResult = ^(BOOL success, NSError *error) 
        if (!success) 
            ///NSLog(@"Error while saving Heart Rate (%f) to Health Store: %@.", value, error);
        
    ;

    return theResult;

【讨论】:

以上是关于iOS HealthKit 如何保存心率(bpm)值?迅速的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 healthkit 使用 Apple Watch 心率更新 iOS 应用程序? (HealthKit 同步)

iOS HealthKit - 如何获得绝对最新的当前心率,例如手表心率并发症?

如何使用 Swift 查询 Healthkit 的平均心率

如何使用 Swift 查询 Healthkit 的平均心率

从 healthKit 中提取心率

从 healthKit 中提取心率