HealthKit的簡單實用
HealthKit框架旨在以壹種有意義的方式在應用程序之間***享數據。框架將數據和單元的類型限制在壹個預定義的列表中,確保所有應用程序都理解數據的含義以及如何使用數據。開發人員不能創建自定義數據類型或單元。相反,HealthKit提供了多種數據類型和單元。
此外,框架使用大量子類,產生類似類的深層層次結構。通常,這些類之間有細微但重要的區別。例如,HKQuantitySample對象用於存儲帶有數值的數據,而HKCategorySample對象用於存儲從枚舉中選擇的值。
HealthKit保存了多種數據類型:
HKObject 類是所有 HealthKit 樣本類型的父類。 所有 HKObject 子類都是不可變的。 每個對象都具有以下屬性:
HKSample 類是 HKObject 的子類。 樣本對象表示特定時間點的數據,所有樣本對象都是 HKSample 類的子類。
HKSample 進壹步劃分為四個具體子類:
HealthKit存儲是線程安全的,大多數HealthKit對象是不可變的。 通常,可以在多線程環境中安全地使用HealthKit。
在使用HealthKit之前,必須執行以下步驟:
在使用HealthKit之前,必須為應用添加HealthKit功能。 在Xcode中,選擇項目並打開HealthKit功能
調用 isHealthDataAvailable 方法來確保HealthKit在用戶設備上是否可用。
在調用HealthKit其他方法之前先調用該方法。如果設備上沒有HealthKit(比如在iPad上),調用其他的方法會報 errorHealthDataUnavailable 錯誤;如果HealthKit受限制(比如,在企業環境中),調用其他方法會報 errorHealthDataRestricted 錯誤。
如果HealthKit可用且已經開啟,實例化壹個 HKHealthStore 對象:
每個App只需要壹個HealthKit Store,它是long-lived 對象。
為了保護用戶的隱私,HealthKit需要精細的授權。在嘗試保存和訪問數據之前,必須申請讀取和分享數據的權限。
此外,還需要在info.plist文件中設置兩個key:
如果用戶同意***享某種類型的數據,則可以創建該類型的樣本並將其保存到HealthKit Store中。但是,在保存任何數據之前,最好調用 authorizationStatusForType: 方法來檢查是否有該權限。如果還沒有申請過該權限,保存數據將會拋出 HKErrorAuthorizationNotDetermined 錯誤。如果用戶拒絕了該權限申請,嘗試保存數據將會拋出 HKErrorAuthorizationDenied 錯誤。
為了保護用戶隱私,我們的App將不會知道用戶是否授權或者拒絕讀取HealthKit的權限。如果用戶拒絕了,那在從HealthKit中查詢數據時,將只會返回我們自己的App成功保存到HealthKit Store的樣本數據。
如果App需要訪問特定的臨床記錄數據才能正常運行,在info.plist文件中添加 NSHealthRequiredReadAuthorizationTypeIdentifiers key,該key定義了app必須擁有讀取權限的數據類型。
我們的App可以創建新的樣本,並將其保存到HealthKit Store。盡管所有的樣本類型都遵守相似的過程,但每種類型都有自己的變體:
每個 HKSample 子類都有自己的便捷方法來實例化對象,
對於數量樣本,創建 HKQuantity 類的實例。數量的單位必須與類型標識符文檔中描述的單位想對應。比如, HKQuantityTypeIdentifierHeight 聲明長度單位,因此,數量必須使用厘米,米,英尺或英寸或者其他兼容的單位。可以參閱 HKQuantitySample
對於類別樣本(category samples),樣本的值必須與類型標識符文檔中聲明的枚舉相對應。比如, HKCategoryTypeIdentifierSleepAnalysis 表明它使用 HKCategoryValueSleepAnalysis 枚舉。因此,在創建此樣本時,必須從該枚舉中選值。更多信息可以參閱 HKCategorySample
將數據保存到HealthKit Store時,通常需要在使用單個樣本表示數據還是多個較小樣本之間拆分數據做選擇。從性能角度來說,使用單個樣本更好,但是,多個樣本可以讓用戶更詳細的了解他們的數據如何隨時間變化。理想情況是能夠找到合適的樣本大小,以便為用戶提供有用的歷史數據。
在記錄鍛煉數據時,可以使用高頻數據(每分鐘壹個樣本)來提供強度圖標,並以其他方式分析用戶在鍛煉中的表現。對於不太密集的活動,比如每日步數,壹小時或者更短時間的樣本通常更好壹些。
App應該避免保存24小時或更長時間的樣本。
健康App允許用戶訪問其HealthKit Store中的所有數據。用戶可以查看、添加、刪除和管理他們的數據。
具體來說,用戶可以
因此,健康App對開發HealthKit有壹些重要影響。用戶可以在我們的app之外修改數據,甚至修改我們app的讀寫權限,因此,我們的應用應該始終查詢HealthKit Store中的當前數據
其次,我們也可以在健康App中查看我們的app保存到Health Store的數據。這在早期測試中很有用。
有三種主要的方法來從HealthKit Store讀取數據
Queries返回HealthKit Store中數據的當前快照(snapshot)。所有的queries都是在匿名後臺隊列運行的。當queries完成後,他將在後臺隊列上處理結果。HealthKit提供了不同類型的queries來返回不同類型的數據。
Long-running queries 會在匿名後臺隊列持續運行,並在對HealthKit Store進行更改時更新我們的app。另外,observer queries可以註冊為後臺交付。這樣,當發生更新時,HealthKit就會在後臺喚醒我們的app。
HealthKit 提供以下的long-running queries:
HealthKit使用 HKObjectType 的子類來標識存儲在HealthKit中數據的不同類型:
創建類型對象,需要調用相應的 HKObjectType 類方法,並傳入所需的類型標識。
可以使用生成的對象類型來請求訪問數據的權限,將新數據保存到HealthKit存儲中或從HealthKit存儲中讀取數據。
大部分健康和健身數據是使用 HKSample 的子類來保存到HealthKit Store中。所有的 Sample 子類都在指定的時間記錄信息。如果 sample 的 startDate 和 endDate 屬性相同,則樣本表示時間點。如果 endDate 在 startDate 之後,則樣本表示壹個時間間隔。
HealthKit使用不同的 HKSample 子類來存儲不同類型的數據: