HealthKit的簡單實(shí)用

HealthKit為iPhone和Apple Watch上的健康和健身數(shù)據(jù)提供了一個中央存儲庫。在用戶的許可下,應(yīng)用程序與HealthKit商店通信,以訪問和共享這些數(shù)據(jù)

image.png

關(guān)于HealthKit Framework

HealthKit框架旨在以一種有意義的方式在應(yīng)用程序之間共享數(shù)據(jù)??蚣軐?shù)據(jù)和單元的類型限制在一個預(yù)定義的列表中,確保所有應(yīng)用程序都理解數(shù)據(jù)的含義以及如何使用數(shù)據(jù)。開發(fā)人員不能創(chuàng)建自定義數(shù)據(jù)類型或單元。相反,HealthKit提供了多種數(shù)據(jù)類型和單元。

此外,框架使用大量子類,產(chǎn)生類似類的深層層次結(jié)構(gòu)。通常,這些類之間有細(xì)微但重要的區(qū)別。例如,HKQuantitySample對象用于存儲帶有數(shù)值的數(shù)據(jù),而HKCategorySample對象用于存儲從枚舉中選擇的值。

HealthKit Data

HealthKit保存了多種數(shù)據(jù)類型:

  • Characteristic data(特征數(shù)據(jù)): 這些記錄表示通常不會更改的項(xiàng),例如用戶的生日、血型、生物性別和皮膚類型。可以使用dateOfBirthWithError:、bloodTypeWithError:、biologicalSexWithError:和fitzpatrickSkinTypeWithError:方法直接從HealthKit讀取該數(shù)據(jù)。應(yīng)用程序無法保存特征數(shù)據(jù)。用戶必須使用Health App輸入或修改這些數(shù)據(jù)。

  • Sample data(樣本數(shù)據(jù)): 用戶的大多數(shù)健康數(shù)據(jù)存儲在表示特定時間點(diǎn)數(shù)據(jù)的sample中。所有sample類都是HKSample類的子類,它是HKObject類的子類。

  • Workout data(訓(xùn)練數(shù)據(jù)): 有關(guān)健身及運(yùn)動的資料以HKWorkout
    的形式儲存。雖然HKWorkout是HKSample的一個子類,但是它的行為與其他sample子類有些不同。

  • Source data(源數(shù)據(jù)): 每個樣本都存儲有關(guān)其來源的信息。 HKSourceRevision對象包含有關(guān)App或設(shè)備的信息。 HKDevice對象包含生成相關(guān)數(shù)據(jù)的硬件設(shè)備的信息。

  • Deleted objects(刪除對象): HKDeletedObject實(shí)例用于臨時存儲已從HealthKit存儲中刪除的項(xiàng)目的UUID。 當(dāng)用戶或其他應(yīng)用程序刪除對象時,可以使用Deleted objects進(jìn)行響應(yīng)。

對象和樣本的屬性

HKObject類是所有HealthKit樣本類型的父類。 所有HKObject子類都是不可變的。 每個對象都具有以下屬性:

  • UUID: 唯一標(biāo)識符。

  • Metadata: 包含有關(guān)條目的其他信息的字典。 元數(shù)據(jù)可以包含預(yù)定義和自定義的key。 預(yù)定義的key有助于在App之間共享數(shù)據(jù)。 自定義key有助于擴(kuò)展HealthKit對象類型,將特定App的數(shù)據(jù)添加到條目中。

  • Source Revision: 樣本的來源。 來源可以是直接將數(shù)據(jù)保存到HealthKit或App的設(shè)備。 當(dāng)保存對象到HealthKit時,HealthKit會自動記錄每個對象的來源和版本。 此屬性僅適用于從Health商店檢索到的對象。

  • Device: 生成此樣本中存儲數(shù)據(jù)的硬件設(shè)備。

HKSample類是HKObject的子類。 樣本對象表示特定時間點(diǎn)的數(shù)據(jù),所有樣本對象都是HKSample類的子類。

HKSample進(jìn)一步劃分為四個具體子類:

  • Category samples(分類樣本): 可以分類為有限類別的數(shù)據(jù)。

  • Quantity samples(數(shù)量樣本): 可以存儲為數(shù)值的數(shù)據(jù)。 數(shù)量樣本是HealthKit中最常見的數(shù)據(jù)類型。 包括用戶的身高和體重,以及其他數(shù)據(jù),如步數(shù),用戶的體溫和脈搏率

  • Correlations(相關(guān)性) 包含一個或多個樣本的復(fù)合數(shù)據(jù)。 在iOS 8.0中,HealthKit使用相關(guān)性來表示食物和血壓。 在創(chuàng)建食物或血壓數(shù)據(jù)時,應(yīng)始終使用相關(guān)性。

  • Workouts(鍛煉): 表示身體活動的數(shù)據(jù),如跑步,游泳,甚至比賽。 Workouts通常具有type, duration, distance, energy burned屬性

線程

HealthKit存儲是線程安全的,大多數(shù)HealthKit對象是不可變的。 通常,可以在多線程環(huán)境中安全地使用HealthKit。

所有HealthKit API的完成處理都在私有后臺隊(duì)列上執(zhí)行。 在更新用戶界面或修改只應(yīng)由主線程觸及的任何其他資源之前,通常需要將此數(shù)據(jù)分發(fā)回主隊(duì)列。

設(shè)置HealthKit

在使用HealthKit之前,必須執(zhí)行以下步驟:

  1. 在您的應(yīng)用中啟用HealthKit。
  2. 確保當(dāng)前設(shè)備上的HealthKit可用。
  3. 創(chuàng)建應(yīng)用程序的HealthKit商店。
  4. 請求讀取和共享數(shù)據(jù)的權(quán)限。

開啟HealthKit

在使用HealthKit之前,必須為應(yīng)用添加HealthKit功能。 在Xcode中,選擇項(xiàng)目并打開HealthKit功能

開啟HealthKit

確保HealthKit的可用性

調(diào)用isHealthDataAvailable方法來確保HealthKit在用戶設(shè)備上是否可用。

if HKHealthStore.isHealthDataAvailable() {
    // Add code to use HealthKit here.
}

在調(diào)用HealthKit其他方法之前先調(diào)用該方法。如果設(shè)備上沒有HealthKit(比如在iPad上),調(diào)用其他的方法會報errorHealthDataUnavailable錯誤;如果HealthKit受限制(比如,在企業(yè)環(huán)境中),調(diào)用其他方法會報errorHealthDataRestricted錯誤。

創(chuàng)建HealthKit Store

如果HealthKit可用且已經(jīng)開啟,實(shí)例化一個HKHealthStore對象:

let healthStore = HKHealthStore()

每個App只需要一個HealthKit Store,它是long-lived 對象。

請求讀取和共享數(shù)據(jù)的權(quán)限

為了保護(hù)用戶的隱私,HealthKit需要精細(xì)的授權(quán)。在嘗試保存和訪問數(shù)據(jù)之前,必須申請讀取和分享數(shù)據(jù)的權(quán)限。

注意: 用戶可以隨時在設(shè)置或健康A(chǔ)pp中修改你的App的權(quán)限,你的App將會顯示在健康A(chǔ)pp的數(shù)據(jù)來源頁面。

此外,還需要在info.plist文件中設(shè)置兩個key:

  • NSHealthShareUsageDescription:讀取數(shù)據(jù)的描述
  • NSHealthUpdateUsageDescription:寫入數(shù)據(jù)的描述

如果用戶同意共享某種類型的數(shù)據(jù),則可以創(chuàng)建該類型的樣本并將其保存到HealthKit Store中。但是,在保存任何數(shù)據(jù)之前,最好調(diào)用authorizationStatusForType:方法來檢查是否有該權(quán)限。如果還沒有申請過該權(quán)限,保存數(shù)據(jù)將會拋出HKErrorAuthorizationNotDetermined錯誤。如果用戶拒絕了該權(quán)限申請,嘗試保存數(shù)據(jù)將會拋出HKErrorAuthorizationDenied錯誤。

為了保護(hù)用戶隱私,我們的App將不會知道用戶是否授權(quán)或者拒絕讀取HealthKit的權(quán)限。如果用戶拒絕了,那在從HealthKit中查詢數(shù)據(jù)時,將只會返回我們自己的App成功保存到HealthKit Store的樣本數(shù)據(jù)。

