पेश है HealthKit

इस HealthKit लेख में, आप सीखेंगे कि HealthKit डेटा तक पहुंचने के लिए अनुमति का अनुरोध कैसे करें, साथ ही केंद्रीय HealthKit रिपॉजिटरी में डेटा पढ़ने और लिखने के लिए। लेख में स्विफ्ट 4, आईओएस 11, एक्सकोड 9 संस्करण का उपयोग किया गया है।

HealthKit एक एपीआई है जिसे iOS 8 में पेश किया गया था। HealthKit सभी स्वास्थ्य संबंधी डेटा के लिए केंद्रीय भंडार के रूप में कार्य करता है, जिससे उपयोगकर्ता जैविक प्रोफ़ाइल बना सकते हैं और वर्कआउट डेटा स्टोर कर सकते हैं।

जैसा कि आप HealthKit लेख पढ़ते हैं, आप सबसे सरल प्रशिक्षण ट्रैकिंग एप्लिकेशन बनाएंगे और सीखेंगे:

  • अनुमति का अनुरोध कैसे करें और HealthKit डेटा एक्सेस करें
  • HealthKit डेटा को कैसे पढ़ें और इसे UITableView में प्रदर्शित करें
  • केंद्रीय HealthKit रिपॉजिटरी में डेटा कैसे लिखें

HealthKit के साथ आरंभ करने के लिए तैयार हैं? पर पढ़ें!

नोट: इस ट्यूटोरियल पर काम करने के लिए, आपको एक सक्रिय iOS डेवलपर खाते की आवश्यकता होगी। इसके बिना, आप HealthKit क्षमता को सक्षम नहीं कर सकते और HealthKit रिपॉजिटरी तक पहुंच प्राप्त कर सकते हैं।

शुरुआत


स्टार्टर ऐप एक कसरत कार्यक्रम के दौरान कैलोरी बर्निंग को ट्रैक करता है। हॉलीवुड के अंदरूनी सूत्रों और सामाजिक लोगों के लिए, यह स्पष्ट होना चाहिए कि मैं प्रैंकक्रिस के बारे में बात कर रहा हूं।

Prancercise

स्टार्टर प्रोजेक्ट डाउनलोड करें और इसे Xcode में खोलें

एप्लिकेशन को संकलित करें और चलाएं। आपको उपयोगकर्ता इंटरफ़ेस का "कंकाल" दिखाई देगा। अगले दो लेखों में, आप धीरे-धीरे इस एप्लिकेशन के लिए कार्यक्षमता जोड़ेंगे।

छवि

एक टीम को सौंपना


HealthKit एक विशेष ढांचा है। यदि आपके पास कोई सक्रिय डेवलपर खाता नहीं है, तो अनुप्रयोग इसका उपयोग नहीं कर पाएगा। आपके पास एक डेवलपर खाता होने के बाद, आप अपनी टीम को असाइन कर सकते हैं।

प्रोजेक्ट नेविगेटर में PrancerciseTracker का चयन करें, और उसके बाद PrancerciseTracker लक्ष्य का चयन करें। जनरल टैब पर जाएं और टीम फील्ड पर क्लिक करें।

अपने डेवलपर खाते से संबद्ध कमांड का चयन करें:

छवि

अनुमतियाँ / प्रविष्टियाँ


HealthKit के पास अधिकारों का अपना सेट भी है, और आपको उन अनुप्रयोगों को बनाने में सक्षम करने की आवश्यकता होगी जो फ्रेमवर्क का उपयोग करते हैं।

लक्ष्य संपादक में क्षमताएं टैब खोलें और HealthKit को सक्षम करें , जैसा कि नीचे स्क्रीनशॉट में दिखाया गया है:

छवि

आपके लिए HealthKit को कॉन्फ़िगर करने के लिए Xcode की प्रतीक्षा करें। एक नियम के रूप में, यहां कोई समस्या नहीं है, लेकिन आप अभी भी कुछ का सामना कर सकते हैं यदि आप टीम और बंडल पहचानकर्ता को सही ढंग से निर्दिष्ट करना भूल जाते हैं।

अब सब कुछ तैयार है। आपको केवल HealthKit का उपयोग करने की अनुमति के लिए उपयोगकर्ता से पूछना होगा।

अनुमतियां / अनुमतियां


HealthKit गोपनीय और संवेदनशील डेटा के साथ काम करता है। हर कोई इतना सहज महसूस नहीं करता जितना कि इंस्टॉल किए गए एप्लिकेशन को इस जानकारी तक पहुंचने की अनुमति देना।

यही कारण है कि HealthKit में एक मजबूत गोपनीयता प्रणाली है। HealthKit के पास केवल उस डेटा तक पहुंच है जिसे उपयोगकर्ता साझा करने के लिए सहमत हैं। अपने शरारत ट्रैकर के उपयोगकर्ताओं के लिए एक प्रोफ़ाइल बनाने के लिए, आपको पहले प्रत्येक प्रकार के डेटा तक पहुंचने की अनुमति लेनी होगी।

उपयोग विवरण अपडेट करें


सबसे पहले, आपको यह वर्णन करने की आवश्यकता है कि आप अपने उपयोगकर्ताओं से स्वास्थ्य संकेतकों का अनुरोध क्यों कर रहे हैं। Xcode आपको अपने एप्लिकेशन की Info.plist फ़ाइल में इसे निर्दिष्ट करने की सुविधा देता है।

