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

Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS HealthKit入門 #002】HealthStoreからデータを取得

下記記事の続きです。 swift.swift-studying.com

HealthKitを使ってHealthStoreからデータ取得します。
細かいことは後々に勉強することとして、データ取得を試します。
データ取れたーっといううれしさで勉強のモチベーションがあがります。

準備

下記のURLからサンプルプロジェクトをダウンロードしてください。 SampleHealthKit_complete.zip - Google ドライブ

ソース追記

ViewController.swiftを下記の内容で上書きしましょう。

import UIKit
import HealthKit  // HealthKitをインポート

class ViewController: UIViewController {
    let button = UIButton(type: .System)
    let readDataButton = UIButton(type: .System)
    let dataLabel = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        view.backgroundColor = UIColor.lightGrayColor()
        
        button.setTitle("データ追加", forState: .Normal)
        button.addTarget(self, action: "didTapAddData", forControlEvents: .TouchUpInside)
        button.sizeToFit()
        button.center = view.center
        view.addSubview(button)
        
        // データ取得ボタン
        readDataButton.setTitle("データ取得", forState: .Normal)
        readDataButton.addTarget(self, action: "didTapReadData", forControlEvents: .TouchUpInside)
        readDataButton.sizeToFit()
        readDataButton.center = CGPoint(x: view.center.x, y: view.center.y + 50)
        view.addSubview(readDataButton)
        
        // 取得したデータの表示
        dataLabel.text = ""
        dataLabel.textAlignment = .Center
        dataLabel.frame = CGRect(x: 0, y: 0, width: 150, height: 30)
        dataLabel.center = CGPoint(x: view.center.x, y: view.center.y + 100)
        view.addSubview(dataLabel)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func didTapAddData(){
        saveHealthData()
    }
    
    /// 体温データを保存します
    private func saveHealthData(){
        /* 保存するデータの準備 */
        // 体温
        let temperature = "36.0"
        
        // 温度の単位
        let unit = HKUnit.degreeCelsiusUnit()
        
        // 体温情報のタイプ
        let type = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyTemperature)!
        
        
        // healthKitデータ保存領域のインスタンス化
        let healthStore = HKHealthStore()
        
        let helthData = HKQuantity(unit: unit, doubleValue: Double(temperature)!)
        
        let sample = HKQuantitySample(type: type, quantity: helthData, startDate: NSDate(), endDate: NSDate())
        
        let authorizedStatus = healthStore.authorizationStatusForType(type)
        
        // HealthKitデータ保存領域へのアクセス権限があればデータ保存。なければ、アクセス権限の確認画面へ移動
        if authorizedStatus == .SharingAuthorized{
            healthStore.saveObject(sample, withCompletion: { (success, error) in
                if error != nil {
                    NSLog(error!.description);
                    return
                }
                
                if success {
                    healthStore.saveObject(sample, withCompletion:{ (success, error) in
                        print("保存成功")
                    })
                }
            })
        }else{
            
            healthStore.requestAuthorizationToShareTypes([type], readTypes: [type], completion: { (success, error) in

                if error != nil {
                    NSLog(error!.description);
                    return
                }

                // アクセス権限を得たらデータを保存
                if success {
                    healthStore.saveObject(sample, withCompletion:{ (success, error) in
                        print("保存成功")
                    })
                }
            })
        }
    }
    
    func didTapReadData(){
        readHealthData()
    }
    
    /// HealthStoreから体温データを取得します。
    private func readHealthData(){
        // データの種類
        let type = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyTemperature)!
        
        // データ取得
        let healthStore = HKHealthStore()
        
        // データ抽出クエリ
        let query = HKSampleQuery(sampleType: type, predicate: nil, limit: 0, sortDescriptors: nil) { (query, results, error) in
            // データ抽出処理完了後の処理
            if error != nil{
                print("エラー")
            }
            
            if let samples = results as? [HKQuantitySample]{
                dispatch_async(dispatch_get_main_queue()){
                    self.dataLabel.text = samples.first?.quantity != nil ? "\(samples.first!.quantity)" : ""
                }
            }
        }
        
        // HealthStoreへのアクセス権限確認
        let authorizedStatus = healthStore.authorizationStatusForType(type)
        
        // 権限があれば、実行。権限がなければ、権限確認画面へ。
        if authorizedStatus == .SharingAuthorized{
            healthStore.executeQuery(query)
        }else{
            healthStore.requestAuthorizationToShareTypes([type], readTypes: [type]) {
                success, error in
                
                if error != nil {
                    print(error!.description);
                    return
                }
                
                if success {
                    // 引数に指定されたクエリーを実行します
                    healthStore.executeQuery(query)
                }
            }
        }
        
    }
}



アプリ実行

1.「データ追加」ボタンを押しましょう
体温36℃のデータを追加します。

f:id:fjswkun:20150925211907p:plain

2.アプリで初めてヘルスケアのデータ保存領域にアクセスする場合、
アクセス許可画面が表示されます。__

体温と書いた部分のスイッチ2つをオンにしましょう。
f:id:fjswkun:20150925153234p:plain

3.「データ取得」ボタンを押しましょう
体温36℃を表す「36 degC」と表示されます。
f:id:fjswkun:20150925212003p:plain

おわりに

次は詳細を調べながら勉強していく。

うまくいかないかたはコチラからサンプルソースをダウンロードし、
実行してみてください。

SampleHealthKit_complete.zip - Google ドライブ

参考情報

iOSアプリ開発未経験の人向け
iOSアプリ開発をはじめたとき最初に買った書籍 【アプリ作成未経験の人向け】
Storyboardを使って画面を作成していく。
手順にしたがって操作していくと、ボタンの作成やWebViewの作成などができる。
アプリって、こんな感じで作るんだというのを体験できる。

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift