翻譯自HealthKit
Framwork
與其他應(yīng)用共享用戶的健康和健身數(shù)據(jù)桶错,同時(shí)保持用戶的隱私和對數(shù)據(jù)的控制。
概觀
HealthKit存儲來自iPhone和Apple Watch上的應(yīng)用程序的數(shù)據(jù)。它也直接與一些健康和健身設(shè)備部念。在iOS 8.0中错邦,系統(tǒng)可以自動保存兼容的藍(lán)牙LE心率監(jiān)視器的數(shù)據(jù)。如果有的話厦画,系統(tǒng)也可以自動從M7運(yùn)動協(xié)處理器導(dǎo)入活動數(shù)據(jù)。其他設(shè)備和數(shù)據(jù)源必須具有可以訪問數(shù)據(jù)并將其保存到HealthKit的配套應(yīng)用程序滥朱。
HealthKit將數(shù)據(jù)保存在稱為HealthKit存儲的加密數(shù)據(jù)庫中根暑。你可以使用這個(gè)類來訪問這個(gè)數(shù)據(jù)庫。iPhone和Apple Watch都有自己的HealthKit商店徙邻。Apple Watch和iPhone之間的健康數(shù)據(jù)同步; 但是排嫌,Apple Watch會定期清除舊數(shù)據(jù)以節(jié)省空間。使用此方法確定Apple Watch上最早的數(shù)據(jù)缰犁。earliestPermittedSampleDate()
HealthKit旨在管理來自各種來源的數(shù)據(jù)淳地,根據(jù)用戶的偏好自動合并來自不同來源的數(shù)據(jù)。應(yīng)用程序也可以訪問每個(gè)來源的原始數(shù)據(jù)帅容,自己合并數(shù)據(jù)颇象。
HealthKit提供了一個(gè)應(yīng)用程序來幫助管理用戶的健康數(shù)據(jù)。Health應(yīng)用程序充當(dāng)HealthKit數(shù)據(jù)的用戶界面并徘。用戶可以查看遣钳,添加,刪除麦乞,并以其他方式管理他們的健康和健身數(shù)據(jù)使用這個(gè)應(yīng)用程序蕴茴。他們還可以編輯每種數(shù)據(jù)類型的共享權(quán)限。
HealthKit和Health應(yīng)用程序在iPad上不可用路幸。
保護(hù)用戶隱私
由于健康數(shù)據(jù)可能非常敏感荐开,因此HealthKit通過對應(yīng)用程序可以共享的信息進(jìn)行細(xì)粒度控制來授予用戶對其數(shù)據(jù)的控制權(quán)。用戶必須明確授予每個(gè)應(yīng)用程序讀寫數(shù)據(jù)到HealthKit商店的權(quán)限简肴。用戶可以為每種類型的數(shù)據(jù)分別授予或拒絕權(quán)限晃听。例如,用戶可以讓您的應(yīng)用程序讀取步數(shù)數(shù)據(jù),但不能讀取血糖水平能扒。為了防止可能的信息泄露佣渴,應(yīng)用程序不知道它是否被拒絕讀取數(shù)據(jù)的權(quán)限。從應(yīng)用程序的角度來看初斑,如果應(yīng)用程序被拒絕讀取數(shù)據(jù)的權(quán)限辛润,則不存在該類型的數(shù)據(jù)。
在iOS 10.0或之后鏈接的iOS應(yīng)用程序必須在其Info.plist文件中包含它需要訪問的數(shù)據(jù)類型的使用說明鍵见秤,否則將會崩潰砂竖。要特別訪問和更新HealthKit數(shù)據(jù),它必須分別包含NSHealthShareUsageDescription和NSHealthUpdateUsageDescription鍵鹃答。
HealthKit數(shù)據(jù)只保存在用戶的設(shè)備上乎澄。為了安全起見,HealthKit存儲在設(shè)備被鎖定時(shí)被加密测摔。HealthKit商店只能由授權(quán)的應(yīng)用程序訪問置济。因此,當(dāng)您的應(yīng)用程序在后臺啟動時(shí)锋八,您可能無法從商店讀取數(shù)據(jù); 不過浙于,應(yīng)用程序仍然可以將數(shù)據(jù)寫入商店,即使手機(jī)已鎖定挟纱。一旦手機(jī)解鎖羞酗,HealthKit會暫時(shí)緩存數(shù)據(jù)并將其保存到加密存儲中。
另外紊服,除非應(yīng)用程序主要用于提供健康或健身服務(wù)整慎,否則您的應(yīng)用程序不得訪問HealthKit API。您的應(yīng)用程序作為健康和健身服務(wù)的角色必須在您的營銷文本和用戶界面中都清楚围苫。具體而言,以下準(zhǔn)則適用于所有HealthKit應(yīng)用程序:
- 您的應(yīng)用程序不得將通過使用HealthKit框架獲得的信息用于廣告或類似服務(wù)撤师。請注意剂府,您仍然可以在使用HealthKit框架的應(yīng)用中投放廣告,但不能使用HealthKit商店中的數(shù)據(jù)投放廣告剃盾。
- 未經(jīng)用戶明確許可腺占,不得將通過HealthKit獲得的任何信息透露給第三方。即使獲得許可痒谴,只有在向用戶提供健康或健身服務(wù)的情況下衰伯,才能將信息分享給第三方。
- 您不能將通過HealthKit獲取的信息出售給廣告平臺积蔚,數(shù)據(jù)經(jīng)紀(jì)人或信息轉(zhuǎn)銷商意鲸。
- 如果用戶同意,您可以與第三方共享他或她的HealthKit數(shù)據(jù)以進(jìn)行醫(yī)學(xué)研究。
- 您必須向用戶清楚地透露您和您的應(yīng)用程序?qū)⑷绾问褂盟麄兊腍ealthKit數(shù)據(jù)怎顾。
您還必須為使用HealthKit框架的任何應(yīng)用程序提供隱私政策读慎。您可以在以下網(wǎng)站找到有關(guān)創(chuàng)建隱私政策的指導(dǎo): - 個(gè)人健康記錄模型(針對非HIPAA應(yīng)用程序):http : //www.healthit.gov/policy-researchers-implementers/personal-health-record-phr-model-privacy-notice
- HIPAA模式(適用于HIPAA涵蓋的應(yīng)用程序):http : //www.hhs.gov/ocr/privacy/hipaa/modelnotices.html
由國家衛(wèi)生信息技術(shù)協(xié)調(diào)員(ONC)開發(fā)的這些模型旨在通過使用簡單的語言和平易近人的設(shè)計(jì)來解釋如何收集和共享用戶數(shù)據(jù),從而改善用戶體驗(yàn)和理解槐雾。這些模型并不是要取代基于網(wǎng)絡(luò)的隱私政策夭委,開發(fā)者應(yīng)該咨詢ONC指導(dǎo)哪些模型適合給定的應(yīng)用程序。這些型號僅供您參考募强,Apple明確表示不承擔(dān)使用此類型號的全部責(zé)任株灸。
注意
了解蘋果公司使用HealthKit和用戶健康相關(guān)數(shù)據(jù)的要求至關(guān)重要。要了解這些要求擎值,請參閱Apple Store Review Review指南中的HealthKit部分慌烧,該指南可從Apple的App Review支持頁面獲得。
有關(guān)處理敏感用戶數(shù)據(jù)的其他技術(shù)信息幅恋,請參閱
iOS應(yīng)用程序編程指南當(dāng)您的應(yīng)用程序進(jìn)入后臺時(shí)該怎么做杏死。
使用HealthKit框架
HealthKit框架旨在以有意義的方式在應(yīng)用程序之間共享數(shù)據(jù)。該框架將數(shù)據(jù)和單元的類型限制為預(yù)定義列表捆交,確保所有應(yīng)用程序都了解數(shù)據(jù)的含義以及如何使用它們淑翼。開發(fā)人員不能創(chuàng)建自定義數(shù)據(jù)類型或單位。相反品追,HealthKit提供了各種各樣的數(shù)據(jù)類型和單位玄括。
此外,框架使用大量的子類肉瓦,產(chǎn)生類似類的深層次結(jié)構(gòu)遭京。這些類通常在它們之間有細(xì)微而重要的差別。例如泞莉,一個(gè)HKQuantity
對象用于存儲具有數(shù)值的數(shù)據(jù)哪雕,而一個(gè)HKCategory對象用于存儲從枚舉中選擇的值。
HealthKit也使用密切相關(guān)的類對鲫趁。這些類必須正確配對斯嚎。例如,HKObject和HKObject抽象類具有很大的并行的具體子類的層次結(jié)構(gòu)挨厚。處理對象和對象類型時(shí)堡僻,必須使用匹配的子類。
HealthKit數(shù)據(jù)
HealthKit在HealthKit存儲中心保存各種數(shù)據(jù)類型:
- 特征數(shù)據(jù)疫剃。這些記錄表示通常不會更改的項(xiàng)目钉疫。這些數(shù)據(jù)包括用戶的生日,血型巢价,生物性別和皮膚類型牲阁。您可以直接從HealthKit存儲讀取這些數(shù)據(jù)固阁,使用dataOfbirth(),bloodType()咨油,biologicalSex()您炉,fitzpatrickType()和方法。您的應(yīng)用程序無法保存特征數(shù)據(jù)役电。用戶必須使用健康應(yīng)用程序輸入或修改這些數(shù)據(jù)赚爵。
- 樣本數(shù)據(jù)。用戶的大部分健康數(shù)據(jù)都存儲在樣本中法瑟。這些樣本代表特定時(shí)間點(diǎn)的數(shù)據(jù)冀膝。所有樣本類都是類的子HKSample類,它是HKObject該類的子類霎挟。這些類在“對象和樣本屬性”中有更詳細(xì)的描述窝剖。
- 源數(shù)據(jù)。每個(gè)樣本存儲關(guān)于其來源的信息酥夭。該HKSource`對象包含有關(guān)保存樣本的應(yīng)用程序或HKDevice設(shè)備的信息赐纱。該對象包含有關(guān)生成數(shù)據(jù)的硬件設(shè)備的信息。
- 刪除的對象熬北。一個(gè)HKDeletedObject實(shí)例用于臨時(shí)存儲已從HealthKit存儲中刪除的項(xiàng)目的UUID疙描。當(dāng)用戶或其他應(yīng)用程序刪除對象時(shí),可以使用已刪除的對象進(jìn)行響應(yīng)讶隐。有關(guān)更多信息起胰,請參閱HKAnchoredObjectQuery和HKDeleted。
對象和樣本的屬性
該HKObject班是所有HealthKit樣品類型的超類巫延。所有的HKObject子類都是不可變的效五。每個(gè)對象都有以下屬性:
UUID。該特定條目的唯一標(biāo)識符炉峰。
元數(shù)據(jù)畏妖。包含有關(guān)條目的其他信息的字典。元數(shù)據(jù)可以包含預(yù)定義鍵和自定義鍵疼阔。預(yù)定義的按鍵便于在應(yīng)用程序之間共享數(shù)據(jù)瓜客。自定義鍵有助于擴(kuò)展給定的HealthKit對象類型,將特定于應(yīng)用程序的數(shù)據(jù)添加到條目中竿开。
源修訂。樣本的來源玻熙。來源可以是直接將數(shù)據(jù)保存到HealthKit或應(yīng)用程序的設(shè)備否彩。將對象保存到HealthKit存儲時(shí),HealthKit會自動記錄每個(gè)對象的源和版本嗦随。該屬性僅適用于從商店檢索的對象列荔。
設(shè)備敬尺。生成存儲在此示例中的數(shù)據(jù)的硬件設(shè)備。
該HKSample是HKObject的子類贴浙。示例對象表示特定時(shí)間點(diǎn)的數(shù)據(jù)砂吞。所有示例對象都是HKSample該類的子類。他們都有以下屬性:類型崎溃。樣本類型; 例如蜻直,睡眠分析樣本,身高樣本或步數(shù)樣本袁串。
開始日期概而。樣本的開始時(shí)間。
結(jié)束日期囱修。樣本的結(jié)束時(shí)間赎瑰。如果樣本代表單個(gè)時(shí)間點(diǎn),則結(jié)束時(shí)間應(yīng)等于開始時(shí)間破镰。如果樣本代表一段時(shí)間內(nèi)收集的數(shù)據(jù)餐曼,則結(jié)束時(shí)間應(yīng)在開始時(shí)間之后進(jìn)行。
樣本進(jìn)一步分為四個(gè)具體的子類:
類別樣本鲜漩。可以分類為有限類別的數(shù)據(jù)源譬。查閱HKCategorySample
數(shù)量樣本。可以作為數(shù)值存儲的數(shù)據(jù)宇整。數(shù)量樣本是HealthKit中最常見的數(shù)據(jù)類型瓶佳。這些包括用戶的身高和體重,以及其他數(shù)據(jù)鳞青,如步數(shù)霸饲,用戶的溫度和脈搏率”弁兀看厚脉。HKQuantitySample
相關(guān)性。包含一個(gè)或多個(gè)樣本的復(fù)合數(shù)據(jù)胶惰。在iOS 8.0中傻工,HealthKit使用相關(guān)性來表示食物和血壓。創(chuàng)建食物或血壓數(shù)據(jù)時(shí)孵滞,應(yīng)始終使用相關(guān)性中捆。看
HKCorrelation
坊饶。鍛煉泄伪。代表運(yùn)動的數(shù)據(jù),如跑步匿级,游泳蟋滴,甚至是玩耍染厅。鍛煉往往有類型,持續(xù)時(shí)間津函,距離和能源燃燒屬性肖粮。您還可以將鍛煉與許多細(xì)粒度的樣本關(guān)聯(lián)起來。與相關(guān)性不同尔苦,這些樣本不包含在鍛煉中 - 但是涩馆,他們可以使用鍛煉查詢。有關(guān)更多信息蕉堰,請參閱HKWorkout凌净。
設(shè)置HealthKit
1.在Xcode中,為您的應(yīng)用程序啟動HealthKit功能屋讶。
注意
當(dāng)您在iOS應(yīng)用上啟用HealthKit功能時(shí)冰寻,Xcode會將HealthKit添加到所需設(shè)備功能的列表中。這可以防止用戶在不支持HealthKit的設(shè)備上購買或安裝應(yīng)用程序皿渗。
如果HealthKit對于您的應(yīng)用程序的正確操作不是必需的斩芭,則可以打開應(yīng)用程序的Info.plist
文件并從Required device capabilities
陣列中刪除條目healthkit
該healthkit
條目不被WatchKit擴(kuò)展使用。
有關(guān)所需設(shè)備功能的詳細(xì)信息乐疆,請參閱 關(guān)鍵信息屬性列表鍵參考划乖。
有關(guān)更多信息,請參閱添加HealthKit(iOS挤土,WatchKit擴(kuò)展)琴庵。
2.通過調(diào)用方法isAvailable()來確認(rèn)用戶設(shè)備上是否有HealthKit可用,如下所示仰美。
if HKHealthStore.isHealthDataAvailable() {
// add code to use HealthKit here...
}
HealthKit在iPad上不可用迷殿。如果HealthKit不可用,則其他HealthKit方法將失敗并顯示錯(cuò)誤咖杂。errorUnavailable
3.如果HealthKit已啟用且可用庆寺,請為您的應(yīng)用程序?qū)嵗粋€(gè)對象,如下所示诉字。HKHealthStore
let healthStore = HKHealthStore()
每個(gè)應(yīng)用程序只需要一個(gè)HealthKit存儲懦尝。創(chuàng)建一次后,保留引用壤圃,以便以后使用陵霉。
4.請求用戶授權(quán)讀取和共享HealthKit數(shù)據(jù)。
您必須先執(zhí)行此操作伍绳,然后才能與商店執(zhí)行任何任務(wù)撩匕。為了保護(hù)用戶的隱私,HealthKit需要細(xì)致的授權(quán)墨叛。您必須申請權(quán)限才能讀取和共享您的應(yīng)用使用的每種數(shù)據(jù)類型止毕。
無論何時(shí)您的應(yīng)用程序請求新的權(quán)限,系統(tǒng)都會顯示一個(gè)窗體漠趁,其中顯示所有請求的數(shù)據(jù)類型扁凛。用戶可以打開和關(guān)閉個(gè)人閱讀和共享權(quán)限。要了解如何要求權(quán)限時(shí)提供出色的用戶體驗(yàn)闯传,看到HealthKit在iOS的人機(jī)界面指南谨朝。
圖1顯示了Fit應(yīng)用程序的權(quán)限表。要下載示例代碼甥绿,請參閱適合:存儲和檢索HealthKit數(shù)據(jù)字币。
** 注意**
用戶為您的應(yīng)用程序設(shè)置了權(quán)限后,可以隨時(shí)使用“設(shè)置”或“運(yùn)行狀況”應(yīng)用程序來更改它們共缕。即使用戶不允許讀取或共享數(shù)據(jù)洗出,您的應(yīng)用程序也會出現(xiàn)在Health應(yīng)用程序的Sources選項(xiàng)卡中。
5.提供自定義消息以顯示在應(yīng)用文件的權(quán)限表中图谷。讀取和寫入HealthKit數(shù)據(jù)都需要自定義消息翩活。設(shè)置密鑰以自定義讀取數(shù)據(jù)的消息。設(shè)置密鑰以自定義寫入數(shù)據(jù)的消息便贵。欲了解更多信息菠镇,請參閱iOS的鑰匙在信息屬性列表鍵參考。
6.在嘗試保存用戶數(shù)據(jù)之前承璃,請確保您的應(yīng)用程序有權(quán)使用HealthKit方法共享數(shù)據(jù)利耍。嘗試在請求權(quán)限之前保存數(shù)據(jù)失敗并出現(xiàn)錯(cuò)誤errorinheritAuthorizationNotDetermined。嘗試在權(quán)限被拒絕時(shí)保存數(shù)據(jù)失敗并顯示錯(cuò)誤errorAuthorizationDenied
盔粹。
7.在用戶授予共享數(shù)據(jù)類型的權(quán)限之后隘梨,您可以:
創(chuàng)建該類型的新樣本并將其保存到HealthKit商店。有關(guān)創(chuàng)建示例的更多信息玻佩,請參閱將示例添加到HealthKit存儲出嘹。
使用HealthKit存儲查詢數(shù)據(jù)。有關(guān)閱讀HealthKit數(shù)據(jù)的更多信息咬崔,請參閱訪問HealthKit數(shù)據(jù)税稼。
有關(guān)如何設(shè)置和使用HealthKit的實(shí)際示例,請參閱Fit:存儲和檢索HealthKit數(shù)據(jù)垮斯。
將樣品添加到HealthKit商店
您的應(yīng)用程序可以創(chuàng)建新的樣本并將其添加到HealthKit商店郎仆。所有樣本類型的一般程序是相似的,盡管每種類型在這個(gè)主題上都有自己的變化兜蠕。
- 1.在HealthKit常量中查找正確的類型標(biāo)識符扰肌。
- 2.使用類型標(biāo)識符實(shí)例化匹配子類的對象。有關(guān)便利方法的列表熊杨,請參閱曙旭。HKObjectTypeHKObjectType
- 3.HKSample使用對象類型實(shí)例化匹配子類的對象盗舰。
- 使用該方法將對象保存到HealthKit商店。save(_:withCompletion:)
每個(gè)HKSample子類都有自己的實(shí)例化對象的簡便方法桂躏。這些方法修改上述過程钻趋。
對于數(shù)量樣本,創(chuàng)建一個(gè)HKQuantity類的實(shí)例剂习。數(shù)量單位必須與類型標(biāo)識符文件中描述的允許單位一致蛮位。例如,height文檔指出它使用長度單位鳞绕。因此失仁,您的數(shù)量必須使用厘米,米们何,英尺萄焦,英寸或其他兼容的單位。有關(guān)更多信息垂蜗,請參閱楷扬。HKQuantitySample
對于類別樣本,樣本值必須與類型標(biāo)識符文檔中描述的枚舉相對應(yīng)贴见。例如烘苹,sleepAnalysis文檔指出它使用HKCategoryValueSleepAnalysis枚舉。因此片部,創(chuàng)建此示例時(shí)镣衡,您必須傳遞此枚舉的值。有關(guān)更多信息档悠,請參閱廊鸥。HKCategorySample
對于關(guān)聯(lián),您必須首先創(chuàng)建關(guān)聯(lián)將包含的所有樣本對象辖所。關(guān)聯(lián)的類型標(biāo)識符描述了可以包含的對象的類型和數(shù)量惰说。不要將包含的對象保存到HealthKit存儲中。它們被存儲為相關(guān)性的一部分缘回。有關(guān)更多信息吆视,請參閱HKCorrelation。
鍛煉的行為與其他樣本有所不同:
您不需要特定的類型標(biāo)識符來創(chuàng)建實(shí)例酥宴。所有鍛煉使用相同的類型標(biāo)識符啦吧。HKWorkoutType
您必須為每次鍛煉提供一個(gè)值。該值定義鍛煉期間執(zhí)行的活動的類型拙寡。HKWorkoutActivityType
- 鍛煉保存到HealthKit商店后授滓,您必須將其他樣品與鍛煉相關(guān)聯(lián)(例如,活動燃燒卡路里或距離樣品)。這些樣本提供關(guān)于鍛煉的細(xì)節(jié)細(xì)節(jié)般堆。有關(guān)更多信息在孝,請參閱HKWorkout。
鍛煉樣本可以為“活動”應(yīng)用中的“移動”和“鍛煉”環(huán)貢獻(xiàn)力量淮摔。要做出貢獻(xiàn)浑玛,您必須將一種或多種燃燒卡路里樣本與鍛煉聯(lián)系起來。另外:
-
在watchOS中噩咪。使用鍛煉會話來跟蹤用戶的活動。會話結(jié)束后极阅,創(chuàng)建鍛煉對象和關(guān)聯(lián)的活動能量燃燒樣本胃碾。有關(guān)更多信息,請參閱筋搏。HKWorkoutSession
系統(tǒng)根據(jù)活動能量燒錄樣本更新移動環(huán)仆百。它根據(jù)手表傳感器計(jì)算的鍛煉期間用戶實(shí)際施加的時(shí)間量來更新鍛煉環(huán)。
在iOS 10或更高版本中奔脐。沒有額外的工作是必要的俄周。鍛煉對象自動對“移動”和“鍛煉”環(huán)都有貢獻(xiàn)。鍛煉環(huán)增加鍛煉的總持續(xù)時(shí)間髓迎,移動環(huán)增加相關(guān)的活動燃燒的卡路里數(shù)峦朗。HealthKit還會將鍛煉重疊的每個(gè)掛鐘時(shí)間增加一小時(shí)。
在iOS 9中保存在iPhone上的鍛煉對象不會影響活動環(huán)排龄。
在設(shè)備上創(chuàng)建并保存最適合您的應(yīng)用程序的鍛煉波势。這通常是運(yùn)行用戶鍛煉邏輯的設(shè)備。
平衡性能和細(xì)節(jié)
將數(shù)據(jù)保存到HealthKit存儲區(qū)時(shí)橄维,通常需要選擇使用單個(gè)樣本來表示數(shù)據(jù)尺铣,還是將數(shù)據(jù)分成多個(gè)較小的樣本。從性能角度來看争舞,單一的長樣本更好凛忿。但是,多個(gè)較小的樣本可以讓用戶更詳細(xì)地了解數(shù)據(jù)如何隨著時(shí)間而變化竞川。理想情況下店溢,您希望查找足夠精細(xì)的樣本大小,以向用戶提供有用的歷史數(shù)據(jù)流译。
記錄鍛煉時(shí)逞怨,可以使用高頻數(shù)據(jù)(每個(gè)樣本一分鐘或更少)來提供強(qiáng)度圖表,并分析鍛煉過程中用戶的表現(xiàn)福澡。對于日常步驟計(jì)數(shù)較少的活動叠赦,一小時(shí)或更少的樣本通常效果最好。這可以讓你生成有意義的日常和小時(shí)圖。
應(yīng)用程序應(yīng)避免保存24小時(shí)或更長的樣本除秀。
訪問HealthKit數(shù)據(jù)
從HealthKit商店訪問數(shù)據(jù)有三種主要方式:
直接方法調(diào)用糯累。HealthKit商店提供了直接訪問特征數(shù)據(jù)的方法。這些方法只能用于訪問特征數(shù)據(jù)册踩。有關(guān)更多信息泳姐,請參閱。HKHealthStore
-
查詢暂吉。查詢返回HealthKit存儲中數(shù)據(jù)的當(dāng)前快照胖秒。所有查詢都在匿名后臺隊(duì)列上運(yùn)行。查詢完成后慕的,它將在后臺隊(duì)列上執(zhí)行結(jié)果處理程序阎肝。HealthKit提供了不同類型的查詢,每個(gè)查詢都設(shè)計(jì)為從HealthKit商店返回不同類型的數(shù)據(jù)肮街。
示例查詢张肾。這是一個(gè)通用的查詢淆游。使用示例查詢訪問任何類型的示例數(shù)據(jù)疙筹。如果要對結(jié)果進(jìn)行排序或限制返回的樣本總數(shù)福青,示例查詢尤其有用。有關(guān)更多信息绕辖,請參閱摇肌。HKSampleQuery
錨定對象查詢。使用此查詢搜索已添加到商店或從商店中刪除的商品引镊。第一次運(yùn)行錨點(diǎn)查詢時(shí)朦蕴,它返回當(dāng)前在商店中的所有匹配樣本。在后續(xù)運(yùn)行中弟头,它僅返回自上次運(yùn)行以來已添加或刪除的項(xiàng)目吩抓。有關(guān)更多信息,請參閱赴恨。HKAnchoredObjectQuery
統(tǒng)計(jì)查詢疹娶。使用此查詢對匹配樣本集進(jìn)行統(tǒng)計(jì)計(jì)算。您可以使用統(tǒng)計(jì)查詢來計(jì)算集合中的總和伦连,最小值雨饺,最大值或平均值。有關(guān)更多信息惑淳,請參閱额港。HKStatisticQuery
統(tǒng)計(jì)收集查詢。使用此查詢在一系列固定長度的時(shí)間間隔內(nèi)執(zhí)行多個(gè)統(tǒng)計(jì)查詢歧焦。創(chuàng)建圖形時(shí)移斩,您經(jīng)常會使用這些查詢。它們提供了一種簡單的方法來計(jì)算事物,例如每天消耗的卡路里總數(shù)或每5分鐘間隔所采取的步數(shù)向瓷。有關(guān)更多信息肠套,請參閱。HKStatisticsCollectioQuery
相關(guān)查詢猖任。使用此查詢來執(zhí)行關(guān)聯(lián)中包含的數(shù)據(jù)的復(fù)雜搜索你稚。這些查詢可以包含存儲在關(guān)聯(lián)中的每個(gè)樣本類型的單獨(dú)謂詞。如果您只想匹配關(guān)聯(lián)類型朱躺,請改為使用示例查詢刁赖。有關(guān)更多信息,請參閱HKCorrelation长搀。
* **源查詢乾闰。**使用此查詢搜索已將匹配樣本保存到HealthKit商店的來源(應(yīng)用程序和設(shè)備)。源查詢列出了保存特定樣本類型的所有來源盈滴。有關(guān)更多信息,請參閱轿钠。[HKSourceQuery](https://developer.apple.com/documentation/healthkit/hksourcequery)
活動摘要查詢巢钓。使用此查詢來搜索用戶的活動摘要信息。每個(gè)活動摘要對象都包含給定日期的用戶活動摘要疗垛。您可以查詢一天或幾天的數(shù)據(jù)症汹。有關(guān)更多信息,請參閱HKActivitySummaryQuery
文檔查詢贷腕。使用此查詢來搜索健康文檔背镇。有關(guān)更多信息,請參閱泽裳。HKDocumentQuery
-
**長時(shí)間運(yùn)行的查詢 **這些查詢繼續(xù)運(yùn)行匿名后臺隊(duì)列瞒斩,并在HealthKit存儲更改時(shí)更新您的應(yīng)用程序。另外涮总,觀察者查詢可以注冊后臺交付胸囱。這使得HealthKit每當(dāng)更新發(fā)生時(shí)都會在后臺喚醒您的應(yīng)用程序。
觀察者查詢瀑梗。這個(gè)長時(shí)間運(yùn)行的查詢會監(jiān)視HealthKit存儲并提醒您對匹配樣本進(jìn)行的任何更改烹笔。當(dāng)您想要收到有關(guān)商店更改的通知時(shí),請使用觀察者查詢抛丽。您可以注冊觀察者查詢以進(jìn)行后臺交付谤职。有關(guān)更多信息,請參閱亿鲜。HKObserverQuery
錨定對象查詢允蜈。除了返回修改后數(shù)據(jù)的當(dāng)前快照之外,錨定對象查詢還可以充當(dāng)長時(shí)間運(yùn)行的查詢。如果啟用陷寝,它將繼續(xù)在后臺運(yùn)行锅很,隨著匹配樣本被添加到商店或從商店中刪除提供更新。與觀察者查詢不同凤跑,這些更新包括已添加或刪除的項(xiàng)目列表; 但是爆安,錨定對象查詢不能注冊后臺傳送。有關(guān)更多信息仔引,請參閱扔仓。HKAnchoredObjectQuery
統(tǒng)計(jì)收集查詢。除了計(jì)算統(tǒng)計(jì)集合的當(dāng)前快照之外咖耘,此查詢還可以充當(dāng)長時(shí)間運(yùn)行的查詢翘簇。如果將匹配樣本添加到商店或從商店中刪除,則此查詢會重新計(jì)算統(tǒng)計(jì)信息收集儿倒,并更新您的應(yīng)用版保。統(tǒng)計(jì)信息收集查詢不能注冊后臺交付。有關(guān)更多信息夫否,請參閱彻犁。HKStatisticsCollectionQuery
活動摘要查詢。除了計(jì)算用戶活動摘要的當(dāng)前快照之外凰慈,此查詢還可以充當(dāng)長時(shí)間運(yùn)行的查詢汞幢。如果用戶的活動摘要數(shù)據(jù)發(fā)生更改,則此查詢將重新計(jì)算活動摘要微谓,并更新您的應(yīng)用程序森篷。活動摘要查詢無法注冊后臺交付豺型。有關(guān)更多信息仲智,請參閱。HKActivitySummaryQuery
單位和數(shù)量
該HKUnit類提供單個(gè)單位的表示形式姻氨。它支持廣泛的公制和英制單位坎藐,以及簡單和復(fù)雜的單位。一個(gè)簡單的單位表示一個(gè)單一的測量哼绑,如米岩馍,磅或秒。一個(gè)復(fù)雜的單元抖韩,使用數(shù)學(xué)運(yùn)算蛀恩,如每平方英尺(磅/英尺每秒米(m / s)的或磅結(jié)合一個(gè)或多個(gè)簡單單元)。
除了創(chuàng)建HealthKit支持的所有簡單單元的便捷方法外茂浮,HKUnit還提供構(gòu)建復(fù)雜單元所需的數(shù)學(xué)運(yùn)算双谆。您也可以使用格式正確的單位字符串直接創(chuàng)建復(fù)雜單位壳咕。
有關(guān)單位的更多信息,請參閱HKUnit顽馋。
在HKQuantity類存儲用于給定的單元的值谓厘。然后,您可以請求任何兼容單元中的值寸谜,讓您的應(yīng)用程序輕松轉(zhuǎn)換單位之間的值竟稳。
有關(guān)數(shù)量的更多信息,請參閱HKQuantity熊痴。
您可以使用本地化數(shù)量他爸,如長度,質(zhì)量和能量果善。對于其他數(shù)量诊笤,您需要執(zhí)行轉(zhuǎn)換并自己本地化數(shù)據(jù)。MeasurementFormatter
線程
HealthKit存儲是線程安全的巾陕,大多數(shù)HealthKit對象是不可變的讨跟。通常,您可以在多線程環(huán)境中安全地使用HealthKit鄙煤。
注意
所有HealthKit API的完成處理程序都在私有后臺隊(duì)列上執(zhí)行许赃。您通常希望在更新用戶界面或修改應(yīng)該僅由主線程觸及的任何其他資源之前將此數(shù)據(jù)分派回主隊(duì)列。
有關(guān)多線程和并發(fā)編程的更多信息馆类,請參見并發(fā)編程指南。
添加數(shù)字簽名
設(shè)備可以對他們創(chuàng)建的樣本進(jìn)行數(shù)字簽名弹谁,讓其他應(yīng)用程序驗(yàn)證樣本乾巧,并驗(yàn)證他們沒有被改變。為了促進(jìn)這一點(diǎn)预愤,HealthKit提供了數(shù)字簽名元數(shù)據(jù)密鑰沟于,HKMetadataKeyDigitalSignature。使用此鍵存儲樣本記錄的數(shù)字簽名副本植康。簽名由設(shè)備生成(應(yīng)該是防篡改的旷太,因?yàn)樗鎯λ饺撕灻荑€)。這允許數(shù)據(jù)消費(fèi)者使用該設(shè)備的已知公鑰檢查簽名销睁,以驗(yàn)證記錄數(shù)據(jù)沒有被改變供璧。由于每條記錄都是單獨(dú)簽名的,因此每個(gè)記錄的存儲開銷大約為1 KB冻记。因此睡毒,此元數(shù)據(jù)簽名項(xiàng)目旨在用于采樣率不超過每天幾次的記錄。較高的采樣率將需要將簽名應(yīng)用于合并的樣本組冗栗,這超出了本文檔的范圍演顾。
通常供搀,在制造時(shí)將私鑰提供給防篡改測量設(shè)備。(任何私鑰重置或證書更新的策略或機(jī)制都不在本文的范圍之內(nèi))钠至。相應(yīng)的公鑰將由設(shè)備制造商發(fā)布葛虐,例如,在他們的網(wǎng)頁上棉钧。對于每個(gè)示例屿脐,設(shè)備都會將示例記錄以及簽名傳遞給iOS應(yīng)用程序,這會將這兩個(gè)項(xiàng)目都存儲在HealthKit數(shù)據(jù)庫中掰盘。請注意摄悯,私鑰 - 公鑰對用于數(shù)字簽名以提供數(shù)據(jù)完整性,而不用于加密愧捕。數(shù)據(jù)記錄中的實(shí)際值是明文奢驯。
用于數(shù)字簽名的格式是IETF RFC 5652中規(guī)定的加密消息語法(Cryptographic Message Syntax,CMS)次绘。簽名使用帶有區(qū)分編碼規(guī)則(DER)的ASN.1進(jìn)行編碼瘪阁。使用的消息摘要應(yīng)該是SHA256,簽名密碼應(yīng)該是FIPS PUB 186-4數(shù)字簽名標(biāo)準(zhǔn)橢圓曲線P-256邮偎。這將確保力量和效率管跺。另外,整個(gè)簽名應(yīng)該是base64編碼禾进,以便它可以存儲在HealthKit NSString元數(shù)據(jù)對象中豁跑。
簽名應(yīng)該是ASN.1簽名數(shù)據(jù)內(nèi)容類型:
SignedData ::= SEQUENCE {
version CMSVersion,
digestAlgorithms DigestAlgorithmIdentifiers,
encapContentInfo EncasulatedContentInfo,
signerInfos SignerInfo }
其中SignerInfo類型是:
SignerInfo ::= SEQUENCE {
version CMSVersion,
sid SignerIdentifier,
digestAlgorithm DigestAlgorithmIdentifier,
signatureAlgorithem SignatureAlgorithmIdentifier,
signatureSignatureValue }
摘要和簽名算法如上所述⌒涸疲可選項(xiàng)目已被省略艇拍。SignerIdentifier用于檢索用于簽名驗(yàn)證的正確公鑰。
EncapsulatedContentInfo應(yīng)該是設(shè)備生成的樣本記錄中相關(guān)項(xiàng)目的副本宠纯。該副本應(yīng)使用ASN.1 DER進(jìn)行編碼卸夕,并應(yīng)至少包含一個(gè)樣本時(shí)間戳和樣本值。記錄數(shù)據(jù)被復(fù)制到簽名中婆瓜,以便有一個(gè)穩(wěn)定的快集,明確定義的二進(jìn)制編碼(ASN.1 DER)的數(shù)據(jù),這是產(chǎn)生可驗(yàn)證簽名所必需的廉白。對于大多數(shù)記錄類型來說个初,ASN.1編碼的plist結(jié)構(gòu)(鍵值對)應(yīng)該是足夠的。(請參閱“使用ASN.1 DER編碼plist結(jié)構(gòu)”)猴蹂。
采用HealthKit的好處
健康和健身應(yīng)用程序從采用HealthKit中獲得了幾個(gè)具體的好處勃黍。具體來說,HealthKit:
分離數(shù)據(jù)收集晕讲,數(shù)據(jù)處理和社會化覆获。創(chuàng)造現(xiàn)代健康和健身體驗(yàn)包括許多不同的方面马澈,例如收集和分析數(shù)據(jù),向用戶提供可操作的信息和有用的可視化弄息,以及培養(yǎng)社區(qū)痊班。HealthKit允許您專注于僅實(shí)現(xiàn)您最感興趣的方面,而將其他任務(wù)留給更專用的應(yīng)用程序摹量。
這種責(zé)任分離使用戶可以通過選擇自己喜歡的體重跟蹤應(yīng)用程序涤伐,步數(shù)計(jì)數(shù)應(yīng)用程序和健康挑戰(zhàn)應(yīng)用程序,采用混合搭配的方式缨称,每個(gè)應(yīng)用程序都根據(jù)自己的需求進(jìn)行了校準(zhǔn)凝果。但是,因?yàn)镠ealthKit應(yīng)用程序可以自由交換數(shù)據(jù)(具有用戶權(quán)限)睦尽,所以組合套件提供比任何單個(gè)應(yīng)用程序本身更好的體驗(yàn)器净。
例如,一群朋友可以決定加入每日步數(shù)挑戰(zhàn)当凡。每個(gè)人都可以使用自己喜歡的硬件設(shè)備或應(yīng)用程序來跟蹤這些步驟山害,但他們?nèi)匀豢梢允褂孟嗤纳缃粦?yīng)用程序來應(yīng)對挑戰(zhàn)。
啟用應(yīng)用程序之間的自動數(shù)據(jù)共享沿量。對于開發(fā)人員浪慌,您不再需要下載API并編寫自定義代碼以與每個(gè)應(yīng)用程序共享。當(dāng)新的HealthKit應(yīng)用程序可用時(shí)朴则,他們可以通過HealthKit存儲自動開始共享权纤。
用戶不需要手動設(shè)置應(yīng)用程序之間的連接或?qū)牒蛯?dǎo)出數(shù)據(jù)。重要的是乌妒,用戶仍然可以控制哪些應(yīng)用程序可以讀取和寫入HealthKit存儲數(shù)據(jù)以及每個(gè)應(yīng)用程序有權(quán)訪問哪些數(shù)據(jù)汹想。但是,只要用戶授予權(quán)限芥被,應(yīng)用程序就可以自由和無縫地訪問彼此的數(shù)據(jù)。
提供更豐富的數(shù)據(jù)和更大的上下文感坐榆。通過訪問更廣泛的數(shù)據(jù)拴魄,每個(gè)應(yīng)用程序都可以更全面地了解用戶的健康和健身需求。在許多情況下席镀,應(yīng)用程序可以根據(jù)HealthKit商店的附加信息修改其指標(biāo)或建議匹中。例如,訓(xùn)練應(yīng)用程序可以建議不僅基于燃燒的卡路里的數(shù)量而且還基于當(dāng)天到目前為止已經(jīng)吃過的食物的類型和數(shù)量來決定鍛煉后的零食豪诲。
培育更大的生態(tài)系統(tǒng)顶捷。通過共享數(shù)據(jù),應(yīng)用程序成為更大的生態(tài)系統(tǒng)的一部分屎篱,增加了應(yīng)用程序的可見性和實(shí)用性服赎。更重要的是葵蒂,HealthKit讓您的應(yīng)用程序與用戶已經(jīng)擁有和喜愛的其他應(yīng)用程序進(jìn)行協(xié)作。如果他們無法與您的應(yīng)用共享數(shù)據(jù)重虑,他們可能會決定在其他地方尋找解決方案践付。