HealthKit
ios/framework
數(shù)據(jù)來源
HealthKit 中的數(shù)據(jù)來源主要有
Health and fitness devices
M7 motion coprocessor
健康數(shù)據(jù)被保存在叫 Health Store 的數(shù)據(jù)庫中,而且被加密了,可以使用 HKHealthStore
類來訪問。這個數(shù)據(jù)庫存在于 iPhone 和 Apple Watch 中,他倆會自動同步,但是 Apple Watch 中的數(shù)據(jù)有可能會被系統(tǒng)自動清除以節(jié)省空間
隱私問題
用戶可以控制 APP 可以訪問哪些數(shù)據(jù),但是 APP 自己不知道自己能訪問什么數(shù)據(jù)。APP 只能向用戶提出請求,用戶可以允許或拒絕 APP 的請求,APP 自己卻不知道用戶到底是允許還是拒絕了請求。比如用戶拒絕了APP 獲取血壓數(shù)據(jù)的請求,就算用戶的健康數(shù)據(jù)中有血壓數(shù)據(jù),對于 APP 來說,血壓數(shù)據(jù)是不存在的
關(guān)于使用 HealthKit 的注意事項
不要使用健康數(shù)據(jù)來打廣告
除非獲得了用戶的允許,不要將健康數(shù)據(jù)給第三方機構(gòu)
不能出售用戶的健康數(shù)據(jù)
用戶同意的話,你可以把健康數(shù)據(jù)提供給第三方機構(gòu)以用于醫(yī)學(xué)研究
你必須告訴用戶你用健康數(shù)據(jù)的目的
健康數(shù)據(jù)分類
Health Store 中存儲的健康數(shù)據(jù)分為下面幾類
Characteristic data:這通常是不會改變的數(shù)據(jù),包括用戶的出生日期、血型、性別等,你可以直接通過
HKHealthStore
的dateOfBirth()
等方法直接訪問Sample data:大部分的數(shù)據(jù)都是這個類型的
Source data:關(guān)于健康數(shù)據(jù)的來源的信息。
HKSourceRevision
和HKDevice
可以獲得健康數(shù)據(jù)的來源于哪個 app 或者設(shè)備Deleted objects:不懂
HKObject
是所有 Sample 類數(shù)據(jù)的 superclass。每個這樣的類都有下面的屬性
UUID
Metadata
Source Revision:Sample 數(shù)據(jù)的來源
Device:產(chǎn)生 Sample 數(shù)據(jù)的設(shè)備
所有的 Sample 數(shù)據(jù)都是 HKSample
的子類。他有下面的屬性
Type:表示數(shù)據(jù)類型,比如這是步數(shù)數(shù)據(jù)、睡眠數(shù)據(jù)
Start date:Sample 數(shù)據(jù)的起始時間
End date:Sample 數(shù)據(jù)的結(jié)束時間
Sample 還可以分為下面 4 種
Category samples:
HKCategorySample
Quantity samples:可以表示成數(shù)字的健康數(shù)據(jù),大多數(shù)的數(shù)據(jù)都是這個類型,
HKQuantitySample
Correlations:多個 Quantity samples 的組合數(shù)據(jù)。HealthKit 中的食物和血壓數(shù)據(jù)是這個類型的,
HKCorrelation
Workouts:健身數(shù)據(jù),
HKWorkout
使用 HealthKit
在 Xcode 中啟用 HealthKit
調(diào)用
HKHealthStore.isHealthDataAvailable()
來確定設(shè)備是否可以用健康數(shù)據(jù)如果可用,用
let healthStore = HKHealthStore()
獲得HealthStore
的實例。這個實例是 long lived 的,每個 app 只需要一個實例獲取使用健康數(shù)據(jù)的權(quán)限
在 Info.plist 中給出使用健康數(shù)據(jù)的理由
如果你沒有請求權(quán)限,那么請求數(shù)據(jù)會導(dǎo)致錯誤
errorAuthorizationNotDetermined
;如果請求被拒絕了,會導(dǎo)致錯誤errorAuthorizationDenied
向 HealthStore 中寫入和查詢數(shù)據(jù)
獲取健康數(shù)據(jù)
有 3 種獲取健康數(shù)據(jù)的方法
Direct method calls:這主要用于獲得 characteristic data,see
HKHealthStore
Queries:返回現(xiàn)在 HealthStore 中的數(shù)據(jù)的快照。它在另外一個 queue 中執(zhí)行查詢,提供一個 completion handler
Sample query:最常用的 query,所有的 sample data 都可以通過這個來獲得。可以對查詢的結(jié)果排序,對查詢的范圍進行限制。see
HKSampleQuery
Anchored object query:不太清楚,see
HKAnchoredObjectQuery
Statistics query:用于對查詢的結(jié)果進行統(tǒng)計,例如統(tǒng)計健康數(shù)據(jù)的總數(shù)、平均數(shù)等。see
HKStatisticsQuery
Statistics collection query:對定長時間內(nèi)的健康數(shù)據(jù)進行統(tǒng)計,比如每天消耗的卡路里數(shù)、每 5 分鐘內(nèi)走過的步數(shù)等。see
HKStatisticsCollectionQuery
Correlation query:進行與 correlation 相關(guān)的查詢,see
HKCorrelation
Source query:對健康數(shù)據(jù)的來源(app 或者設(shè)備)進行查詢,see
HKSourceQuery
Activity summary query:獲得對用戶的活動的 summary,可以是對一天或是對多天的 summary,see
HKActivitySummaryQuery
Document query:獲取 health documents,see
HKDocumentQuery
Long running queries:這是運行在 anonymous background queue 的查詢,當(dāng) HealthStore 的健康數(shù)據(jù)有更新、并且你也注冊了 background delivery,它就能喚醒你的 APP
Observer query:當(dāng) HealthStore 的健康數(shù)據(jù)有更新、并且你也注冊了 background delivery,它就能喚醒你的 APP,see
HKObserverQuery
Anchored object query:與上面的 Anchored object query 類似,可以運行在 anonymous background queue 中,但是不能注冊 background delivery,see
HKAnchoredObjectQuery
Statistics collection query:與上面的 Statistics collection query 類似,可以運行在 anonymous background queue 中,但是不能注冊 background delivery,see
HKStatisticsCollectionQuery
Activity summary query:與上面的 Activity summary query 類似,可以運行在 anonymous background queue 中,但是不能注冊 background delivery,see
HKActivitySummaryQuery
單位與數(shù)量
類 HKUnit
表示一種單位,包括公制單位和英氏單位。single unit 表示簡單的單位,如米、秒等;complex unit 表示由 single unit 組合而成的單位,如米每秒(m/s)等。更多的信息請看 HKUnit
類 HKQuantity
表示一次查詢的結(jié)果,它所給出的值會與它所使用的單位有關(guān),因此你可以非常方便的在不同單位之間轉(zhuǎn)換,see HKQuantity
線程
HealthStore 是線程安全的
數(shù)字簽名
不太清楚,主要是為了防止取出來的健康數(shù)據(jù)被修改