指定所需的臨床記錄類型

如果App需要訪問特定的臨床記錄數(shù)據(jù)才能正常運(yùn)行,在info.plist文件中添加NSHealthRequiredReadAuthorizationTypeIdentifiers key,該key定義了app必須擁有讀取權(quán)限的數(shù)據(jù)類型。

保存數(shù)據(jù)到HealthKit

我們的App可以創(chuàng)建新的樣本,并將其保存到HealthKit Store。盡管所有的樣本類型都遵守相似的過程,但每種類型都有自己的變體:

  1. 查找數(shù)據(jù)的類型標(biāo)識符。比如,要記錄用戶的體重,使用HKQuantityTypeIdentifierBodyMass類型標(biāo)識符,有關(guān)類型標(biāo)識符的完整列表,可以查看Data Types

  2. 使用HKObjectType類的方法創(chuàng)建正確的對象類型。比如,要保存用戶的體重,需要使用quantityTypeForIdentifier:方法來創(chuàng)建HKQuantityType對象。方法列表可以參閱HKObjectType

  3. 使用對象類型實(shí)例化相匹配的HKSample子類對象

  4. 使用saveObject:withCompletion:方法將對象保存到HealthKit Store

每個HKSample子類都有自己的便捷方法來實(shí)例化對象,

數(shù)量樣本

對于數(shù)量樣本,創(chuàng)建HKQuantity類的實(shí)例。數(shù)量的單位必須與類型標(biāo)識符文檔中描述的單位想對應(yīng)。比如,HKQuantityTypeIdentifierHeight聲明長度單位,因此,數(shù)量必須使用厘米,米,英尺或英寸或者其他兼容的單位。可以參閱HKQuantitySample

類別樣本

對于類別樣本(category samples),樣本的值必須與類型標(biāo)識符文檔中聲明的枚舉相對應(yīng)。比如,HKCategoryTypeIdentifierSleepAnalysis表明它使用HKCategoryValueSleepAnalysis 枚舉。因此,在創(chuàng)建此樣本時,必須從該枚舉中選值。更多信息可以參閱HKCategorySample

相關(guān)性

性能與細(xì)節(jié)

將數(shù)據(jù)保存到HealthKit Store時,通常需要在使用單個樣本表示數(shù)據(jù)還是多個較小樣本之間拆分?jǐn)?shù)據(jù)做選擇。從性能角度來說,使用單個樣本更好,但是,多個樣本可以讓用戶更詳細(xì)的了解他們的數(shù)據(jù)如何隨時間變化。理想情況是能夠找到合適的樣本大小,以便為用戶提供有用的歷史數(shù)據(jù)。

在記錄鍛煉數(shù)據(jù)時,可以使用高頻數(shù)據(jù)(每分鐘一個樣本)來提供強(qiáng)度圖標(biāo),并以其他方式分析用戶在鍛煉中的表現(xiàn)。對于不太密集的活動,比如每日步數(shù),一小時或者更短時間的樣本通常更好一些。

App應(yīng)該避免保存24小時或更長時間的樣本。

使用健康A(chǔ)pp中的數(shù)據(jù)

健康A(chǔ)pp允許用戶訪問其HealthKit Store中的所有數(shù)據(jù)。用戶可以查看、添加、刪除和管理他們的數(shù)據(jù)。

具體來說,用戶可以

  • 查看包含他們當(dāng)前健康數(shù)據(jù)的儀表盤

  • 訪問所有存儲在HealthKit中的數(shù)據(jù)。用戶可以按類型、app或設(shè)備查看數(shù)據(jù)

  • 管理每個app訪問和讀取HealthKit Store的權(quán)限

因此,健康A(chǔ)pp對開發(fā)HealthKit有一些重要影響。用戶可以在我們的app之外修改數(shù)據(jù),甚至修改我們app的讀寫權(quán)限,因此,我們的應(yīng)用應(yīng)該始終查詢HealthKit Store中的當(dāng)前數(shù)據(jù)

其次,我們也可以在健康A(chǔ)pp中查看我們的app保存到Health Store的數(shù)據(jù)。這在早期測試中很有用。

從HealthKit讀取數(shù)據(jù)

有三種主要的方法來從HealthKit Store讀取數(shù)據(jù)

  • 直接調(diào)用方法。 HealthKit store提供了直接讀取特征(characteristic)數(shù)據(jù)的方法。這些方法只能用來讀取特征數(shù)據(jù)。更多信息可以看下HKHealthStore

  • Queries(查詢) Queries返回從HealthKit Store請求的數(shù)據(jù)的當(dāng)前快照。

  • Long-running queries 這類查詢將在后臺持續(xù)運(yùn)行,并且在對HealthKit Store進(jìn)行更改時更新我們的app

Queries(查詢)

Queries返回HealthKit Store中數(shù)據(jù)的當(dāng)前快照(snapshot)。所有的queries都是在匿名后臺隊(duì)列運(yùn)行的。當(dāng)queries完成后,他將在后臺隊(duì)列上處理結(jié)果。HealthKit提供了不同類型的queries來返回不同類型的數(shù)據(jù)。

  • Sample query(樣本查詢): 這是一個通用查詢,使用樣本查詢來訪問任意類型的樣本數(shù)據(jù)。當(dāng)需要對結(jié)果進(jìn)行排序,或者限制返回的樣本數(shù)量時,樣本查詢非常有用。更多的可以查詢HKSampleQuery

  • Anchored object query(錨定對象查詢): 使用此查詢可以搜索已經(jīng)添加到HealthKit Store,或者從其刪除的item。第一次運(yùn)行錨定查詢時,將返回當(dāng)前Store中所有匹配的樣本。在后續(xù)運(yùn)行中,將只返回自上次運(yùn)行以來添加或刪除的item。更多信息可以參閱HKAnchoredObjectQuery

  • Statistics query(統(tǒng)計查詢): 使用此查詢對匹配的樣本集合進(jìn)行統(tǒng)計計算??梢允褂媒y(tǒng)計查詢來計算總和、最小值、最大值以及平均值。更多信息可以查閱HKStatisticsQuery

  • Statistics collection query(統(tǒng)計收集查詢): 使用此查詢可以在一系列多個固定長度的時間間隔內(nèi)執(zhí)行多個統(tǒng)計查詢。在創(chuàng)建圖形時會經(jīng)常用到這些。它們提供了一種簡單的方法來計算一些事情,比如每天消耗的卡路里總數(shù)或者每五分鐘的步數(shù)。更多信息可以查閱HKStatisticsCollectionQuery

  • Correlation query(相關(guān)查詢): 使用此查詢可以對correlation中的數(shù)據(jù)進(jìn)行復(fù)雜搜索。這些查詢可以包含存儲在correlation中的每個樣本類型的各個謂詞。更多可以查閱HKCorrelationQuery

  • Source query(來源查詢): 可以查詢匹配樣本的來源(app或者設(shè)備)。該查詢列出了保存特定樣本類型的所有來源。更多信息可以查閱HKSourceQuery

  • Activity summary query: 使用該查詢可以搜索用戶的活動概要信息。每個Activity summary對象包含了給定日期的用戶的活動總結(jié)??梢圆樵円惶旎蛘叨嗵斓臄?shù)據(jù)。更多信息可以查閱HKActivitySummaryQuery

  • Document query(檔案查詢): 使用此查詢來搜索健康檔案。更多信息可以查閱HKDocumentQuery

Long-Running Queries

Long-running queries 會在匿名后臺隊(duì)列持續(xù)運(yùn)行,并在對HealthKit Store進(jìn)行更改時更新我們的app。另外,observer queries可以注冊為后臺交付。這樣,當(dāng)發(fā)生更新時,HealthKit就會在后臺喚醒我們的app。

