読者です 読者をやめる 読者になる 読者になる

SwiftでHealthKitを利用して体温データを保存する方法

Swift

SwiftでHealthKitを利用する方法を調べていました。

このコードをViewController.swiftに以下のようにして動作させることができました。

//  ViewController.swift

import UIKit
import HealthKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        saveBodyTemperature()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    /**
    引数に渡された文字列を指定のデータへ変換してHealthStoreへ永続化します。
    渡される文字列は、Double型へキャスト出来る形式である必要があります。
    
    :param: unit       健康情報の単位型
    :param: type       健康情報のデータ型
    :param: valueStr   データ文字列
    :param: completion 永続化処理完了時に実行される処理
    */
    func saveHealthValueWithUnit(unit: HKUnit! , type: HKQuantityType!, valueStr: NSString!, completion: ((success: Bool, error: NSError!) -> Void)) {
        // 保存領域オブジェクトをインスタンス化します。
        let healthStore: HKHealthStore = HKHealthStore()
        
        // 数値オブジェクトを生成します。単位と値が入ります。
        let quantity: HKQuantity = HKQuantity(unit: unit, doubleValue: valueStr.doubleValue)
        
        // HKObjectのサブクラスである、HKQuantitySampleオブジェクトを生成します。
        // 計測の開始時刻と終了時刻が同じ場合は同じ値を設定します。
        let sample: HKQuantitySample = HKQuantitySample(type: type, quantity: quantity, startDate: NSDate(), endDate: NSDate())
        
        // 健康情報のデータ型を保持したNSSetオブジェクトを生成します。
        // 永続化したい情報が複数ある場合はobjectに複数のデータ型配列を設定します。
        let types: NSSet! = NSSet(object: type)
        
        let authStatus:HKAuthorizationStatus = healthStore.authorizationStatusForType(type)
        
        if authStatus == .SharingAuthorized {
            healthStore.saveObject(sample, withCompletion:completion)
        } else {
            
            // 体温型のデータをHealthStoreに永続化するために、ユーザーへ許可を求めます。
            // 許可されたデータのみ、アプリケーションからHealthStoreへ書き込みする権限が与えられます。
            // ヘルスケアの[ソース]タブ画面がモーダルで表示されます。
            // 第1引数に指定したNSSet!型のshareTypesの書き込み許可を求めます。
            // 第2引数に指定したNSSet!型のreadTypesの読み込み許可を求めます。
            
            healthStore.requestAuthorizationToShareTypes(types, readTypes: types) {
                success, error in
                
                if error != nil {
                    NSLog(error.description);
                    return
                }
                
                if success {
                    NSLog("保存可能");
                    healthStore.saveObject(sample, withCompletion:completion)
                }
            }
        }
    }
    
    func saveBodyTemperature() {
        // let textStr: NSString! = NSString(format: "\(tfBodyTemperature.text)")
        let textStr: NSString! = NSString(format: "36.0")
        // 体温の単位を生成します。単位は℃(摂氏)です。
        let btUnit: HKUnit! = HKUnit.degreeCelsiusUnit()
        // 体温情報の型を生成します。
        let btType: HKQuantityType! = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyTemperature)
        
        // 永続化処理完了時に非同期で呼び出されます。
        saveHealthValueWithUnit(btUnit, type: btType, valueStr: textStr, completion: {
            success, error in
            
            if error != nil {
                NSLog(error.description)
                return
            }
            
            if success {
                NSLog("体温データの永続化に成功しました。")
            }
        })
    }
}