ヘルツキットでフィットネスアプリを開発

10665 ワード

作者:AppCoda,原文リンク,原文日付:2016-03-22訳者:Crystal Sun;校正:numbbbbb;下書き:Cee
ニュースを見ても、歴史上のどの時よりもフィットネスと健康が今日よりも重要であることがわかります.言うのもおかしいですが、数日前にニュースでも同じことを言っていたのを覚えているようです.年を取っているせいか、健康とフィットネスが必要です.いずれにしても、これは話題です.技術の進歩に伴い、携帯電話の応用とハードウェアが世界的に流行し、ますます流行しているフィットネス健康の話題に新しい要素を加えた.
HealthKitはアップルの重要な橋渡しであり、追跡した重要な健康データを健康意識のある科学技術消費者、スポーツファン、普段iPhoneを使っている人とつなぎました.これはクールで、ユーザーは簡単にしばらくの間のフィットネスと健康データを追跡することができ、意識したメリットのほか、アイコンの中で上へ行く曲線を見ることができ、私たちに大きな励ましを与え、運動を続けることを励ますことができます.
私たちが想像できるように、健康情報を管理する際に、データの安全は非常に重要な要素になります.HealthKitはすべてのHealthKit情報に対して絶対的な制御権を持ち,ユーザに直接伝達される.ユーザーは、Appが健康データを取得する要求を許可または拒否することができます.
開発者にとって、HealthKitデータの読み取りまたは書き込みを許可するように要求する必要があります.実際には、具体的なデータの取得に影響を与えたいと特に宣言する必要があります.また、HealthKitを使用するAppには、Privacy Policy(プライバシープロトコル)が含まれている必要があります.これにより、ユーザーは情報取引を行うときにより快適になります.

1時間歩くことについて(OneHourWalker)


今日は、HealthKitの情報を読み取ることも、新しいデータを書き込むこともできる興味深いAppを作成します.OneHourWalkerの外見を見てみましょう.
OneHourWalkerはフィットネスアプリで、ユーザーが1時間以内に歩いたり走ったりする距離を追跡することができます.ユーザーは距離をHealthKitに共有することができ、健康アプリケーションで見ることができます.私は知っていて、まる1時間は確かに少し怖いです.少なくとも私にとってはそうです.したがって、ユーザはフィットネスを早期に終了することができ、この場合も距離を共有することができる.
だから、HealthKitにデータを書き込むだけでいいように聞こえます.しかし、私たちが読み込むデータは何ですか?
いい質問だ!私は林の中の小道を歩くのが好きだ.私はよく枝が縦横に走っているエリアを通り抜けます.私は8尺の大男なので、これはいくつかの問題をもたらします.私たちの解決策は、HealthKitからユーザーの身長を読み取り、Labelコントロールに表示することです.これにより、運動に適していない領域を避けるために、ユーザーに友好的にヒントを与えることができます.
次はOneHourWalkerの初期プロジェクトで、ダウンロードして実行します.Appが実行できるように見えます.タイマーも測位システムも動いているので、HealthKitの使用に注意するだけです.注意してください.60分後には、タイマーと測位システムが自動的に停止します.

HealthKitの有効化


最初のステップは、アプリケーションでHealthKit機能をオンにし、Project NavigatorでOneHourWalkerを選択し、Targetsの下にあるOneHourWalkerをクリックすることです.次に、画面上のタブバーでCapabilitiesをクリックします.
Capabilitiesの下部にHealthKitをOnに設定します.これは、App IDにHealthKit entitlementを追加し、info plistファイルにHealthKit keyを追加し、資格ファイルにHealthKit entitlementを追加し、HealthKit.frameworkに接続します.こんなに簡単です.

コードを書き始めましょう

TimerViewController.swiftが見つかりました.次にOneHourWalkerにHealthKitを追加します.まず、HealthKitManagerインスタンスを作成します.

import UIKit
import CoreLocation
import HealthKit

class TimerViewController: UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var timerLabel: UILabel!
    @IBOutlet weak var milesLabel: UILabel!
    @IBOutlet weak var heightLabel: UILabel!
    
    var zeroTime = NSTimeInterval()
    var timer : NSTimer = NSTimer()
    
    let locationManager = CLLocationManager()
    var startLocation: CLLocation!
    var lastLocation: CLLocation!
    var distanceTraveled = 0.0
    
    let healthManager:HealthKitManager = HealthKitManager()