HealthKit 提供以下的long-running queries:

  • Observer query(觀察者查詢): 該查詢將監(jiān)視HealthKit Store,匹配到的樣本進(jìn)行更改時也會通知用戶。當(dāng)希望收到HealthKit Store的相關(guān)修改時可以使用觀察者查詢。更多信息可以查閱HKObserverQuery

  • Anchored object query(錨定對象查詢): 除了返回數(shù)據(jù)的當(dāng)前快照之外,錨定對象查詢還可以作為一個Long-running queries。如果啟用了該查詢,它將在后臺持續(xù)運(yùn)行,在匹配的樣本被添加到或從Store中刪除時提供更新。不像觀察者查詢,這些更新包含了已添加或者已刪除的項(xiàng)目列表。但是,錨定對象查詢無法注冊為后臺提交。更多信息可以查閱HKAnchoredObjectQuery

  • Statistics collection query 除了計算統(tǒng)計幾個的當(dāng)前快照外,該查詢還可以作為一種long-running query。如果將匹配的樣本添加到Store或者從中刪除,該查詢將會重新計算統(tǒng)計集合,并更新我們的app。Statistics collection queries 不能注冊為后臺提交。更多信息可以查閱HKStatisticsCollectionQuery

  • Activity summary query: 除了計算用戶活動的當(dāng)前快照之外,該查詢也可以作為一種 long-running query。如果用戶的活動概要數(shù)據(jù)改變,該查詢將會重新計算活動概要,并更新我們的app。Activity summary query也無法注冊為后臺提交。更多信息可以查閱HKActivitySummaryQuery

數(shù)據(jù)類型

HealthKit使用HKObjectType的子類來標(biāo)識存儲在HealthKit中數(shù)據(jù)的不同類型:

  • HKCharacteristicType 表示通常不會隨時間變化的數(shù)據(jù)(例如血型)。

  • HKQuantityType 表示包含數(shù)值的樣本(例如所消耗的卡路里)。

  • HKCategoryType 表示包含簡短列表中選項(xiàng)的樣本(例如睡眠分析)。

  • HKCorrelationType 表示包含多個數(shù)量或類別樣本的復(fù)雜樣本(例如,包含多個營養(yǎng)樣本的食物樣本)

  • HKWorkoutType 代表鍛煉及其相關(guān)數(shù)據(jù)。

  • 其他對象類型(例如,HKActivitySummaryType、HKDocumentTypeHKSeriesType)表示其他專門的數(shù)據(jù)類型

創(chuàng)建類型對象,需要調(diào)用相應(yīng)的HKObjectType類方法,并傳入所需的類型標(biāo)識。

let bloodType = HKObjectType.characteristicType(forIdentifier: .bloodType)

let caloriesConsumed = HKObjectType.quantityType(forIdentifier: .dietaryEnergyConsumed)

let sleepAnalysis = HKObjectType.categoryType(forIdentifier: .sleepAnalysis)

可以使用生成的對象類型來請求訪問數(shù)據(jù)的權(quán)限,將新數(shù)據(jù)保存到HealthKit存儲中或從HealthKit存儲中讀取數(shù)據(jù)。

Sample

大部分健康和健身數(shù)據(jù)是使用HKSample的子類來保存到HealthKit Store中。所有的Sample子類都在指定的時間記錄信息。如果samplestartDateendDate屬性相同,則樣本表示時間點(diǎn)。如果endDatestartDate之后,則樣本表示一個時間間隔。

HealthKit使用不同的HKSample子類來存儲不同類型的數(shù)據(jù):

  • HKQuantitySample(數(shù)量樣本) 對象存儲quantity-一個數(shù)值和單位。大部分HealthKit數(shù)據(jù)類型使用數(shù)量樣本。比如,身高,心率以及飲食能量消耗都適用數(shù)量樣本。

  • HKCategorySample 對象存儲從簡短列表中選擇的單個選項(xiàng)。例如睡眠數(shù)據(jù)(用戶可以躺在床上,睡著或者醒著)。

  • HKCorrelation 樣本將兩個或者多個樣本合并為單個值。比如,使用該樣本表示食物和血壓。食物樣本包含任意數(shù)量的nutrition(營養(yǎng))樣本,而血壓樣本包含systolic(心臟收縮)和diastolic(心臟舒張)樣本

  • HealthKit還使用其他Sample子類來表示更專業(yè)的數(shù)據(jù)類型。 例如,HKCDADocumentSample,HKWorkoutRouteHKWorkout


文章來源:https://developer.apple.com/documentation/healthkit?language=objc

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容