जानकारी खोलें। फिर निम्नलिखित कुंजियाँ जोड़ें:
गोपनीयता - स्वास्थ्य साझा उपयोग विवरण
गोपनीयता - स्वास्थ्य अद्यतन उपयोग विवरण

ये कुंजियाँ उस पाठ को संग्रहीत करती हैं, जो HeathKit लॉगिन स्क्रीन दिखाई देने पर प्रदर्शित होगी। हेल्थ शेयर यूसेज का वर्णन डेटा के उस सेक्शन को संदर्भित करता है जिसे HealthKit से पढ़ा जाना चाहिए। स्वास्थ्य अद्यतन उपयोग विवरण उस डेटा से मेल खाता है जो HealthKit को लिखा गया है।

आप वहाँ सब कुछ "जोड़" सकते हैं। यह आमतौर पर एक विवरण है: "हम आपके वर्कआउट को बेहतर तरीके से ट्रैक करने के लिए आपकी स्वास्थ्य जानकारी का उपयोग करेंगे।"

ध्यान रखें कि यदि ये कुंजी स्थापित नहीं हैं, तो जब आप HealthKit में लॉग इन करने का प्रयास करेंगे तो एप्लिकेशन क्रैश हो जाएगा।

HealthKit प्राधिकरण


HealthKitSetupAssistant.swift फ़ाइल खोलें, जिसके अंदर वह वर्ग विधि है जिसका उपयोग आप Healthitit में अधिकृत करने के लिए करेंगे।

class func authorizeHealthKit(completion: @escaping (Bool, Error?) -> Swift.Void) { } 

अधिकृत करेंकिटकिट (पूर्ण :) विधि में कोई पैरामीटर नहीं है, और एक शिकायत है कि एक बूलियन ( सफलता या असफलता ) और एक वैकल्पिक त्रुटि होती है अगर कुछ गलत हो जाता है। यदि त्रुटियां वापस आती हैं, तो आप उन्हें दो मामलों में शिकायत करने के लिए पास करेंगे:

  1. आपके डिवाइस पर HealthKit उपलब्ध नहीं हो सकता है। उदाहरण के लिए, यदि एप्लिकेशन iPad पर चल रहा है।
  2. कुछ डेटा प्रकार HealthKit के वर्तमान संस्करण में उपलब्ध नहीं हो सकते हैं।

आइए इस प्रक्रिया को तोड़ते हैं। HealthKit को अधिकृत करने के लिए, अधिकृत करेंकिट (पूर्ण :) विधि को निम्नलिखित चार चरणों को पूरा करना चाहिए:

  1. जांचें कि क्या इस डिवाइस पर Healthkit उपलब्ध है। यदि यह मामला नहीं है, तो असफलता और शिकायत करने के लिए त्रुटि लौटाएं।
  2. स्वास्थ्य डेटा प्रकार तैयार करें। प्राणकर्सी ट्रैकर HealthKit को पढ़ेगा और लिखेगा।
  3. इस डेटा को पढ़ने के लिए और लिखने के प्रकारों की सूची में व्यवस्थित करें।
  4. प्राधिकरण से अनुरोध करें। यदि यह क्रिया सफल है, तो सभी गतिविधियाँ सही थीं और ठीक से पूरी हुईं।

HealthKit उपलब्धता की जाँच करें


सबसे पहले, आपको डिवाइस पर HealthKit की उपलब्धता की जांच करने की आवश्यकता है।
अधिकृत कोड की शुरुआत में निम्नलिखित कोड पेस्ट करें (पूरा करें :) विधि:

 //1. ,      HealthKit guard HKHealthStore.isHealthDataAvailable() else { completion(false, HealthkitSetupError.notAvailableOnDevice) return } 

आप HKHealthStore के साथ बहुत बार बातचीत करेंगे। यह एक केंद्रीय भंडार है जो उपयोगकर्ता स्वास्थ्य डेटा को संग्रहीत करता है। IsHealthDataAvailable () विधि आपको यह समझने में मदद करेगी कि क्या वर्तमान उपयोगकर्ता डिवाइस हीथकिट डेटा का समर्थन करता है।

गार्ड स्टेटमेंट, एप्लिकेशन को ऑथराइज़लकेट के बाकी हिस्सों को पूरा करने से रोकता है (पूरा होने का तरीका) अगर हेल्थकेइट डिवाइस पर उपलब्ध नहीं है। जब ऐसा होता है, तो पूर्ण ब्लॉक को notAvailableOnDevice त्रुटि कहा जाता है । आप बस इस तरह के एक त्रुटि के मामले में आगे के कदम के लिए कंसोल या मुख्य नियंत्रक में आउटपुट कर सकते हैं।

डेटा की तैयारी


एक बार जब आप जानते हैं कि HealthKit उपयोगकर्ता के डिवाइस पर उपलब्ध है, तो यह उस प्रकार के डेटा को तैयार करने का समय है जो HealthKit को पढ़ा और लिखा जाएगा।
HealthKit HKObjectType प्रकार के साथ काम करता है। प्रत्येक प्रकार जो केंद्रीय HealthKit रिपॉजिटरी में प्रवेश या रिटर्न करता है, वह HKObjectType का एक प्रकार है। आपको HKSampleType और HKWorkoutType भी दिखाई देंगे । दोनों को HKObjectType से विरासत में मिला है , इसलिए मूल रूप से यह एक ही बात है।

