天天看點

HealthKit教程 Swift版:鍛煉資訊

作者:Ernesto García 譯者:Mr_cyz )

歡迎回到我們的HealthKit系列教程!

在我們系列教程的​​第一篇​​(​​中譯版​​)中,你已經學到了使用HealthKit開發的基礎:讀寫資料。

在這第二篇,同時也是最後一篇中,你将會學到怎麼樣處理一種更複雜的資料類型:鍛煉與健身的資訊(Workout)。

這篇教程從上一篇教程結束的地方開始,是以如果你還沒有上一篇中完成的工程,你可以從​​這裡下載下傳​​。

單從身體方面來說,一個人的鍛煉與健身資訊由一段時間内做過的身體素質鍛煉組成。而再加上數字化的方面來看,你可以通過下面的這些基本屬性來得到一條鍛煉資訊:

運動的種類。例如:跑步、騎行、冰壺等

距離

起止時間

持續時間

運動時消耗的能量。

數字化的領域就是指的HealthKit了,一條鍛煉資訊就是一個其他類型的資料采樣資訊(samples)的容器。例如,你可以添加一組資料,來表示在你運動時的心率。如果你打算做一款健康類型的app,那麼這将是一個功能強大的特性。

在該工程中,你将會存儲跑步鍛煉時的資訊,當然你也可以很容易地改變活動的種類來表示其他類型的鍛煉資訊。

我們的起始項目中已經包含了一個視圖控制器,來為你提供檢視健康資訊的入口。導航到Workouts欄然後點選+按鈕你就能看到了。

HealthKit教程 Swift版:鍛煉資訊

當你停止運動時,會在該頁面收集資訊并且展示到Workouts視圖控制器中。你需要使用這些資訊來建立一條健康資訊。

首先,你将建立一個方法來儲存跑步時的資訊。打開HealthManager.swift,添加如下方法:

這段代碼做了什麼呢?讓我們一行一行地分析:

與你之前建立BMI類型的身體素質資訊一樣,建立兩個身體素質類型的對象,分别設定為距離和能量類型,注意使用double類型的資料以及選擇合适的機關。

使 用起止時間、持續時間以及你剛剛建立好的代表距離和消耗的能量的身體素質資訊來建立一個HKWorkOut對象,然後通過調用HKHealthKit Store的saveObject方法來将健康資訊儲存到Store中,結果資訊或者是錯誤資訊将傳到completion回調中。

現在你需要在Workouts視圖控制器中調用該方法,打開WorkoutsTableViewController.swift然後找到unwindToSegue()方法,當你在新的Workout界面按下Done的時候就會調用該方法。

将下面這一行:

替換為:

首先,建立一個合适的機關對象,使用者通過分段控件(segment control)設定distanceUnit的值,進而選擇距離機關的類型。這段代碼檢查distanceUnit的值來決定使用合适的HKUnit。

建立完機關之後調用saveRunningWorkoutMethod()方法來儲存這些健康資訊,包括開始日期、結束日期、持續時間以及能量消耗。

編譯并運作,點選 + 按鈕,像下面視圖中展示的那樣填入資料。

HealthKit教程 Swift版:鍛煉資訊

哇!26.2英裡(42.195千米),而且是兩小時零一分鐘之内,我想你剛剛在編碼的過程中打破了馬拉松世界記錄。你真是個天才!

完成之後點選Done,如果一切順利,你将在Xcode的控制台中看到如下資訊:

太棒了!你的健康資訊已經成功地被儲存到HealthKit Store中了,如果你想的話你可以重複剛才的操作來添加更多的健康資訊。

如果你運作你的應用,然後進入Workouts視圖控制器,你不會看到任何之前你在視圖中建立好的健康資訊。

你需要加入一些代碼來讀取并且展示這些資訊。為了能夠讀取到這些資訊,你需要建立一個HKSampleQuery對象,然後執行這個查詢來擷取資料。

這與之前讀取身高和體重的代碼将會非常類似,為什麼試着自己寫一下呢?

在HealthManager.swift中建立一個方法,利用HKWorkoutActivityType類型來查詢健康資訊,将結果按照起始日期降序的順序排好序,在completion回調中擷取傳回結果。使用如下方法聲明:

内部實作:readRunningWorkOuts的實作:

打開HealthManager.swift然後添加這個方法:

這段代碼與你之前讀身高和體重的代碼非常類似:

首 先建立一個謂詞對象,HKQuery提供了一個方法:predicateForWorkoutsWithWorkoutActivityType()來創 建查詢鍛煉資訊用到的謂詞。通過使用HKWorkoutActivityType.Running參數來指定你希望查詢的是跑步類型的鍛煉資訊。如果你想 查詢其他類型的鍛煉資訊,例如騎行、遊泳,你隻需要在建立該謂詞的時候改變查詢類型即可。

建立一個排序辨別符來讓結果資訊按照日期降序排列。

建立HKSampleQuery對象,調用executeQuery()方法來獲得結果。

你需要将健康資訊展示到清單中,是以你要調用該方法并實作UITableView的資料源協定,是以,接下來打開WorkoutsTableViewController.swift。

