Memperkenalkan HealthKit

Dalam artikel HealthKit ini, Anda akan belajar cara meminta izin untuk mengakses data HealthKit, serta membaca dan menulis data ke repositori HealthKit pusat. Artikel ini menggunakan versi Swift 4, iOS 11, Xcode 9.

HealthKit adalah API yang diperkenalkan di iOS 8. HealthKit berfungsi sebagai repositori pusat untuk semua data terkait kesehatan, yang memungkinkan pengguna untuk membuat profil biologis dan menyimpan data latihan.

Saat Anda membaca artikel HealthKit, Anda akan membuat aplikasi pelacakan pelatihan yang paling sederhana dan belajar:

  • Cara meminta izin dan mengakses data HealthKit
  • Cara membaca data HealthKit dan menampilkannya dalam UITableView
  • Cara menulis data ke repositori HealthKit pusat

Sudah siap memulai dengan HealthKit? Baca terus!

Catatan: Untuk mengerjakan tutorial ini, Anda memerlukan akun pengembang iOS aktif. Tanpa ini, Anda tidak dapat mengaktifkan Kemampuan HealthKit dan mendapatkan akses ke repositori HealthKit.

Mulai


Aplikasi pemula melacak pembakaran kalori selama program latihan. Untuk orang dalam Hollywood dan sosialita, seharusnya jelas bahwa saya berbicara tentang Prancercise .

Prancercise

Unduh proyek pemula dan buka dalam Xcode .

Kompilasi dan jalankan aplikasi. Anda akan melihat "kerangka" dari antarmuka pengguna. Selama dua artikel berikutnya, Anda secara bertahap akan menambahkan fungsionalitas untuk aplikasi ini.

gambar

Menugaskan Tim


HealthKit adalah kerangka kerja khusus. Aplikasi tidak akan dapat menggunakannya jika Anda tidak memiliki akun pengembang aktif. Setelah Anda memiliki akun pengembang, Anda dapat menetapkan tim Anda.

Pilih PrancerciseTracker di Project Navigator, dan kemudian pilih target PrancerciseTracker . Buka tab Umum dan klik bidang Tim .

Pilih perintah yang terkait dengan akun pengembang Anda:

gambar

Izin / Hak


HealthKit juga memiliki serangkaian haknya sendiri, dan Anda harus mengaktifkannya untuk membuat aplikasi yang menggunakan kerangka kerja.

Buka tab Capabilities di editor target dan aktifkan HealthKit , seperti yang ditunjukkan pada gambar di bawah:

gambar

Tunggu Xcode untuk mengkonfigurasi HealthKit untuk Anda. Sebagai aturan, tidak ada masalah di sini, tetapi Anda masih dapat menemukan beberapa jika Anda lupa menentukan Tim dan Bundle Identifier dengan benar.

Sekarang semuanya sudah siap. Anda hanya perlu meminta izin kepada pengguna untuk menggunakan HealthKit.

Izin


HealthKit bekerja dengan data rahasia dan sensitif. Tidak semua orang merasa nyaman untuk memungkinkan aplikasi yang diinstal mengakses informasi ini.

Itu sebabnya HealthKit memiliki sistem privasi yang kuat. HealthKit hanya memiliki akses ke data yang disetujui pengguna untuk dibagikan. Untuk membuat profil untuk pengguna Prancercise Tracker Anda, Anda harus terlebih dahulu mendapatkan izin untuk mengakses setiap jenis data.

Penggunaan Deskripsi Pembaruan


Pertama, Anda perlu menjelaskan mengapa Anda meminta indikator kesehatan dari pengguna Anda. Xcode memberi Anda kemampuan untuk menentukan ini dalam file Info.plist aplikasi Anda.

Buka Info.plist . Kemudian tambahkan kunci berikut:
Privasi - Keterangan Penggunaan Saham Kesehatan
Privasi - Keterangan Penggunaan Pembaruan Kesehatan

Kunci-kunci ini menyimpan teks yang akan ditampilkan ketika layar login HeathKit muncul. Uraian Penggunaan Saham Kesehatan mengacu pada bagian data yang harus dibaca dari HealthKit. Deskripsi Penggunaan Pembaruan Kesehatan sesuai dengan data yang ditulis ke HealthKit.