पहले कोड स्निपेट के तुरंत बाद निम्नलिखित कोड स्निपेट चिपकाएँ:

 //2.   ,     HealthKit guard let dateOfBirth = HKObjectType.characteristicType(forIdentifier: .dateOfBirth), let bloodType = HKObjectType.characteristicType(forIdentifier: .bloodType), let biologicalSex = HKObjectType.characteristicType(forIdentifier: .biologicalSex), let bodyMassIndex = HKObjectType.quantityType(forIdentifier: .bodyMassIndex), let height = HKObjectType.quantityType(forIdentifier: .height), let bodyMass = HKObjectType.quantityType(forIdentifier: .bodyMass), let activeEnergy = HKObjectType.quantityType(forIdentifier: .activeEnergyBurned) else { completion(false, HealthkitSetupError.dataTypeNotAvailable) return } 

वाह, यह एक बड़ा गार्ड है ! कई विकल्पों को पुनः प्राप्त करने के लिए सिंगल गार्ड का उपयोग करने का यह भी एक बढ़िया उदाहरण है।

इन विशेषताओं के लिए HKObjectType बनाने के लिए, आपको HKObjectType.characteristicType (forIdentifier :) या HKObjectType.quantityType (forIdentor :) का उपयोग करने की आवश्यकता है
विशेषता प्रकार और मात्रा प्रकार रूपरेखा द्वारा परिभाषित गणना हैं। उनके साथ HealthKit जूते।

आप यह भी देखेंगे कि यदि कोई विशेषता या चयन प्रकार उपलब्ध नहीं है, तो विधि विफल हो जाएगी। यह जानबूझकर किया गया है। आपके एप्लिकेशन को हमेशा यह जानना चाहिए कि वह किस प्रकार के HealthKit के साथ काम कर सकता है, यदि कोई हो।

पढ़ने और लिखने के लिए डेटा प्रकारों की एक सूची तैयार करना


अब पढ़ने और लिखने के लिए डेटा प्रकारों की एक सूची तैयार करने का समय है।
इस तीसरे कोड को अधिकृत करेंकिट में पेस्ट करें ( दूसरे भाग के तुरंत बाद :) विधि को पूरा करें :

 //3.   ,  HealthKit     let healthKitTypesToWrite: Set<HKSampleType> = [bodyMassIndex, activeEnergy, HKObjectType.workoutType()] let healthKitTypesToRead: Set<HKObjectType> = [dateOfBirth, bloodType, biologicalSex, bodyMassIndex, height, bodyMass, HKObjectType.workoutType()] 

HealthKit HKSampleType ऑब्जेक्ट्स के एक सेट की अपेक्षा करता है जो आपके उपयोगकर्ता द्वारा लिखे जा सकने वाले डेटा के प्रकारों का प्रतिनिधित्व करता है, और आपके आवेदन के लिए प्रदर्शित होने वाले HKObjectType ऑब्जेक्ट्स के सेट की भी अपेक्षा करता है।

HKObjectType.workoutType () HKObjectType का एक विशेष प्रकार है। यह किसी भी कसरत है।

HealthKit प्राधिकरण


अंतिम भाग सबसे आसान है। आपको बस HealthKit से प्राधिकरण का अनुरोध करने की आवश्यकता है। इस अंतिम कोड को चिपकाएँ:

 //4.    HKHealthStore().requestAuthorization(toShare: healthKitTypesToWrite, read: healthKitTypesToRead) { (success, error) in completion(success, error) } 

यह कोड HealthKit से प्राधिकरण का अनुरोध करता है, और फिर पूर्णता को कॉल करता है। वे सफल संचालन के लिए चर का उपयोग करते हैं और HKHealthStore के अनुरोध से पारित त्रुटिपूर्णीकरण (toShare: पढ़ें: पूरा :) विधि।

आप इसे एक अनुप्रेषित के रूप में सोच सकते हैं। HealthKitSetupAssistant के अंदर पूर्णता को संभालने के बजाय, आप पैकेट को मुख्य नियंत्रक के पास भेजते हैं, जो एक चेतावनी प्रदर्शित कर सकता है या कुछ अन्य कार्रवाई कर सकता है।

इस परियोजना में पहले से ही अधिकृत HealthKit बटन है, और यह MasterViewController में अधिकृतizeKit () विधि को कॉल करता है। हमारे द्वारा लिखी गई प्राधिकरण पद्धति को कॉल करने के लिए यह सही जगह है।

MasterViewController.swift खोलें, अधिकृतस्वाइट को खोजें ( ) विधि और इस कोड को पेस्ट करें:

 HealthKitSetupAssistant.authorizeHealthKit { (authorized, error) in guard authorized else { let baseMessage = "HealthKit Authorization Failed" if let error = error { print("\(baseMessage). Reason: \(error.localizedDescription)") } else { print(baseMessage) } return } print("HealthKit Successfully Authorized.") } 