你需要在該類中建立一個數組類型的屬性來儲存所有的健康資訊,将這一行代碼添加到WorkoutsTableViewController頂部聲明其他屬性的附近:

然後,添加該方法,作用是當視圖剛剛出現時讀取健康資訊:

這裡調用了你剛剛建立好的方法readWorkouts。當收到結果後,将結果儲存到workouts中,然後在主線程中重新整理清單資料。

現在,你需要添加清單的資料源協定中的方法,在WorkoutsTableViewController中添加tableView:numberOfRowsInSection方法的實作:

這很直接明了,當清單詢問有多少行時,你隻需要傳回你從Store中讀到的健康資訊的數量即可。

現在是時候填充清單的cell了,你需要實作在清單的資料源協定中的方法tableView:cellForRowAtIndexPath,将如下代碼添加到WorkoutsTableViewController類中:

解釋一下上面的代碼:

這段代碼獲得目前這一行的健康資訊,然後将起始日期格式化并展示在cell中的text lable上。為了将日期格式化,這裡使用了之前在初始工程中為你建立好的NSDateFormatter類。

通 過距離和消耗的能量來定義展示在detail label中的字元串。距離資訊以英裡或者千米的形式展示出來,這取決于使用者的選擇(被儲存在distanceUnit屬性中)。擷取距離的double 類型的值,然後基于該屬性的值傳入一個合适的距離機關。接下來,使用NSDistanceFormatter類,傳入合适的機關,調用 stringFromValue:unit方法,将距離資訊格式化為本地字元串。對于該條健康資訊的持續時間,使用一個 NSDateComponentsFormatter類對象。所有這些格式轉換器都是在初始工程中為你預先建立好的。

使用NSEnergyFormatter将消耗的能量也轉換為字元串,該字元串最終将被展示到detail label中。

編譯并運作該app,導航到Workouts頁面,現在你應該能在清單中看到之前儲存好的健康資訊了。

HealthKit教程 Swift版:鍛煉資訊

酷!你已經如期将所有的健康資訊展示出來了。現在,點選分段控件,檢驗一下,距離以英裡或以千米為機關來展示,取決于你的選擇。

如果你打開Health應用,你不會在任何地方找到這些資訊,它就是這樣設計的,因為Health應用隻展示資料采樣資訊,并不會展示我們的健康資訊。

然而,你是可以讓使用者看到這些關于健康的資訊的,你隻需要将它們與一些采樣資訊關聯起來即可。一款健康管家應用如果不帶有健康與鍛煉的資訊,就好比一教練機沒有警報裝置一樣。是以你應該将這些資料結合起來。

作為最後一步,你将把距離和消耗的能量這些采樣資訊添加到健康資訊中。

打開HealthManager.swift然後前往saveRunningWorkout(),在成功執行的回調閉包中,将下面這兩行:

到現在,你可能對這些代碼已經非常熟悉了,甚至可能到了你會認為你在做重複的事情的地步了。但是為了讓這些更加清晰,這裡做一下解釋:

第 一步中,建立了兩個quantity sample類型的對象,一個用DistanceWalkingRunning類型來代表跑步的距離。另一個用ActiveEnergyBurned類型 來代表消耗的卡路裡,然後調用HealthKit Store的方法addsamples:ToWorkout将這兩個資料添加到健康資訊中。

編譯并運作該應用,添加一到兩條健康資訊,然後關掉應用。既然這些健康資訊已經和距離以及消耗的能量的資料關聯起來了,你就可以在Health應用中看到它們了。

打開Health應用,前往Health Data欄,在這裡選擇Fitness選項,然後選擇Walking+Running Distance或者Active Calories來檢查一下資料是否儲存到那裡了。你将會看到類似如下界面:

HealthKit教程 Swift版:鍛煉資訊

太棒了!現在你已經有獲得最重要的健康資訊并将其儲存到HealthKit Store中的能力了。

從​​這裡​​你可以下載下傳包含這篇教程中所有代碼的工程。

! 重要!:如果你想使用上面的示例工程,在使用HealthKit之前需要進行一些設定,因為該工程綁定了一個示例用Bundle ID,你需要将其修改為你自己的Bundle ID,選擇你的開發團隊,然後将Target欄中Capabilities菜單下的HealthKit的開關由OFF變為ON。

詳見上述“開始”部分和“授權與許可”部分。

但願本篇教程能夠就HealthKit的基礎概念給你一些對認識與了解,讓你明白怎麼樣在自己的應用中使用HealthKit。要了解更多關于HealthKit的相關知識,這裡有一些相關資源:

HealthKit Framework Reference

2014年Apple的WWDC視訊:關于HealthKit的App Store Review Guidelines,你應該確定你的應用遵守這些官方的Guidelines。

在浏覽過這些文檔和視訊之後,你應該準備好前往HealthKit更深入的方面,然後對本篇的這個應用做一些改善。例如,你可以添加一些新的類型的資料采樣

資訊或者是健康資訊,使用HKStatisticsQuery計算統計結果,或者通過HKObserverQuery來觀察Store中資訊的改變。

我希望你能喜歡這篇教程,和以前一樣,如果你有任何問題或者評論,請參與下方的讨論!