Anda dapat "menambahkan" semua yang Anda inginkan di sana. Ini biasanya deskripsi: "Kami akan menggunakan informasi kesehatan Anda untuk melacak latihan Anda dengan lebih baik."

Perlu diingat bahwa jika kunci ini tidak diinstal, aplikasi akan macet ketika Anda mencoba masuk ke HealthKit.

Otoritas HealthKit


Buka file HealthKitSetupAssistant.swift di dalamnya yang merupakan metode kelas yang akan Anda gunakan untuk mengotorisasi di HealthKit.

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

Metode authorizeHealthKit (completion :) tidak menerima parameter apa pun, dan memiliki komplain yang mengembalikan boolean ( sukses atau gagal ) dan kesalahan opsional jika terjadi kesalahan. Jika kesalahan dikembalikan, Anda akan meneruskannya ke pengaduan dalam dua kasus:

  1. HealthKit mungkin tidak tersedia di perangkat Anda. Misalnya, jika aplikasi sedang berjalan di iPad.
  2. Beberapa tipe data mungkin tidak tersedia di versi HealthKit saat ini.

Mari kita hancurkan proses ini. Untuk mengotorisasi HealthKit, metode otorizeHealthKit (penyelesaian :) harus menyelesaikan empat langkah berikut:

  1. Periksa apakah Healthkit tersedia di perangkat ini. Jika tidak demikian, kembalikan kegagalan dan kesalahan ke komplain.
  2. Mempersiapkan tipe data kesehatan. Prancercise Tracker akan membaca dan menulis ke HealthKit.
  3. Atur data ini ke dalam daftar tipe untuk dibaca dan tipe untuk ditulis.
  4. Minta otorisasi. Jika tindakan ini berhasil, maka semua kegiatan sudah benar dan selesai dengan benar.

Pemeriksaan Ketersediaan HealthKit


Pertama-tama, Anda perlu memeriksa ketersediaan HealthKit di perangkat.
Rekatkan kode berikut di awal metode authorizeHealthKit (completion :) :

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

Anda akan sering berinteraksi dengan HKHealthStore . Ini adalah pusat penyimpanan yang menyimpan data kesehatan pengguna. Metode isHealthDataAvailable () akan membantu Anda memahami jika perangkat pengguna saat ini mendukung data Heathkit.

Pernyataan penjaga mencegah aplikasi mengeksekusi sisa metode otorizeHealthKit (selesai :) jika HealthKit tidak tersedia pada perangkat. Ketika ini terjadi, blok penyelesaian disebut dengan kesalahan notAvailableOnDevice . Anda hanya dapat menampilkan ini ke konsol atau di pengontrol utama untuk memproses langkah lebih lanjut jika terjadi kesalahan seperti itu.

Persiapan data


Setelah Anda mengetahui bahwa HealthKit tersedia di perangkat pengguna, sekarang saatnya mempersiapkan jenis data yang akan dibaca dan ditulis ke HealthKit.
HealthKit bekerja dengan tipe HKObjectType . Setiap jenis yang masuk atau kembali ke repositori HealthKit pusat adalah jenis HKObjectType . Anda juga akan melihat HKSampleType dan HKWorkoutType . Keduanya mewarisi dari HKObjectType , jadi pada dasarnya ini adalah hal yang sama.

Tempel cuplikan kode berikut segera setelah cuplikan kode pertama:

 //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 } 

Wow, ini penjaga besar! Ini juga merupakan contoh bagus menggunakan penjaga tunggal untuk mengambil beberapa opsi.

Untuk membuat HKObjectType untuk karakteristik ini, Anda harus menggunakan HKObjectType.characteristicType (forIdentifier :) atau HKObjectType.quantityType (forIdentifier :)
Tipe karakteristik dan tipe kuantitas adalah enumerasi yang ditentukan oleh framework. HealthKit melakukan booting bersama mereka.

Anda juga akan melihat bahwa jika satu karakteristik atau jenis seleksi tidak tersedia, metode ini akan gagal. Ini disengaja. Aplikasi Anda harus selalu tahu persis jenis HealthKit yang dapat digunakan, jika ada.

Mempersiapkan daftar tipe data untuk membaca dan menulis


Sekarang saatnya menyiapkan daftar tipe data untuk membaca dan menulis.
Tempel kode ketiga ini ke metode authorizeHealthKit (selesai :) segera setelah bagian kedua:

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