यह कोड प्राधिकृत करेंस्वागत का उपयोग करता है (पूर्ण :) विधि जिसे आपने अभी कार्यान्वित किया है। जब यह पूरा हो जाता है, तो यह सांत्वना में एक संदेश प्रदर्शित करेगा, यह इंगित करने के लिए कि क्या HealthKit में प्राधिकरण सफल था।

ऐप लॉन्च करें। मुख्य विंडो में प्राधिकृत HealthKit पर क्लिक करें और आपको एक पॉप-अप प्राधिकरण स्क्रीन दिखाई देगी:

छवि

सभी स्विच चालू करें, उन सभी को देखने के लिए स्क्रॉल करें, और अनुमति दें दबाएं। कंसोल में आपको इस तरह एक संदेश देखना चाहिए:

 HealthKit Successfully Authorized. 

वाह! आवेदन HealthKit के केंद्रीय भंडार के लिए उपयोग किया है। अब ट्रैकिंग आइटम शुरू करने का समय आ गया है।

चरित्र और नमूने


इस भाग में आप सीखेंगे:

  • अपने उपयोगकर्ता की जैविक विशेषताओं को कैसे पढ़ें।
  • विभिन्न प्रकार के नमूने (वजन, ऊंचाई आदि) कैसे पढ़ें और लिखें

एक नियम के रूप में, जैविक विशेषताएं, ऐसे तत्व हैं जो आपके रक्त के प्रकार की तरह नहीं बदलते हैं। नमूने ऐसे तत्व हैं जो बार-बार बदलते हैं, जैसे कि वजन।

प्रैन्क्रिस वर्कआउट मोड की प्रभावशीलता को ठीक से ट्रैक करने के लिए, प्रैन्सरिस ट्रैकर ऐप को उपयोगकर्ता के वजन और ऊंचाई का एक नमूना प्राप्त करना होगा। साथ में, इन नमूनों का उपयोग बॉडी मास इंडेक्स (बीएमआई) की गणना के लिए किया जा सकता है।

नोट: बॉडी मास इंडेक्स (बीएमआई) शरीर में वसा का व्यापक रूप से उपयोग किया जाने वाला संकेतक है और इसकी गणना एक व्यक्ति के वजन और ऊंचाई के आधार पर की जाती है। इसके बारे में अधिक जानकारी यहाँ प्राप्त करें

पढ़ना विनिर्देशों


प्राकर्सेसी ट्रैकर जैविक विशेषताओं को रिकॉर्ड नहीं करता है। वह उन्हें HealthKit से प्राप्त करता है। इसका मतलब है कि इन विशेषताओं को पहले केंद्रीय हीथक भंडार में संग्रहीत किया जाना चाहिए।

यदि आपने अभी तक ऐसा नहीं किया है, तो हीथकिट को अपने बारे में थोड़ा और बताने का समय आ गया है।

अपने डिवाइस या सिम्युलेटर पर स्वास्थ्य ऐप खोलें। स्वास्थ्य डेटा टैब चुनें। फिर अपने स्वास्थ्य प्रोफ़ाइल को देखने के लिए ऊपरी दाएं कोने में प्रोफ़ाइल आइकन पर क्लिक करें। एडिट पर क्लिक करें और जन्मतिथि, लिंग, रक्त का प्रकार दर्ज करें:

छवि

अब जब HealthKit आपकी जन्मतिथि, लिंग और रक्त के प्रकार को जानता है, तो यह समय प्रांकरिस ट्रैकर में इन सुविधाओं को पढ़ने का है।

Xcode पर लौटें और ProfileDataStore.swift खोलें। ProfileDataStore वर्ग आपके उपयोगकर्ताओं के लिए सभी स्वास्थ्य से संबंधित डेटा तक आपकी पहुंच बिंदु का प्रतिनिधित्व करता है।

