HealthKit為iPhone和Apple Watch上的健康和健身數(shù)據(jù)提供了一個中央存儲庫樟蠕。在用戶的許可下贮聂,應(yīng)用程序與HealthKit商店通信靠柑,以訪問和共享這些數(shù)據(jù)
關(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ù)): 這些記錄表示通常不會更改的項吝羞,例如用戶的生日兰伤、血型、生物性別和皮膚類型钧排《厍唬可以使用
dateOfBirthWithError:
、bloodTypeWithError:
恨溜、biologicalSexWithError
:和fitzpatrickSkinTypeWithError:
方法直接從HealthKit讀取該數(shù)據(jù)符衔。應(yīng)用程序無法保存特征數(shù)據(jù)。用戶必須使用Health App輸入或修改這些數(shù)據(jù)糟袁。Sample data(樣本數(shù)據(jù)): 用戶的大多數(shù)健康數(shù)據(jù)存儲在表示特定時間點數(shù)據(jù)的sample中判族。所有sample類都是HKSample類的子類,它是HKObject類的子類项戴。
Workout data(訓(xùn)練數(shù)據(jù)): 有關(guā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
實例用于臨時存儲已從HealthKit存儲中刪除的項目的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有助于擴展HealthKit對象類型谍珊,將特定App的數(shù)據(jù)添加到條目中治宣。
Source Revision: 樣本的來源。 來源可以是直接將數(shù)據(jù)保存到HealthKit或App的設(shè)備砌滞。 當(dāng)保存對象到HealthKit時侮邀,HealthKit會自動記錄每個對象的來源和版本。 此屬性僅適用于從Health商店檢索到的對象贝润。
Device: 生成此樣本中存儲數(shù)據(jù)的硬件設(shè)備绊茧。
HKSample
類是HKObject
的子類。 樣本對象表示特定時間點的數(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的完成處理都在私有后臺隊列上執(zhí)行绎速。 在更新用戶界面或修改只應(yīng)由主線程觸及的任何其他資源之前皮获,通常需要將此數(shù)據(jù)分發(fā)回主隊列。
設(shè)置HealthKit
在使用HealthKit之前纹冤,必須執(zhí)行以下步驟:
- 在您的應(yīng)用中啟用HealthKit洒宝。
- 確保當(dāng)前設(shè)備上的HealthKit可用购公。
- 創(chuàng)建應(yīng)用程序的HealthKit商店。
- 請求讀取和共享數(shù)據(jù)的權(quán)限雁歌。
開啟HealthKit
在使用HealthKit之前宏浩,必須為應(yīng)用添加HealthKit功能。 在Xcode中靠瞎,選擇項目并打開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)開啟,實例化一個HKHealthStore
對象:
let healthStore = HKHealthStore()
每個App只需要一個HealthKit Store何吝,它是long-lived 對象溉委。
請求讀取和共享數(shù)據(jù)的權(quán)限
為了保護用戶的隱私,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
錯誤指巡。
為了保護用戶隱私淑履,我們的App將不會知道用戶是否授權(quán)或者拒絕讀取HealthKit的權(quán)限。如果用戶拒絕了藻雪,那在從HealthKit中查詢數(shù)據(jù)時秘噪,將只會返回我們自己的App成功保存到HealthKit Store的樣本數(shù)據(jù)。
指定所需的臨床記錄類型
如果App需要訪問特定的臨床記錄數(shù)據(jù)才能正常運行勉耀,在info.plist文件中添加NSHealthRequiredReadAuthorizationTypeIdentifiers
key指煎,該key定義了app必須擁有讀取權(quán)限的數(shù)據(jù)類型蹋偏。
保存數(shù)據(jù)到HealthKit
我們的App可以創(chuàng)建新的樣本,并將其保存到HealthKit Store至壤。盡管所有的樣本類型都遵守相似的過程威始,但每種類型都有自己的變體:
查找數(shù)據(jù)的類型標(biāo)識符。比如像街,要記錄用戶的體重黎棠,使用
HKQuantityTypeIdentifierBodyMass
類型標(biāo)識符,有關(guān)類型標(biāo)識符的完整列表宅广,可以查看Data Types使用
HKObjectType
類的方法創(chuàng)建正確的對象類型葫掉。比如,要保存用戶的體重跟狱,需要使用quantityTypeForIdentifier:
方法來創(chuàng)建HKQuantityType
對象俭厚。方法列表可以參閱HKObjectType使用對象類型實例化相匹配的
HKSample
子類對象使用
saveObject:withCompletion:
方法將對象保存到HealthKit Store
每個HKSample
子類都有自己的便捷方法來實例化對象,
對于數(shù)量樣本驶臊,創(chuàng)建HKQuantity
類的實例挪挤。數(shù)量的單位必須與類型標(biāo)識符文檔中描述的單位想對應(yīng)。比如关翎,HKQuantityTypeIdentifierHeight
聲明長度單位扛门,因此,數(shù)量必須使用厘米纵寝,米论寨,英尺或英寸或者其他兼容的單位∷睿可以參閱HKQuantitySample
對于類別樣本(category samples),樣本的值必須與類型標(biāo)識符文檔中聲明的枚舉相對應(yīng)葬凳。比如,HKCategoryTypeIdentifierSleepAnalysis
表明它使用HKCategoryValueSleepAnalysis 枚舉室奏。因此火焰,在創(chuàng)建此樣本時,必須從該枚舉中選值胧沫。更多信息可以參閱HKCategorySample
性能與細(xì)節(jié)
將數(shù)據(jù)保存到HealthKit Store時昌简,通常需要在使用單個樣本表示數(shù)據(jù)還是多個較小樣本之間拆分?jǐn)?shù)據(jù)做選擇。從性能角度來說绒怨,使用單個樣本更好纯赎,但是,多個樣本可以讓用戶更詳細(xì)的了解他們的數(shù)據(jù)如何隨時間變化南蹂。理想情況是能夠找到合適的樣本大小址否,以便為用戶提供有用的歷史數(shù)據(jù)。
在記錄鍛煉數(shù)據(jù)時,可以使用高頻數(shù)據(jù)(每分鐘一個樣本)來提供強度圖標(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ù)運行双仍,并且在對HealthKit Store進(jìn)行更改時更新我們的app
Queries(查詢)
Queries返回HealthKit Store中數(shù)據(jù)的當(dāng)前快照(snapshot)。所有的queries都是在匿名后臺隊列運行的迅栅。當(dāng)queries完成后殊校,他將在后臺隊列上處理結(jié)果晴玖。HealthKit提供了不同類型的queries來返回不同類型的數(shù)據(jù)。
Sample query(樣本查詢): 這是一個通用查詢,使用樣本查詢來訪問任意類型的樣本數(shù)據(jù)烫映。當(dāng)需要對結(jié)果進(jìn)行排序趴梢,或者限制返回的樣本數(shù)量時,樣本查詢非常有用秀睛。更多的可以查詢HKSampleQuery
Anchored object query(錨定對象查詢): 使用此查詢可以搜索已經(jīng)添加到HealthKit Store尔当,或者從其刪除的item。第一次運行錨定查詢時,將返回當(dāng)前Store中所有匹配的樣本椭迎。在后續(xù)運行中锐帜,將只返回自上次運行以來添加或刪除的item。更多信息可以參閱HKAnchoredObjectQuery
Statistics query(統(tǒng)計查詢): 使用此查詢對匹配的樣本集合進(jìn)行統(tǒng)計計算畜号〗裳郑可以使用統(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 會在匿名后臺隊列持續(xù)運行鳞芙,并在對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ù)運行负乡,在匹配的樣本被添加到或從Store中刪除時提供更新。不像觀察者查詢脊凰,這些更新包含了已添加或者已刪除的項目列表抖棘。但是,錨定對象查詢無法注冊為后臺提交。更多信息可以查閱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
表示包含簡短列表中選項的樣本(例如睡眠分析)。HKCorrelationType
表示包含多個數(shù)量或類別樣本的復(fù)雜樣本(例如巩剖,包含多個營養(yǎng)樣本的食物樣本)HKWorkoutType
代表鍛煉及其相關(guān)數(shù)據(jù)铝穷。其他對象類型(例如,
HKActivitySummaryType佳魔、HKDocumentType
和HKSeriesType
)表示其他專門的數(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
子類都在指定的時間記錄信息榆苞。如果sample
的startDate
和endDate
屬性相同霞捡,則樣本表示時間點坐漏。如果endDate
在startDate
之后,則樣本表示一個時間間隔碧信。
HealthKit使用不同的HKSample
子類來存儲不同類型的數(shù)據(jù):
HKQuantitySample
(數(shù)量樣本) 對象存儲quantity
-一個數(shù)值和單位赊琳。大部分HealthKit數(shù)據(jù)類型使用數(shù)量樣本。比如音婶,身高慨畸,心率以及飲食能量消耗都適用數(shù)量樣本莱坎。HKCategorySample
對象存儲從簡短列表中選擇的單個選項衣式。例如睡眠數(shù)據(jù)(用戶可以躺在床上,睡著或者醒著)。HKCorrelation
樣本將兩個或者多個樣本合并為單個值碴卧。比如弱卡,使用該樣本表示食物和血壓。食物樣本包含任意數(shù)量的nutrition
(營養(yǎng))樣本住册,而血壓樣本包含systolic
(心臟收縮)和diastolic
(心臟舒張)樣本HealthKit還使用其他
Sample
子類來表示更專業(yè)的數(shù)據(jù)類型婶博。 例如,HKCDADocumentSample
荧飞,HKWorkoutRoute
和HKWorkout
凡人。
文章來源:https://developer.apple.com/documentation/healthkit?language=objc