HealthKit mengharapkan sekumpulan objek HKSampleType yang mewakili tipe data yang dapat ditulis pengguna Anda, dan juga mengharapkan sekumpulan objek HKObjectType yang akan ditampilkan untuk aplikasi Anda.

HKObjectType.workoutType () adalah tipe khusus dari HKObjectType . Ini adalah latihan apa saja.

Otoritas HealthKit


Bagian terakhir adalah yang termudah. Anda hanya perlu meminta otorisasi dari HealthKit. Tempel potongan kode terakhir ini:

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

Kode ini meminta otorisasi dari HealthKit, dan kemudian memanggil penyelesaian. Mereka menggunakan variabel untuk operasi yang sukses dan kesalahan yang lulus dari requestAuthorization HKHealthStore (toShare: baca: selesai :) metode.

Anda dapat menganggapnya sebagai pengalihan. Alih-alih menangani penyelesaian di dalam HealthKitSetupAssistant, Anda meneruskan paket ke pengontrol utama, yang dapat menampilkan peringatan atau mengambil tindakan lain.

Proyek ini sudah memiliki tombol Otorisasi HealthKit, dan ia memanggil metode authorizeHealthKit () di MasterViewController. Ini adalah tempat yang tepat untuk memanggil metode otorisasi yang baru saja kami tulis.

Buka MasterViewController.swift , cari metode authorizeHealthKit ( ) dan rekatkan kode ini:

 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.") } 

Kode ini menggunakan metode authorizeHealthKit (completion :) yang baru saja Anda terapkan. Ketika selesai, itu akan menampilkan pesan di konsol untuk menunjukkan apakah otorisasi berhasil di HealthKit.

Luncurkan aplikasi. Klik Otorisasi HealthKit di jendela utama dan Anda akan melihat layar otorisasi pop-up:

gambar

Nyalakan semua sakelar, gulir untuk melihat semuanya, dan tekan Izinkan . Di konsol Anda akan melihat pesan seperti ini:

 HealthKit Successfully Authorized. 

Hebat! Aplikasi ini memiliki akses ke repositori pusat HealthKit. Sekarang saatnya untuk mulai melacak item.

Karakteristik dan Sampel


Di bagian ini Anda akan belajar:

  • Cara membaca karakteristik biologis pengguna Anda.
  • Cara membaca dan menulis berbagai jenis sampel (berat, tinggi, dll.)

Karakteristik biologis, sebagai suatu peraturan, adalah jenis elemen yang tidak berubah, sama seperti golongan darah Anda. Sampel adalah elemen yang sering berubah, seperti berat badan.

Untuk melacak dengan benar efektivitas mode latihan Prancercise , aplikasi Prancercise Tracker harus menerima sampel dari berat dan tinggi pengguna. Bersama-sama, sampel-sampel ini dapat digunakan untuk menghitung indeks massa tubuh (BMI).

Catatan: Indeks Massa Tubuh (IMT) adalah indikator lemak tubuh yang banyak digunakan dan dihitung berdasarkan berat dan tinggi badan seseorang. Cari tahu lebih lanjut di sini .

Spesifikasi bacaan


Prancercise Tracker tidak mencatat karakteristik biologis. Dia mendapatkannya dari HealthKit. Ini berarti bahwa karakteristik ini harus terlebih dahulu disimpan di repositori HeathKit pusat.

Jika Anda belum melakukannya, sekarang saatnya untuk memberi tahu HeathKit lebih banyak tentang diri Anda.

Buka aplikasi Kesehatan di perangkat atau simulator Anda. Pilih tab Data Kesehatan. Kemudian klik ikon profil di sudut kanan atas untuk melihat profil kesehatan Anda. Klik Edit dan masukkan tanggal lahir, jenis kelamin, golongan informasi:

gambar

Sekarang HealthKit mengetahui tanggal lahir, jenis kelamin, dan golongan darah Anda, sekarang saatnya untuk membaca fitur-fitur ini di Prancercise Tracker .

Kembali ke Xcode dan buka ProfileDataStore.swift . Kelas ProfileDataStore mewakili titik akses Anda ke semua data terkait kesehatan untuk pengguna Anda.

Tempel metode berikut ke 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) } } 