HealthKitManager.swiftにはHealthKitに関するすべての操作が含まれています.中にはいくつかの重要な方法があります.後で実現します.
冒頭で説明したように、ユーザーの権限を取得して、健康データを読み取り、書き込む必要があります.ViewDidLoad()で認証を取得します.

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.requestWhenInUseAuthorization();
        
        if CLLocationManager.locationServicesEnabled(){
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
        }
        else {
            print("Need to Enable Location");
        }
        
        //   HealthKit  
        getHealthKitPermission()
    }
getHealthKitPermission()メソッドはmanagerのauthorizeHealthKit()メソッドを呼び出します.すべてがうまくいけば、setHeight()メソッドを呼び出すことができます.後でこのメソッドを紹介します.

    func getHealthKitPermission() {
        //   HealthKitManager.swift  。
        healthManager.authorizeHealthKit { (authorized,  error) -> Void in
            if authorized {
                
                //  
                self.setHeight()
            } else {
                if error != nil {
                    print(error)
                }
                print("Permission denied.")
            }
        }
    }
HealthKitManager.swiftファイルにauthorizeHealthKit()メソッドを作成します.また、HealthKit storeを作成し、AppをHealthKitデータに接続する必要があります.

    let healthKitStore: HKHealthStore = HKHealthStore()
    
    func authorizeHealthKit(completion: ((success: Bool, error: NSError!) -> Void)!) {
        
        //   HealthKit  
        let healthDataToRead = Set(arrayLiteral: HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight)!)
        
        //   HealthKit  
        let healthDataToWrite = Set(arrayLiteral: HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)!)
        
        //   OneHourWalker   iPad  
        if !HKHealthStore.isHealthDataAvailable() {
            print("Can't access HealthKit.")
        }
        
        //  
        healthKitStore.requestAuthorizationToShareTypes(healthDataToWrite, readTypes: healthDataToRead) { (success, error) -> Void in
            if( completion != nil ) {
                completion(success:success, error:error)
            }
        }
    }

ユーザーの健康データの取得を許可するように要求する場合は、特にデータの読み取りと書き込みをしたいだけであることを示す必要があります.このアプリケーションでは、ユーザーの身長を読み取り、枝にぶつからないようにしたいと考えています.私たちはHealthKitがHKObjectエンティティを提供することを望んで、私たちはそれをより可読性の高い身長値に変換することができます.また,ユーザの歩行と走行の距離をHKObjectエンティティに書き込むために書き込み権限を申請する必要がある.
私たちはiPad画面の適合を処理した後、権限要求を開始します.HealthKitManager.swiftファイルにgetHeight()メソッドを作成し、HealthKitからユーザの高さデータを読み込みます.

    func getHeight(sampleType: HKSampleType , completion: ((HKSample!, NSError!) -> Void)!) {
        
        //  , 
        let distantPastHeight = NSDate.distantPast() as NSDate
        let currentDate = NSDate()
        let lastHeightPredicate = HKQuery.predicateForSamplesWithStartDate(distantPastHeight, endDate: currentDate, options: .None)
        
        //  
        let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)

        //   HealthKit  
        let heightQuery = HKSampleQuery(sampleType: sampleType, predicate: lastHeightPredicate, limit: 1, sortDescriptors: [sortDescriptor]) { (sampleQuery, results, error ) -> Void in
                
                if let queryError = error {
                    completion(nil, queryError)
                    return
                }

                //   HKQuantitySample  
                let lastHeight = results!.first
            
                if completion != nil {
                    completion(lastHeight, nil)
                }
        }
        
        //  
        self.healthKitStore.executeQuery(heightQuery)
    }

身長データをクエリーする最初のステップは、時間パラメータを定義する断言を作成することです.私たちはしばらくの間、すべての身長情報を取得します.もちろん、これは配列を返します.私たちは最近の身長だけがほしいので、データを並べ替えて、データの中で最新のデータを一番前に並べます.
クエリーを作成するときに、配列の長さを1に制限します.発生する可能性のあるエラーを処理した後、私たちは最初で唯一のitemをlastHeightの結果とした.次にgetHeight()のコールバック関数を呼び出します.最後に、クエリー操作を実行します.TimerViewController.swiftに戻り、ユーザ認証が完了した後、ユーザがAppの使用を開始する前に、getHealthKitPermission()においてsetHeight()を呼び出す必要がある.