ProfileDataStore में निम्न विधि पेस्ट करें:

 class func getAgeSexAndBloodType() throws -> (age: Int, biologicalSex: HKBiologicalSex, bloodType: HKBloodType) { let healthKitStore = HKHealthStore() do { //1. This method throws an error if these data are not available. let birthdayComponents = try healthKitStore.dateOfBirthComponents() let biologicalSex = try healthKitStore.biologicalSex() let bloodType = try healthKitStore.bloodType() //2. Use Calendar to calculate age. let today = Date() let calendar = Calendar.current let todayDateComponents = calendar.dateComponents([.year], from: today) let thisYear = todayDateComponents.year! let age = thisYear - birthdayComponents.year! //3. Unwrap the wrappers to get the underlying enum values. let unwrappedBiologicalSex = biologicalSex.biologicalSex let unwrappedBloodType = bloodType.bloodType return (age, unwrappedBiologicalSex, unwrappedBloodType) } } 

GetAgeSexAndBloodType () विधि HKHealthStore पर कॉल करती है , जो उपयोगकर्ता की जन्म तिथि, लिंग और रक्त प्रकार पूछती है। यह जन्म की तारीख का उपयोग करके उपयोगकर्ता की आयु की गणना भी करता है।

  1. आपने देखा होगा कि इस पद्धति में त्रुटि हो सकती है। यह तब होता है जब हेल्थकेट सेंट्रल रिपॉजिटरी में जन्मतिथि, लिंग या रक्त के प्रकार को संग्रहीत नहीं किया गया है। चूंकि आपने इस जानकारी को अपने आवेदन में दर्ज किया है, इसलिए आपको त्रुटियों का कारण नहीं बनना चाहिए।
  2. कैलेंडर वर्ग का उपयोग करके, आप किसी भी दिनांक को दिनांक घटक के सेट में परिवर्तित कर सकते हैं। यह वास्तव में सुविधाजनक है जब आप एक तारीख के लिए एक वर्ष प्राप्त करना चाहते हैं। यह कोड सिर्फ आपके जन्म का वर्ष, वर्तमान वर्ष प्राप्त करता है, और फिर अंतर की गणना करता है।
  3. "विस्तारित" चर को इस तरह से नामित किया गया है कि यह स्पष्ट है कि आपको रैपर क्लास ( HKBiologicalSexObject और HKBloodTypeObject ) से बेस एन्यूमरेशन तक पहुंचने की आवश्यकता है।

यूआई अपडेट


यदि आप अब एप्लिकेशन को संकलित करते हैं और चलाते हैं, तो आपको उपयोगकर्ता इंटरफ़ेस में कोई परिवर्तन नहीं दिखाई देगा, क्योंकि आपने इस तर्क को अभी तक इससे जोड़ा नहीं है।
ProfileViewController.swif को खोलें और loadAndDisplayAgeSexAndBloodType ( ) विधि खोजें

यह विधि उपयोगकर्ता इंटरफ़ेस में जैविक विशेषताओं को लोड करने के लिए आपके ProfileDataStore का उपयोग करेगी।

निम्नलिखित कोड को loadAndDisplayAgeSexAndBloodType () विधि में पेस्ट करें:

 do { let userAgeSexAndBloodType = try ProfileDataStore.getAgeSexAndBloodType() userHealthProfile.age = userAgeSexAndBloodType.age userHealthProfile.biologicalSex = userAgeSexAndBloodType.biologicalSex userHealthProfile.bloodType = userAgeSexAndBloodType.bloodType updateLabels() } catch let error { self.displayAlert(for: error) } 

यह कोड ब्लॉक एक ट्यूपल के रूप में आयु, लिंग और रक्त प्रकार को लोड करता है। वह तब इन क्षेत्रों को UserHealthProfile मॉडल के स्थानीय उदाहरण में सेट करता है। अंत में, यह अपडेटलैबल्स () विधि को कॉल करके उपयोगकर्ता इंटरफ़ेस में नए फ़ील्ड्स के साथ UserHealthProfile को अपडेट करता है।

चूंकि ProfileDataStore getAgeSexAndBloodType () विधि में कोई त्रुटि हो सकती है, इसलिए ProfileViewController को इसे संभालना होगा। इस मामले में, आप बस त्रुटि लेते हैं और इसे चेतावनी के रूप में प्रस्तुत करते हैं।

यह सब बहुत अच्छा है, लेकिन एक कैच है। UpdateLabels () विधि अभी तक कुछ भी नहीं करती है। यह केवल एक रिक्त विज्ञापन है। इस बार, यूजर इंटरफेस पर चलते हैं।

UpdateLabels () विधि ढूंढें और इस कोड को इसमें पेस्ट करें:

 if let age = userHealthProfile.age { ageLabel.text = "\(age)" } if let biologicalSex = userHealthProfile.biologicalSex { biologicalSexLabel.text = biologicalSex.stringRepresentation } if let bloodType = userHealthProfile.bloodType { bloodTypeLabel.text = bloodType.stringRepresentation } 

कोड बहुत सरल है। यदि उपयोगकर्ता ने आयु निर्धारित की है, तो इसे एक लेबल में स्वरूपित किया जाएगा। वही जैविक सेक्स और रक्त प्रकार के लिए जाता है। चर stringRepresentation प्रदर्शन प्रयोजनों के लिए एक स्ट्रिंग में गणना परिवर्तित करता है।

एप्लिकेशन को संकलित करें और चलाएं। प्रोफाइल और बीएमआई स्क्रीन पर जाएं। पढ़ें HealthKit डेटा बटन पर क्लिक करें।

छवि

यदि आपने पहले आवेदन में अपनी जानकारी दर्ज की है, तो उसे इस स्क्रीन पर शॉर्टकट में दिखाई देना चाहिए। यदि आपने ऐसा नहीं किया है, तो एक त्रुटि संदेश दिखाई देगा।

वाह! आप HealthKit से सीधे डेटा पढ़ते और प्रदर्शित करते हैं।

क्वेरी के नमूने


अब उपयोगकर्ता के वजन और ऊंचाई को पढ़ने का समय है। प्रोफ़ाइल दृश्य में बीएमआई की गणना और प्रदर्शित करने के लिए उनका उपयोग किया जाएगा।

जैविक विशेषताएं आसानी से उपलब्ध हैं क्योंकि वे लगभग कभी नहीं बदलते हैं। नमूनों को बहुत अधिक जटिल दृष्टिकोण की आवश्यकता होती है। वे अधिक सटीक रूप से एचकेवाईपी का उपयोग करते हैं।

HealthKit से नमूनों का अनुरोध करने के लिए, आपको निम्न की आवश्यकता होगी:

  1. उस नमूने के प्रकार को निर्दिष्ट करें जिसे आप अनुरोध करना चाहते हैं (वजन, ऊंचाई, आदि),
  2. कुछ अतिरिक्त विकल्प जो फ़िल्टर और डेटा को सॉर्ट करने में मदद करते हैं। ऐसा करने के लिए, आप एक वैकल्पिक NSPredicate या NSSortDescriptors की एक सरणी पास कर सकते हैं।

नोट: यदि आप CoreData से परिचित हैं, तो आपने संभवतः कुछ समानताओं पर ध्यान दिया है। HKSampleQuery एक ऑब्जेक्ट प्रकार के लिए NSFetchedRequest से बहुत मिलता- जुलता है , जहां आप विधेय और सॉर्ट वर्णनकर्ताओं को निर्दिष्ट करते हैं, और फिर परिणाम प्राप्त करने के लिए क्वेरी को निष्पादित करने के लिए ऑब्जेक्ट के संदर्भ को सेट करते हैं।

एक बार आपकी क्वेरी सेट हो जाने के बाद, आप परिणाम प्राप्त करने के लिए बस HKHealthStore ExecuteQuery () विधि को कॉल करते हैं।

प्राकर्सेसी ट्रैकर के लिए, आप एक एकल, सार्वभौमिक फ़ंक्शन बनाएंगे जो किसी भी प्रकार के नवीनतम नमूने डाउनलोड करता है। इस प्रकार, आप इसे वजन और ऊंचाई दोनों के लिए उपयोग कर सकते हैं।

ProfileDataStore.swift खोलें और निम्न विधि को कक्षा में चिपकाएँ, getAgeSexAndBloodType () विधि के नीचे:

 class func getMostRecentSample(for sampleType: HKSampleType, completion: @escaping (HKQuantitySample?, Error?) -> Swift.Void) { //1.  HKQuery    . let mostRecentPredicate = HKQuery.predicateForSamples(withStart: Date.distantPast, end: Date(), options: .strictEndDate) let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false) let limit = 1 let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: mostRecentPredicate, limit: limit, sortDescriptors: [sortDescriptor]) { (query, samples, error) in //2.       . DispatchQueue.main.async { guard let samples = samples, let mostRecentSample = samples.first as? HKQuantitySample else { completion(nil, error) return } completion(mostRecentSample, nil) } } HKHealthStore().execute(sampleQuery) } 

यह विधि नमूने के प्रकार (ऊंचाई, वजन, बीएमआई, आदि) का उपयोग करती है। फिर वह इस प्रकार के लिए अंतिम नमूना प्राप्त करने के लिए एक क्वेरी बनाता है। यदि आप विकास के लिए नमूने के प्रकार से गुजरते हैं, तो आप अपने पिछले विकास रिकॉर्ड पर लौट आएंगे।

यहां बहुत कुछ हो रहा है। कुछ बातें समझाने के लिए रुकूंगा।

  1. HKQuery में कई तरीके हैं जो आपके HealthKit क्वेरी उदाहरणों को फ़िल्टर करने में आपकी सहायता कर सकते हैं। इस मामले में, हम अंतर्निहित तारीख का उपयोग करते हैं।
  2. HealthKit से नमूने का अनुरोध करना एक अतुल्यकालिक प्रक्रिया है। यही कारण है कि पूरा हैंडलर में कोड डिस्पैच ब्लॉक के अंदर पाया जाता है। मुख्य धागे पर अनुपालन आवश्यक है। यदि आप नहीं करते हैं, तो आवेदन विफल हो जाएगा।

यदि सब कुछ ठीक हो जाता है, तो आपके अनुरोध को निष्पादित किया जाएगा और आपको मुख्य थ्रेड पर एक साफ नमूना लौटाया जाएगा, जहां ProfileViewController लेबल में अपनी सामग्री डाल सकता है। अब इस भाग को करते हैं।

उपयोगकर्ता इंटरफ़ेस में नमूने प्रदर्शित करना


पिछले भाग में, आपने HealthKit से डेटा डाउनलोड किया था । उन्हें ProfileViewController में एक मॉडल के रूप में सहेजें , और फिर ProfileViewController अद्यतन विधि () विधि का उपयोग करके पंक्तियों में सामग्री को अपडेट करें

आपको बस इतना करना है कि नमूने को लोड करने वाले फ़ंक्शन को जोड़कर इस प्रक्रिया का विस्तार करें, उन्हें उपयोगकर्ता इंटरफ़ेस के लिए संसाधित करता है, और फिर अद्यतन लेबल () को पाठ के साथ लेबल को पॉप्युलेट करने के लिए कहता है।

ProfileViewController.swift फ़ाइल खोलें, loadAndDisplayMostRecentHeight ( ) विधि ढूंढें और निम्न कोड पेस्ट करें:

 //1.  HealthKit      guard let heightSampleType = HKSampleType.quantityType(forIdentifier: .height) else { print("Height Sample Type is no longer available in HealthKit") return } ProfileDataStore.getMostRecentSample(for: heightSampleType) { (sample, error) in guard let sample = sample else { if let error = error { self.displayAlert(for: error) } return } //2.     ,   , //    . let heightInMeters = sample.quantity.doubleValue(for: HKUnit.meter()) self.userHealthProfile.heightInMeters = heightInMeters self.updateLabels() } 

  1. यह विधि एक प्रकार के विकास नमूने का निर्माण करके शुरू होती है। फिर वह आपके द्वारा लिखे गए तरीके से इस प्रकार के नमूने को पास करता है, जो HealthKit में दर्ज सबसे हालिया उपयोगकर्ता वृद्धि नमूना वापस कर देगा।
  2. जैसे ही नमूना वापस आता है, विकास मीटर में परिवर्तित हो जाता है और उपयोगकर्तास् थैली मॉडल में संग्रहीत किया जाता है। फिर यूआई अपडेट होगा।

नोट: आमतौर पर आप एक मात्रा के नमूने को एक मानक इकाई में बदलना चाहते हैं। ऐसा करने के लिए, उपरोक्त कोड DoubleValue (:) के लिए विधि का उपयोग करता है, जो आपको संबंधित डेटा को पारित करने की अनुमति देता है (इस मामले में, मीटर) को HKUnit को

आप HealthKit के माध्यम से उपलब्ध कुछ सामान्य वर्ग विधियों का उपयोग करके विभिन्न प्रकार के HKUnits बना सकते हैं। काउंटरों को प्राप्त करने के लिए, आप बस HKUit में मीटर () विधि का उपयोग कर सकते हैं, और वही होगा जो आपको चाहिए।

वृद्धि के साथ छंटनी हुई। वजन के बारे में कैसे? सब कुछ समान है, लेकिन आपको ProfileViewController में loadAndDisplayMostRecentWeight () विधि को पॉप्युलेट करना होगा

निम्नलिखित कोड को loadAndDisplayMostRecentWeight () विधि में पेस्ट करें:

 guard let weightSampleType = HKSampleType.quantityType(forIdentifier: .bodyMass) else { print("Body Mass Sample Type is no longer available in HealthKit") return } ProfileDataStore.getMostRecentSample(for: weightSampleType) { (sample, error) in guard let sample = sample else { if let error = error { self.displayAlert(for: error) } return } let weightInKilograms = sample.quantity.doubleValue(for: HKUnit.gramUnit(with: .kilo)) self.userHealthProfile.weightInKilograms = weightInKilograms self.updateLabels() } 

आप उस प्रकार का नमूना बनाते हैं जिसे आप प्राप्त करना चाहते हैं, इसके लिए HealthKit से अनुरोध करें, कुछ इकाई रूपांतरण करें, इसे अपने मॉडल में सहेजें और उपयोगकर्ता इंटरफ़ेस अपडेट करें।

फिलहाल, यह दिखा सकता है कि काम किया जाता है, लेकिन कुछ और है। अपडेटलैबल्स () फ़ंक्शन को आपके द्वारा उपलब्ध कराए गए नए डेटा के बारे में पता नहीं है।

चलो इसे ठीक करते हैं।

अपडेटलैबल्स () फ़ंक्शन के लिए निम्नलिखित पंक्तियों को उस हिस्से के नीचे जोड़ें, जहां आप उपयोगकर्ता पर प्रदर्शित करने के लिए रक्त समूह का विस्तार करते हैं:

 if let weight = userHealthProfile.weightInKilograms { let weightFormatter = MassFormatter() weightFormatter.isForPersonMassUse = true weightLabel.text = weightFormatter.string(fromKilograms: weight) } if let height = userHealthProfile.heightInMeters { let heightFormatter = LengthFormatter() heightFormatter.isForPersonHeightUse = true heightLabel.text = heightFormatter.string(fromMeters: height) } if let bodyMassIndex = userHealthProfile.bodyMassIndex { bodyMassIndexLabel.text = String(format: "%.02f", bodyMassIndex) } 

UpdateLabels () फ़ंक्शन में मूल टेम्पलेट का पालन करने के बाद, यह आपके UserHealthProfile मॉडल में ऊंचाई, वजन और बॉडी मास इंडेक्स का विस्तार करता है। यदि उपलब्ध है, तो वे उचित लाइनें उत्पन्न करते हैं और उन्हें उपयोगकर्ता की स्क्रीन पर लेबल करने के लिए असाइन करते हैं।

MassFormatter और LengthFormatter अपने मूल्यों को तार में बदलने का काम करते हैं।

बॉडी मास इंडेक्स वास्तव में UserHealthProfile मॉडल में संग्रहीत नहीं है। यह एक गणना की गई संपत्ति है जो आपके लिए गणना करती है।

BodyMassIndex प्रॉपर्टी पर क्लिक करें और आप देखेंगे कि मेरा क्या मतलब है:

 var bodyMassIndex: Double? { guard let weightInKilograms = weightInKilograms, let heightInMeters = heightInMeters, heightInMeters > 0 else { return nil } return (weightInKilograms/(heightInMeters*heightInMeters)) } 

बॉडी मास इंडेक्स एक वैकल्पिक संपत्ति है, अर्थात्, यह शून्य वापस कर सकता है यदि आपने ऊँचाई या वजन निर्दिष्ट नहीं किया था (या यदि वे कुछ संख्या पर सेट हैं जो कोई मतलब नहीं है)। वास्तविक गणना केवल ऊंचाई वर्ग द्वारा विभाजित वजन है।

नोट: यदि आप एप्लिकेशन द्वारा पढ़ने के लिए HealthKit में डेटा नहीं जोड़े हैं, तो जल्द ही आप इस सब में खुद को विसर्जित कर देंगे । यदि आपने पहले से ऐसा नहीं किया है, तो आपको कम से कम ऊंचाई और वजन के नमूने बनाने की आवश्यकता है।

हेल्थ ऐप खोलें और हेल्थ डेटा टैब पर जाएं। वहां, बॉडी मेजरमेंट पैरामीटर चुनें, फिर वेट चुनें और फिर नया वेट सैंपल जोड़ने के लिए डेटा प्वाइंट जोड़ें। विकास के लिए प्रक्रिया को दोहराएं।

इस बिंदु पर, शरारत ट्रैकर को आपके उपयोगकर्ता के वजन और ऊंचाई के हाल के नमूने को पढ़ने में सक्षम होना चाहिए, और फिर इसे पाठ में प्रदर्शित करना चाहिए।

एप्लिकेशन संकलित करें और चलाएं। प्रोफाइल और बीएमआई पर जाएं । इसके बाद HealthKit Data बटन पर क्लिक करें

छवि

आश्चर्यजनक! आप बस HealthKit रिपॉजिटरी से अपने पहले नमूने पढ़ें और बीएमआई की गणना करने के लिए उनका उपयोग करें।

बचत के नमूने


में Prancercise ट्रैकर पहले से ही एक आसान सा कैलक्यूलेटर बॉडी मास इंडेक्स की है। अपने उपयोगकर्ता के बीएमआई नमूने को रिकॉर्ड करने के लिए इसका उपयोग करते हैं। ProfileDataStore.swift

खोलें और निम्न विधि जोड़ें:

 class func saveBodyMassIndexSample(bodyMassIndex: Double, date: Date) { //1. ,      guard let bodyMassIndexType = HKQuantityType.quantityType(forIdentifier: .bodyMassIndex) else { fatalError("Body Mass Index Type is no longer available in HealthKit") } //2.   HKUnit     let bodyMassQuantity = HKQuantity(unit: HKUnit.count(), doubleValue: bodyMassIndex) let bodyMassIndexSample = HKQuantitySample(type: bodyMassIndexType, quantity: bodyMassQuantity, start: date, end: date) //3.      HealthKit HKHealthStore().save(bodyMassIndexSample) { (success, error) in if let error = error { print("Error Saving BMI Sample: \(error.localizedDescription)") } else { print("Successfully saved BMI Sample") } } } 

अन्य प्रकार के नमूनों की तरह, आपको पहले यह सुनिश्चित करना होगा कि नमूना प्रकार HealthKit में उपलब्ध है

  1. इस स्थिति में, कोड की जाँच करता है कि बॉडी मास इंडेक्स के लिए एक मात्रा प्रकार मौजूद है या नहीं यदि ऐसा है, तो इसका उपयोग मात्रा का नमूना बनाने के लिए किया जाता है। यदि नहीं, तो एप्लिकेशन काम करना बंद कर देता है।
  2. count() HKUnit , , . - , , .
  3. HKHealthStore , . , .

लगभग किया हुआ। उपयोगकर्ता इंटरफ़ेस को संक्षेप में प्रस्तुत करने के लिए। ProfileViewController.swif

खोलें , saveBodyMassIndexToHealthKit ( ) विधि ढूंढें । जब उपयोगकर्ता तालिका में सहेजें बीएमआई बटन पर क्लिक करता है तो यह विधि कहलाती है। निम्नलिखित कोड को विधि में पेस्ट करें:



 guard let bodyMassIndex = userHealthProfile.bodyMassIndex else { displayAlert(for: ProfileDataError.missingBodyMassIndex) return } ProfileDataStore.saveBodyMassIndexSample(bodyMassIndex: bodyMassIndex, date: Date()) 

आपको याद है कि बॉडी मास इंडेक्स एक गणना की गई संपत्ति है जो हेल्थकेट से ऊंचाई और वजन के नमूने लोड होने पर एक मूल्य देता है । यह कोड इस संपत्ति की गणना करने की कोशिश कर रहा है, और यदि संभव हो तो, इसे saveBodyMassIndexSample (bodyMassIndex: date :) पद्धति से पारित किया जाएगा जो आपने अभी लिखा है।

यदि किसी कारण से बॉडी मास इंडेक्स की गणना नहीं की जा सकती है तो यह एक सुविधाजनक चेतावनी दिखाता है।

एप्लिकेशन को संकलित करें और चलाएं। प्रोफाइल और बीएमआई स्क्रीन पर जाएं हीथकिट से डेटा डाउनलोड करें, फिर बीएमआई सहेजें बटन पर क्लिक करें।

कंसोल को देखें। क्या आप इसे देखते हैं?

    BMI 

यदि हां, तो बधाई! आपका BMI नमूना अब HealthKit केंद्रीय भंडार में संग्रहीत किया गया है देखते हैं कि क्या हम उसे पा सकते हैं।

हेल्थ ऐप खोलें, हेल्थ डेटा टैब पर टैप करें, टेबल व्यू में बॉडी मेजरमेंट पर क्लिक करें और फिर बॉडी मास इंडेक्स पर क्लिक करें।

छवि

Source: https://habr.com/ru/post/hi434978/


All Articles