Metode getAgeSexAndBloodType () memanggil HKHealthStore , menanyakan tanggal lahir, jenis kelamin, dan golongan darah pengguna. Ini juga menghitung usia pengguna menggunakan tanggal lahir.

  1. Anda mungkin telah memperhatikan bahwa metode ini dapat menyebabkan kesalahan. Ini terjadi ketika tanggal lahir, jenis kelamin atau golongan darah belum disimpan di repositori pusat HealthKit. Karena Anda baru saja memasukkan informasi ini di aplikasi Anda, Anda seharusnya tidak menyebabkan kesalahan.
  2. Menggunakan kelas Kalender , Anda dapat mengonversi tanggal apa pun menjadi satu set Komponen Tanggal . Ini benar-benar nyaman ketika Anda ingin mendapatkan satu tahun untuk kencan. Kode ini hanya mendapatkan tahun kelahiran Anda, tahun ini, dan kemudian menghitung perbedaannya.
  3. Variabel "diperluas" dinamai sedemikian rupa sehingga jelas bahwa Anda perlu mengakses enumerasi dasar dari kelas wrapper ( HKBiologicalSexObject dan HKBloodTypeObject ).

Pembaruan UI


Jika sekarang Anda mengkompilasi dan menjalankan aplikasi, Anda tidak akan melihat perubahan apa pun di antarmuka pengguna, karena Anda belum menghubungkan logika ini ke sana.
Buka ProfileViewController.swif t dan temukan metode loadAndDisplayAgeSexAndBloodType ( )

Metode ini akan menggunakan ProfileDataStore Anda untuk memuat karakteristik biologis ke antarmuka pengguna.

Rekatkan kode berikut ini ke metode 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) } 

Blok kode ini memuat usia, jenis kelamin, dan golongan darah sebagai tupel. Dia kemudian menetapkan bidang ini dalam contoh lokal model UserHealthProfile. Akhirnya, itu memperbarui antarmuka pengguna dengan bidang baru di UserHealthProfile dengan memanggil metode updateLabels () .

Karena metode ProfileDataStore getAgeSexAndBloodType () dapat menimbulkan kesalahan, ProfileViewController harus menanganinya. Dalam hal ini, Anda hanya mengambil kesalahan dan menyajikannya sebagai peringatan.

Semua ini bagus, tetapi ada satu tangkapan. Metode updateLabels () belum melakukan apa - apa. Ini hanya iklan kosong. Kali ini, mari kita beralih ke antarmuka pengguna.

Temukan metode updateLabels () dan rekatkan kode ini ke dalamnya:

 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 } 

Kode ini cukup sederhana. Jika pengguna telah menetapkan usia, itu akan diformat menjadi label. Hal yang sama berlaku untuk jenis kelamin biologis dan golongan darah. Variabel stringRepresentation mengubah enumerasi menjadi string untuk tujuan tampilan.

Kompilasi dan jalankan aplikasi. Pergi ke layar Profile & BMI. Klik tombol Baca Data HealthKit.

gambar

Jika sebelumnya Anda memasukkan informasi dalam aplikasi, itu akan muncul di pintasan di layar ini. Jika Anda belum melakukannya, pesan kesalahan akan muncul.

Wow! Anda membaca dan menampilkan data langsung dari HealthKit .

Sampel Pertanyaan


Sekarang saatnya untuk membaca berat dan tinggi pengguna. Mereka akan digunakan untuk menghitung dan menampilkan BMI dalam tampilan profil.

Karakteristik biologis sudah tersedia karena mereka hampir tidak pernah berubah. Sampel memerlukan pendekatan yang jauh lebih kompleks. Mereka menggunakan HKQuery , lebih tepatnya HKSampleQuery .

Untuk meminta sampel dari HealthKit, Anda perlu:

  1. Tentukan jenis sampel yang ingin Anda minta (berat, tinggi, dll.),
  2. Beberapa opsi tambahan yang membantu memfilter dan mengurutkan data. Untuk melakukan ini, Anda dapat melewati NSPredicate opsional atau array NSSortDescriptors .

Catatan: Jika Anda terbiasa dengan CoreData, Anda mungkin memperhatikan beberapa kesamaan. HKSampleQuery sangat mirip dengan NSFetchedRequest untuk tipe objek, di mana Anda menentukan predikat dan mengurutkan deskriptor, lalu mengatur konteks objek untuk mengeksekusi kueri untuk mendapatkan hasil.