var height: HKQuantitySample?

まず、HKQuantitySampleインスタンスに高さ変数を宣言する必要があります.

    func setHeight() {

        //   HKSample。
        let heightSample = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight)
        
        //   HealthKitManager   getSample()  , 。
        self.healthManager.getHeight(heightSample!, completion: { (userHeight, error) -> Void in
            
            if( error != nil ) {
                print("Error: \(error.localizedDescription)")
                return
            }
            
            var heightString = ""
            
            self.height = userHeight as? HKQuantitySample
            
            //  。
            if let meters = self.height?.quantity.doubleValueForUnit(HKUnit.meterUnit()) {
                let formatHeight = NSLengthFormatter()
                formatHeight.forPersonHeightUse = true
                heightString = formatHeight.stringFromMeters(meters)
            }
            
            //   label  。
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.heightLabel.text = heightString
            })
        })
        
    }
share()メソッドの前にsetHeigth()メソッドを作成します.私たちが要求した身長データはHKQuantityを返し、identifierはHKQuantityTypeIdentifierHeightです.
次に、managerのgetHeight()メソッドを呼び出します.身長データがあれば、適切な文字列に変換し、Labelコントロールに示す必要があります.例によって、私たちは可能なすべての間違いを考慮しなければなりません.
これにより、ユーザーはAppを開き、身長を確認し、身長を健康アプリケーションに記録し、時間を計り始め、ランニングや歩行の距離を追跡することができます.次のステップは、ユーザーがすべてのフィットネスデータを記録できるように、書き込みデータを処理することです.
ユーザーが運動を完了した後(丸1時間でも1時間もしない)、彼/彼女はShareボタンをクリックして、彼らの距離をHealthアプリケーションに送信します.だから私たちはshare()の方法の中でHealthKitManager.swiftの中のsaveDistance()の方法を呼び出して、このようにデータと日付はすべてアーカイブすることができて、明日ユーザーは彼/彼女の自分の記録に挑戦してみることができます!

    @IBAction func share(sender: AnyObject) {
        healthManager.saveDistance(distanceTraveled, date: NSDate())
    }

managerに戻ってsaveDistance()メソッドを作成し、まずHealthKitにランニング距離と歩行歩数を書きたいことを知らせる必要があります.次に、計量単位をマイルに変えてエンティティに値を割り当てます.HealthKitのsaveObject()メソッドは、ユーザの健康データを書き込む.

    
    func saveDistance(distanceRecorded: Double, date: NSDate ) {
                
        //  
        let distanceType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)
        
        //  
        let distanceQuantity = HKQuantity(unit: HKUnit.mileUnit(), doubleValue: distanceRecorded)

        //   Quantity Sample。
        let distance = HKQuantitySample(type: distanceType!, quantity: distanceQuantity, startDate: date, endDate: date)
        
        //  ,  HealthKit
        healthKitStore.saveObject(distance, withCompletion: { (success, error) -> Void in
            if( error != nil ) {
                print(error)
            } else {
                print("The distance has been recorded! Better go check!")
            }
        })
    }

健康的なアプリケーションを開くと、記録されたデータはWalking+Running Distanceに含まれます.具体的な記録を見ることができます:Health Data tab>Fitness>Walking+Running Distance>Show All Data.私たちのデータはこのリストにあります.いずれかの行をクリックすると、私たちのアイコンが表示されます(まだ空いています).もう一度この行をクリックすると、すべての詳細が表示されます.
OneHourWalkerがあれば、世界中のiOSユーザーの健康に貢献することができます.しかし、これはただの始まりです.HealthKitは無限の可能性がある.
もちろん、ユーザーにすべての追跡情報を表示させることは非常に役立ち、毎日、毎週、または任意の時間のデータを比較して、自分の動力を与えることができます.しかし、本当に価値があるのは、開発者が無数の新しい、創造力のある、面白い方法でデータを得ることができることです.
また、HealthKitアプリのテストはとても面白いです!
ここは私たちの最終バージョンのOneHourWalkerです.
本文はSwiftGG翻訳グループから翻訳して、すでに作者の翻訳の授権を得て、最新の文章は訪問して下さいhttp://swift.gg.