原則として、開発者の年の終わりと初めには、常に多数のプロジェクトがあります。 緊急の問題に対処し、袖をまくって、Techmasで同僚とより多くの開発を共有することを約束しました。
すでにHealthKitを使用しているアプリケーションの人気が高まっているにもかかわらず、モバイル健康評価ソリューションの需要は
進化し続け
ています 。
プラットフォームを操作するすべての基本原則を説明するために、前の出版物の例に戻り、Healthのデータサンプルを操作することで補足することにしました。
はじめに
以前にHealthKitの一般的な機能を確認し、Healthでの認証およびユーザー
特性の表示のアプリケーションを確認したことを思い出してください。 次に、新しいトレーニングデータの読み取りと書き込みのサンプルを扱います。
サンプル(
サンプル )は、時間とともに変化し、ユーザーの動作に依存するという点で、特性(
特性 )とは異なります。 たとえば、サンプルを使用して新しいトレーニングデータを追加し、それらを視覚化し、追加のパラメーターを決定および計算します。
この例では、Healthアプリケーションからユーザーの身長と体重に関するデータを読み取る方法を示します。 次に、それらからBMI(body mass index)を計算し、結果の値を追加して、その変化のダイナミクスを追跡します。
したがって、前の部分からアプリケーションに戻ります。 彼のコードは
ここにあり
ます 。
サンプル準備
Healthアプリケーションでサンプルのテストデータを作成します。
これを行うには、[体の測定]タブで[体重]項目を選択し、[データポイントの追加]を使用して体重情報とともにいくつかのキーポイントを追加します。
データは、さまざまな間隔で好きなだけ入力できます。
これで、選択パラメーターを操作する許可が得られました。
authorizeHealthKit()を承認関数に追加します(承認については前に説明しました)。
let healthKitTypesToWrite = Set(arrayLiteral: HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)!, HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned)!, HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)! )
健康のサンプルを読む
この例では、
readMostRecentSample()関数を作成します。この関数は、日付とタイプによってインジケーターを読み取ります。
選択範囲を取得するには、
HKQueryを継承する
HKSampleQueryサブクラスを使用する必要があります。
基本的に 、コアデータの
NSFetchedRequestと同様に機能します。
リクエストを生成する場合、次のオプションを使用できます。
1.サンプルのタイプ(たとえば、重量または高さ)、
タイプ 。
2.サンプルを選択する条件(期間、値など)、
NSPredicate 。
3.ソート方法
NSSortDescriptors 。
2番目と3番目のパラメーターはオプションです。 クエリを生成した後、結果を表示するには
executeQuery()を実行する必要があります。
この例では、指定したタイプの選択の最後の値を取得するメソッドを作成します。
readMostRecentSample()関数に次のコードを追加します。
// 1. let past = NSDate.distantPast() let now = NSDate() let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(past, endDate:now, options: .None) // 2. let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: false) // 3. let limit = 1 // 4. let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: mostRecentPredicate, limit: limit, sortDescriptors: [sortDescriptor]) { (sampleQuery, results, error ) -> Void in if let queryError = error { completion(nil,error) return; } // let mostRecentSample = results!.first as? HKQuantitySample if completion != nil { completion(mostRecentSample,nil) } } // 5. self.healthKitStore.executeQuery(sampleQuery)
この関数を使用すると、特定のタイプのサンプルに関する最新データを取得できます。 簡単にするために、
readMostRecentSample()を
viewDidLoad()メソッドに追加し
ます 。
// 1. HKSampleType let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass) // 2. self.readMostRecentSample(sampleType!, completion: { (mostRecentWeight, error) -> Void in if( error != nil ) { print("Error reading weight from HealthKit Store: \(error.localizedDescription)") return; }
ここでは、
quantityTypeForIdentifierを使用して必要なサンプルを決定します。この場合は
HKQuantityTypeIdentifierBodyMassです。
BMI値の計算
ここで、BMIの計算と書き込みのためのセットを作成します。 次の式で計算されます。
bmi = weight / height ^ 2
上記のように、Healthから重量値を抽出します。 同様に、ユーザーの身長を取得します(データ型と形式を置き換え、
HKQuantityTypeIdentifierHeightを使用し
ます) 。
ここでは、
HKQuantitySampleオブジェクトが必要です。 以下も指定する必要があります。
•保存する
HKQuantityTypeオブジェクトのタイプ。 私たちの場合、これは
HKQuantityTypeIdentifierBodyMassIndexです。
•
HKQuantityオブジェクト。 bmiパラメーターから渡された値で初期化されます。 スカラー型Doubleを変換するには、
HKUnit.countUnit()を使用することが重要です。これにより、型を必要な測定単位に変換できます。
次に、BMIの計算は次のようになります。
var weight: HKQuantitySample var weightLocalizedString = “empty" weight = (mostRecentWeight as? HKQuantitySample)!; kilograms = weight.quantity.doubleValueForUnit(HKUnit.gramUnitWithMetricPrefix(.Kilo)) let weightFormatter = NSMassFormatter() weightFormatter.forPersonMassUse = true; weightLocalizedString = weightFormatter.stringFromKilograms(kilograms) print(weightLocalizedString) let weightInKilograms = kilograms let heightInMeters: Double = 180 let bmi = weightInKilograms / heightInMeters * heightInMeters print(String(format: "%.02f", bmi))
NSMassFormatterを使用したフォーマット結果の使用にも注意して
ください 。
NSMassFormater自体は、本質的にHelathKitの一部ではありませんが、Healthデータ型を操作できます。 特に、アプリケーションでキログラムが使用されており、デバイスがメートル法を使用していない場合、測定単位を希望の形式にする機会があります。
インターフェースの問題については説明しませんので、結果をコンソールに表示します。
健康に新しいピックを追加する
最後に、結果のBMI値をHelathKitに書き込むには、
saveBMISampleメソッドを作成します
(bmi:Double、date:NSDate) 。 出力パラメーター:BMI値自体とその登録日。
// 1. BMI let bmiType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex) let bmiQuantity = HKQuantity(unit: HKUnit.countUnit(), doubleValue: bmi) let bmiSample = HKQuantitySample(type: bmiType, quantity: bmiQuantity, startDate: date, endDate: date) // 2. Health healthKitStore.saveObject(bmiSample, withCompletion: { (success, error) -> Void in if( error != nil ) { println("Error saving BMI sample: \(error.localizedDescription)") } else { println("BMI sample saved successfully!") } })
新しいBMI値は、標準表示の両方で使用でき、サードパーティの承認されたアプリケーションで使用できます。
ご注意
実際には、HealthKitを操作するためのすべてのメソッドを別のクラスに入れることは理にかなっています。
この例では、プラットフォームを操作する重要な段階を示すことに限定しました。
最終アプリケーションコードは
こちらです。