Setelah kueri Anda diatur, Anda cukup memanggil metode HKHealthStore ExecuteQuery () untuk mendapatkan hasilnya.

Untuk Prancercise Tracker, Anda akan membuat fungsi tunggal universal yang mengunduh sampel terbaru dari jenis apa pun. Dengan demikian, Anda dapat menggunakannya untuk berat dan tinggi badan.

Buka ProfileDataStore.swift dan tempel metode berikut ke dalam kelas, tepat di bawah metode 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) } 

Metode ini menggunakan jenis sampel (tinggi, berat, BMI, dll.). Dia kemudian membuat kueri untuk mengambil sampel terakhir untuk jenis ini. Jika Anda melihat jenis sampel untuk pertumbuhan, Anda akan kembali ke catatan pertumbuhan terakhir Anda.

Banyak yang terjadi di sini. Saya akan berhenti menjelaskan beberapa hal.

  1. Ada beberapa metode dalam HKQuery yang dapat membantu Anda memfilter contoh kueri HealthKit Anda. Dalam hal ini, kami menggunakan predikat tanggal bawaan.
  2. Meminta sampel dari HealthKit adalah proses yang tidak sinkron. Inilah sebabnya mengapa kode dalam handler penyelesaian ditemukan di dalam blok Pengiriman. Kepatuhan diperlukan di utas utama. Jika tidak, aplikasi akan gagal.

Jika semuanya berjalan dengan baik, permintaan Anda akan dieksekusi dan Anda akan mendapatkan sampel yang rapi dikembalikan pada utas utama , di mana ProfileViewController dapat meletakkan kontennya di label. Mari kita lakukan bagian ini sekarang.

Menampilkan sampel di antarmuka pengguna


Di bagian sebelumnya, Anda mengunduh data dari HealthKit . Simpan sebagai model di ProfileViewController , lalu perbarui konten dalam baris menggunakan metode ProfileViewController updateLabels ()

Yang harus Anda lakukan adalah memperluas proses ini dengan menambahkan fungsi yang memuat sampel, memprosesnya untuk antarmuka pengguna, dan kemudian memanggil updateLabels () untuk mengisi label dengan teks.

Buka file ProfileViewController.swift , cari metode loadAndDisplayMostRecentHeight ( ) dan rekatkan kode berikut:

 //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. Metode ini dimulai dengan membuat jenis sampel pertumbuhan. Dia kemudian meneruskan jenis sampel ini ke metode yang baru saja Anda tulis, yang akan mengembalikan sampel pertumbuhan pengguna terbaru yang dicatat dalam HealthKit.
  2. Segera setelah sampel kembali, pertumbuhan dikonversi ke meter dan disimpan dalam model UserHealthProfile. Kemudian UI akan memperbarui.

Catatan: Biasanya Anda ingin mengkonversi sampel kuantitas ke unit standar. Untuk melakukan ini, kode di atas menggunakan metode doubleValue (for :) , yang memungkinkan Anda untuk meneruskan data yang relevan yang Anda butuhkan (dalam hal ini, meter) ke HKUnit .

Anda dapat membuat berbagai jenis HKUnits menggunakan beberapa metode kelas umum yang tersedia melalui HealthKit . Untuk mendapatkan penghitung, Anda cukup menggunakan metode meter () di HKUnit , dan itulah yang Anda butuhkan.

Dengan pertumbuhan disortir. Bagaimana dengan beratnya? Semuanya sangat mirip, tetapi Anda harus mengisi metode loadAndDisplayMostRecentWeight () di ProfileViewController .

Rekatkan kode berikut ke dalam metode 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() } 

Anda membuat jenis sampel yang ingin Anda terima, meminta HealthKit untuk itu, melakukan beberapa konversi unit, menyimpannya dalam model Anda dan memperbarui antarmuka pengguna.

Saat ini, itu dapat menunjukkan bahwa pekerjaan sudah selesai, tetapi ada hal lain. Fungsi updateLabels () tidak mengetahui data baru yang Anda sediakan untuk itu.

Mari kita perbaiki.

