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 同步)