Tambahkan baris berikut ke fungsi updateLabels () , tepat di bawah bagian tempat Anda memperluas golongan darah untuk menampilkannya di antarmuka pengguna:

 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) } 

Mengikuti templat asli dalam fungsi updateLabels () , ia memperluas tinggi, berat, dan indeks massa tubuh dalam model UserHealthProfile Anda. Jika tersedia, mereka menghasilkan garis yang sesuai dan menetapkannya ke label di layar pengguna.

MassFormatter dan LengthFormatter melakukan pekerjaan mengubah nilai Anda menjadi string.

Indeks massa tubuh sebenarnya tidak disimpan dalam model UserHealthProfile . Ini adalah properti yang dihitung yang melakukan perhitungan untuk Anda.

Klik pada properti bodyMassIndex dan Anda akan melihat apa yang saya maksud:

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

Indeks massa tubuh adalah properti opsional, yaitu, ia dapat mengembalikan nol jika Anda tidak menentukan tinggi atau berat badan (atau jika mereka diatur ke beberapa nomor yang tidak masuk akal). Perhitungan yang sebenarnya hanyalah berat dibagi dengan tinggi kuadrat.

Catatan: Segera Anda akan membenamkan diri dalam semua ini jika Anda belum menambahkan data ke HealthKit untuk dibaca oleh aplikasi. Jika Anda belum melakukannya, Anda harus membuat sampel tinggi dan berat badan, setidaknya.

Buka aplikasi Kesehatan dan buka tab Data Kesehatan. Di sana, pilih parameter Pengukuran Tubuh, lalu pilih Berat dan kemudian Tambahkan Data Point untuk menambahkan sampel berat baru. Ulangi proses untuk pertumbuhan.

Pada titik ini, Pelacak Prancercise harus dapat membaca sampel terbaru dari berat dan tinggi pengguna Anda, dan kemudian menampilkannya dalam teks.

Kompilasi dan jalankan aplikasi. Buka Profil & BMI . Kemudian klik tombol Baca Data HealthKit .

gambar

Luar biasa! Anda baru saja membaca sampel pertama Anda dari repositori HealthKit dan menggunakannya untuk menghitung BMI.

Menyimpan Sampel


Dalam Prancercise Tracker sudah memiliki indeks massa tubuh kalkulator berguna. Mari kita gunakan untuk merekam sampel BMI pengguna Anda.

Buka ProfileDataStore.swift dan tambahkan metode berikut:

 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") } } } 

Seperti jenis sampel lainnya, Anda harus terlebih dahulu memastikan bahwa jenis sampel tersedia di HealthKit .

  1. Dalam hal ini, kode memeriksa apakah ada jenis kuantitas untuk indeks massa tubuh. Jika demikian, maka itu digunakan untuk membuat sampel kuantitas. Jika tidak, aplikasi berhenti berfungsi.
  2. count() HKUnit , , . - , , .
  3. HKHealthStore , . , .

Hampir selesai. Untuk meringkas antarmuka pengguna.

Buka ProfileViewController.swif , temukan metode saveBodyMassIndexToHealthKit ( ). Metode ini dipanggil ketika pengguna mengklik tombol Simpan BMI di tabel.

Rekatkan kode berikut ke dalam metode:

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

Anda ingat bahwa indeks massa tubuh adalah properti yang dihitung yang mengembalikan nilai ketika sampel tinggi dan berat diambil dari HealthKit . Kode ini mencoba menghitung properti ini, dan jika memungkinkan, ia akan diteruskan ke metode saveBodyMassIndexSample (bodyMassIndex: date :) yang baru saja Anda tulis.

Ini juga menunjukkan peringatan yang nyaman jika indeks massa tubuh tidak dapat dihitung karena alasan apa pun.

Kompilasi dan jalankan aplikasi. Pergi ke layar Profile & BMI . Unduh data dari HeathKit , lalu klik tombol Simpan BMI.

Lihatlah konsolnya. Apakah kamu melihatnya?

    BMI 

Jika demikian, selamat! Sampel BMI Anda sekarang disimpan di repositori pusat HealthKit . Mari kita lihat apakah kita dapat menemukannya.

Buka aplikasi Kesehatan, ketuk tab Data Kesehatan, klik Pengukuran Tubuh pada tampilan tabel, lalu klik Indeks Massa Tubuh.

gambar

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


All Articles