Bagikan melalui


HealthKit di Xamarin.iOS

Health Kit menyediakan datastore yang aman untuk informasi terkait kesehatan pengguna. Aplikasi Kit Kesehatan dapat, dengan izin eksplisit pengguna, membaca dan menulis ke datastore ini dan menerima pemberitahuan saat data terkait ditambahkan. App dapat menyajikan data, atau pengguna dapat menggunakan app Kesehatan yang disediakan Apple untuk melihat dasbor semua data mereka.

Karena data terkait kesehatan sangat sensitif dan penting, Health Kit sangat diketik, dengan unit pengukuran dan hubungan eksplisit dengan jenis informasi yang dicatat (misalnya, tingkat glukosa darah atau denyut jantung). Selain itu, aplikasi Health Kit harus menggunakan hak eksplisit, harus meminta akses ke jenis informasi tertentu, dan pengguna harus secara eksplisit memberikan akses aplikasi ke jenis data tersebut.

Artikel ini akan memperkenalkan:

  • Persyaratan keamanan Health Kit, termasuk provisi aplikasi dan meminta izin pengguna untuk mengakses database Health Kit;
  • Sistem jenis Health Kit, yang meminimalkan kemungkinan salah menerapkan atau salah menafsirkan data;
  • Menulis ke datastore Health Kit bersama di seluruh sistem.

Artikel ini tidak akan membahas topik yang lebih canggih, seperti mengkueri database, mengonversi antara satuan ukuran, atau menerima pemberitahuan data baru.

Dalam artikel ini, kita akan membuat aplikasi sampel untuk merekam denyut jantung pengguna:

Aplikasi sampel untuk merekam denyut jantung pengguna

Persyaratan

Berikut ini diperlukan untuk menyelesaikan langkah-langkah yang disajikan dalam artikel ini:

  • Xcode 7 dan iOS 8 (atau lebih besar) – API Xcode dan iOS terbaru Apple perlu diinstal dan dikonfigurasi di komputer pengembang.
  • Visual Studio untuk Mac atau Visual Studio – Versi terbaru Visual Studio untuk Mac harus diinstal dan dikonfigurasi di komputer pengembang.
  • Perangkat iOS 8 (atau lebih besar) – Perangkat iOS yang menjalankan versi terbaru iOS 8 atau lebih tinggi untuk pengujian.

Penting

Health Kit diperkenalkan di iOS 8. Saat ini, Health Kit tidak tersedia di simulator iOS, dan penelusuran kesalahan memerlukan koneksi ke perangkat iOS fisik.

Membuat dan Memprovisikan Aplikasi Kit Kesehatan

Sebelum aplikasi Xamarin iOS 8 dapat menggunakan Api HealthKit, aplikasi harus dikonfigurasi dan disediakan dengan benar. Bagian ini akan membahas langkah-langkah yang diperlukan untuk menyiapkan Aplikasi Xamarin Anda dengan benar.

Aplikasi Kit Kesehatan memerlukan:

  • ID Aplikasi eksplisit.
  • Profil Provisi yang terkait dengan ID Aplikasi eksplisit tersebut dan dengan izin Health Kit.
  • Dengan Entitlements.plist com.apple.developer.healthkit properti jenis Boolean diatur ke Yes.
  • Kunci Info.plist yang UIRequiredDeviceCapabilities berisi entri dengan String nilai healthkit.
  • juga Info.plist harus memiliki entri penjelasan privasi yang sesuai: String penjelasan untuk kunci NSHealthUpdateUsageDescription jika aplikasi akan menulis data dan String penjelasan untuk kunci NSHealthShareUsageDescription jika aplikasi akan membaca data Health Kit.

Untuk mengetahui selengkapnya tentang provisi aplikasi iOS, artikel Provisi Perangkat di seri Memulai Xamarin menjelaskan hubungan antara Sertifikat Pengembang, ID Aplikasi, Profil Provisi, dan Pemberian Izin Aplikasi.

ID Aplikasi Eksplisit dan Profil Provisi

Pembuatan ID Aplikasi eksplisit dan Profil Provisi yang sesuai dilakukan dalam Pusat Dev iOS Apple.

ID Aplikasi Anda saat ini tercantum dalam bagian Sertifikat, Pengidentifikasi , & Profil di Pusat Dev. Seringkali, daftar ini akan menampilkan nilai *ID , yang menunjukkan bahwa Nama ID - Aplikasi dapat digunakan dengan sejumlah akhiran. ID Aplikasi Wildcard tersebut tidak dapat digunakan dengan Kit Kesehatan.

Untuk membuat ID Aplikasi eksplisit, klik tombol + di kanan atas untuk membawa Anda ke halaman Daftarkan ID Aplikasi iOS:

Mendaftarkan aplikasi di Portal Pengembang Apple

Seperti yang ditunjukkan pada gambar di atas, setelah membuat deskripsi aplikasi, gunakan bagian ID Aplikasi Eksplisit untuk membuat ID untuk aplikasi Anda. Di bagian App Services , periksa Kit Kesehatan di bagian Aktifkan Layanan .

Setelah selesai, tekan tombol Lanjutkan untuk mendaftarkan ID Aplikasi di akun Anda. Anda akan dibawa kembali ke halaman Sertifikat, Pengidentifikasi, dan Profil . Klik Profil Provisi untuk membawa Anda ke daftar profil provisi Anda saat ini, dan klik + tombol di sudut kanan atas untuk membawa Anda ke halaman Tambahkan Profil Provisi iOS. Pilih opsi Pengembangan Aplikasi iOS dan klik Lanjutkan untuk masuk ke halaman Pilih ID Aplikasi. Di sini, pilih ID Aplikasi eksplisit yang sebelumnya Anda tentukan:

Pilih ID Aplikasi eksplisit

Klik Lanjutkan dan kerjakan layar yang tersisa, tempat Anda akan menentukan Sertifikat Pengembang, Perangkat, dan Nama untuk Profil Provisi ini:

Membuat Profil Provisi

Klik Buat dan tunggu pembuatan profil Anda. Unduh file dan klik dua kali untuk menginstal di Xcode. Anda dapat mengonfirmasi penginstalannya di bawah Detail Tampilan Akun > Preferensi > Xcode>... Anda akan melihat profil provisi yang baru saja diinstal, dan profil tersebut harus memiliki ikon untuk Kit Kesehatan dan layanan khusus lainnya di baris Pemberian Izinnya:

Menampilkan profil di Xcode

Mengaitkan ID Aplikasi dan Profil Provisi Dengan Aplikasi Xamarin.iOS Anda

Setelah Anda membuat dan menginstal Profil Provisi yang sesuai seperti yang dijelaskan, biasanya saatnya untuk membuat solusi di Visual Studio untuk Mac atau Visual Studio. Akses Health Kit tersedia untuk proyek iOS C# atau F# apa pun.

Daripada menelusuri proses pembuatan proyek Xamarin iOS 8 secara bersamaan, buka aplikasi sampel yang dilampirkan ke artikel ini (yang mencakup Storyboard dan kode bawaan). Untuk mengaitkan aplikasi sampel dengan Profil Provisi yang diaktifkan Kit Kesehatan Anda, di Pad Solusi, klik kanan pada Proyek Anda dan munculkan dialog Opsinya. Beralih ke panel Aplikasi iOS dan masukkan ID Aplikasi eksplisit yang Anda buat sebelumnya sebagai Pengidentifikasi Bundel aplikasi:

Masukkan ID Aplikasi eksplisit

Sekarang beralih ke panel Penandatanganan Bundel iOS. Profil Provisi yang baru-baru ini diinstal, dengan asosiasinya ke ID Aplikasi eksplisit, sekarang akan tersedia sebagai Profil Provisi:

Pilih Profil Provisi

Jika Profil Provisi tidak tersedia, periksa kembali Pengidentifikasi Bundel di panel Aplikasi iOS versus yang ditentukan di iOS Dev Center dan bahwa Profil Provisi diinstal (Detail Tampilan Akun > Preferensi > Xcode>...).

Saat Profil Provisi yang diaktifkan Kit Kesehatan dipilih, klik OK untuk menutup dialog Opsi Proyek.

Nilai Entitlements.plist dan Info.plist

Aplikasi sampel menyertakan Entitlements.plist file (yang diperlukan untuk aplikasi yang diaktifkan Health Kit), dan tidak disertakan dalam setiap Templat Proyek. Jika proyek Anda tidak menyertakan hak, klik kanan pada proyek Anda, pilih File > Baru... > iOS > Entitlements.plist untuk menambahkannya secara manual.

Pada akhirnya, Anda Entitlements.plist harus memiliki pasangan kunci dan nilai berikut:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.developer.HealthKit</key>
    <true/>
</dict>
</plist>

Demikian pula, Info.plist untuk aplikasi harus memiliki nilai healthkit yang terkait dengan UIRequiredDeviceCapabilities kunci:

<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
    <string>healthkit</string>
</array>

Aplikasi sampel yang disediakan dengan artikel ini mencakup prakonfigurasi Entitlements.plist yang mencakup semua kunci yang diperlukan.

Kit Kesehatan Pemrograman

Datastore Health Kit adalah datastore pribadi khusus pengguna yang dibagikan di antara aplikasi. Karena informasi kesehatan sangat sensitif, pengguna harus mengambil langkah-langkah positif untuk mengizinkan akses data. Akses ini mungkin sebagian (tulis tetapi tidak dibaca, akses untuk beberapa jenis data tetapi tidak yang lain, dll.) dan dapat dicabut kapan saja. Aplikasi Health Kit harus ditulis secara defensif, dengan pemahaman bahwa banyak pengguna akan ragu untuk menyimpan informasi terkait kesehatan mereka.

Data Kit Kesehatan terbatas pada jenis yang ditentukan Apple. Jenis-jenis ini didefinisikan secara ketat: beberapa, seperti jenis darah, terbatas pada nilai tertentu dari enumerasi yang disediakan Apple, sementara yang lain menggabungkan besaran dengan satuan ukuran (seperti gram, kalori, dan liter). Bahkan data yang berbagi unit pengukuran yang kompatibel dibedakan oleh mereka HKObjectType; misalnya, sistem jenis akan menangkap upaya yang HKQuantityTypeIdentifier.NumberOfTimesFallen keliru untuk menyimpan nilai ke bidang yang HKQuantityTypeIdentifier.FlightsClimbed mengharapkan meskipun keduanya menggunakan HKUnit.Count satuan ukuran.

Jenis yang dapat disimpan di datastore Health Kit adalah semua subkelas dari HKObjectType. HKCharacteristicType objek menyimpan Jenis Kelamin Biologis, Jenis Darah, dan Tanggal Lahir. Namun, yang lebih umum adalah HKSampleType objek, yang mewakili data yang diambil sampelnya pada waktu tertentu atau dalam jangka waktu tertentu.

Bagan objek HKSampleType

HKSampleType abstrak dan memiliki empat subkelas beton. Saat ini hanya ada satu jenis HKCategoryType data, yaitu Analisis Tidur. Sebagian besar data dalam Kit Kesehatan berjenis HKQuantityType dan menyimpan data mereka dalam HKQuantitySample objek, yang dibuat menggunakan pola desain Factory yang sudah dikenal:

Sebagian besar data dalam Kit Kesehatan berjenis HKQuantityType dan menyimpan datanya di objek HKQuantitySample

HKQuantityType jenis berkisar dari HKQuantityTypeIdentifier.ActiveEnergyBurned hingga HKQuantityTypeIdentifier.StepCount.

Meminta Izin Dari Pengguna

Pengguna akhir harus mengambil langkah-langkah positif untuk memungkinkan aplikasi membaca atau menulis data Health Kit. Ini dilakukan melalui aplikasi Kesehatan yang telah diinstal sebelumnya di perangkat iOS 8. Saat pertama kali aplikasi Health Kit dijalankan, pengguna disajikan dengan dialog Akses Kesehatan yang dikontrol sistem:

Pengguna disajikan dengan dialog Akses Kesehatan yang dikontrol sistem

Nantinya, pengguna dapat mengubah izin menggunakan dialog Sumber aplikasi Kesehatan:

Pengguna dapat mengubah izin menggunakan dialog Sumber aplikasi Kesehatan

Karena informasi kesehatan sangat sensitif, pengembang aplikasi harus menulis program mereka secara defensif, dengan harapan bahwa izin akan ditolak dan diubah saat aplikasi berjalan. Idiom yang paling umum adalah meminta izin dalam UIApplicationDelegate.OnActivated metode dan kemudian memodifikasi antarmuka pengguna yang sesuai.

Panduan Izin

Dalam proyek yang disediakan Health Kit Anda, buka AppDelegate.cs file . Perhatikan pernyataan menggunakan HealthKit; di bagian atas file.

Kode berikut berkaitan dengan izin Health Kit:

private HKHealthStore healthKitStore = new HKHealthStore ();

public override void OnActivated (UIApplication application)
{
        base.OnActivated(application);
        ValidateAuthorization ();
}

private void ValidateAuthorization ()
{
        var heartRateId = HKQuantityTypeIdentifierKey.HeartRate;
        var heartRateType = HKObjectType.GetQuantityType (heartRateId);
        var typesToWrite = new NSSet (new [] { heartRateType });
        var typesToRead = new NSSet ();
        healthKitStore.RequestAuthorizationToShare (
                typesToWrite, 
                typesToRead, 
                ReactToHealthCarePermissions);
}

void ReactToHealthCarePermissions (bool success, NSError error)
{
        var access = healthKitStore.GetAuthorizationStatus (HKObjectType.GetQuantityType (HKQuantityTypeIdentifierKey.HeartRate));
        if (access.HasFlag (HKAuthorizationStatus.SharingAuthorized)) {
                HeartRateModel.Instance.Enabled = true;
        } else {
                HeartRateModel.Instance.Enabled = false;
        }
}

Semua kode dalam metode ini dapat dilakukan sebaris di OnActivated, tetapi aplikasi sampel menggunakan metode terpisah untuk membuat niat mereka lebih jelas: ValidateAuthorization() memiliki langkah-langkah yang diperlukan untuk meminta akses ke jenis tertentu yang ditulis (dan dibaca, jika aplikasi diinginkan) dan ReactToHealthCarePermissions() merupakan panggilan balik yang diaktifkan setelah pengguna berinteraksi dengan dialog izin di Health.app.

Tugasnya ValidateAuthorization() adalah membangun set HKObjectTypes aplikasi yang akan menulis dan meminta otorisasi untuk memperbarui data tersebut. Di aplikasi sampel, HKObjectType adalah untuk kunci KHQuantityTypeIdentifierKey.HeartRate. Jenis ini ditambahkan ke set typesToWrite, sementara set typesToRead dibiarkan kosong. Set ini, dan referensi ke ReactToHealthCarePermissions() panggilan balik, diteruskan ke HKHealthStore.RequestAuthorizationToShare().

Panggilan ReactToHealthCarePermissions() balik akan dipanggil setelah pengguna berinteraksi dengan dialog izin dan diteruskan dua bagian informasi: bool nilai yang akan terjadi true jika pengguna telah berinteraksi dengan dialog izin dan NSError yang, jika tidak null, menunjukkan beberapa jenis kesalahan yang terkait dengan menyajikan dialog izin.

Penting

Agar jelas tentang argumen untuk fungsi ini: parameter keberhasilan dan kesalahan tidak menunjukkan apakah pengguna telah memberikan izin untuk mengakses data Health Kit! Mereka hanya menunjukkan bahwa pengguna telah diberi kesempatan untuk mengizinkan akses ke data.

Untuk mengonfirmasi apakah aplikasi memiliki akses ke data, yang HKHealthStore.GetAuthorizationStatus() digunakan, meneruskan HKQuantityTypeIdentifierKey.HeartRate. Berdasarkan status yang dikembalikan, aplikasi mengaktifkan atau menonaktifkan kemampuan untuk memasukkan data. Tidak ada pengalaman pengguna standar untuk menangani penolakan akses dan ada banyak opsi yang mungkin. Dalam contoh aplikasi, status diatur pada HeartRateModel objek singleton yang, pada gilirannya, meningkatkan peristiwa yang relevan.

Model, Tampilan, dan Pengontrol

Untuk meninjau HeartRateModel objek singleton, buka HeartRateModel.cs file:

using System;
using HealthKit;
using Foundation;

namespace HKWork
{
        public class GenericEventArgs<T> : EventArgs
        {
                public T Value { get; protected set; }
                public DateTime Time { get; protected set; }

                public GenericEventArgs (T value)
                {
                        this.Value = value;
                        Time = DateTime.Now;
                }
        }

        public delegate void GenericEventHandler<T> (object sender,GenericEventArgs<T> args);

        public sealed class HeartRateModel : NSObject
        {
                private static volatile HeartRateModel singleton;
                private static object syncRoot = new Object ();

                private HeartRateModel ()
                {
                }

                public static HeartRateModel Instance {
                        get {
                                //Double-check lazy initialization
                                if (singleton == null) {
                                        lock (syncRoot) {
                                                if (singleton == null) {
                                                        singleton = new HeartRateModel ();
                                                }
                                        }
                                }

                                return singleton;
                        }
                }

                private bool enabled = false;

                public event GenericEventHandler<bool> EnabledChanged;
                public event GenericEventHandler<String> ErrorMessageChanged;
                public event GenericEventHandler<Double> HeartRateStored;

                public bool Enabled { 
                        get { return enabled; }
                        set {
                                if (enabled != value) {
                                        enabled = value;
                                        InvokeOnMainThread(() => EnabledChanged (this, new GenericEventArgs<bool>(value)));
                                }
                        }
                }

                public void PermissionsError(string msg)
                {
                        Enabled = false;
                        InvokeOnMainThread(() => ErrorMessageChanged (this, new GenericEventArgs<string>(msg)));
                }

                //Converts its argument into a strongly-typed quantity representing the value in beats-per-minute
                public HKQuantity HeartRateInBeatsPerMinute(ushort beatsPerMinute)
                {
                        var heartRateUnitType = HKUnit.Count.UnitDividedBy (HKUnit.Minute);
                        var quantity = HKQuantity.FromQuantity (heartRateUnitType, beatsPerMinute);

                        return quantity;
                }
                        
                public void StoreHeartRate(HKQuantity quantity)
                {
                        var bpm = HKUnit.Count.UnitDividedBy (HKUnit.Minute);
                        //Confirm that the value passed in is of a valid type (can be converted to beats-per-minute)
                        if (! quantity.IsCompatible(bpm))
                        {
                                InvokeOnMainThread(() => ErrorMessageChanged(this, new GenericEventArgs<string> ("Units must be compatible with BPM")));
                        }

                        var heartRateId = HKQuantityTypeIdentifierKey.HeartRate;
                        var heartRateQuantityType = HKQuantityType.GetQuantityType (heartRateId);
                        var heartRateSample = HKQuantitySample.FromType (heartRateQuantityType, quantity, new NSDate (), new NSDate (), new HKMetadata());

                        using (var healthKitStore = new HKHealthStore ()) {
                                healthKitStore.SaveObject (heartRateSample, (success, error) => {
                                        InvokeOnMainThread (() => {
                                                if (success) {
                                                        HeartRateStored(this, new GenericEventArgs<Double>(quantity.GetDoubleValue(bpm)));
                                                } else {
                                                        ErrorMessageChanged(this, new GenericEventArgs<string>("Save failed"));
                                                }
                                                if (error != null) {
                                                        //If there's some kind of error, disable 
                                                        Enabled = false;
                                                        ErrorMessageChanged (this, new GenericEventArgs<string>(error.ToString()));
                                                }
                                        });
                                });
                        }
                }
        }
}

Bagian pertama adalah kode boilerplate untuk membuat peristiwa dan handler generik. Bagian HeartRateModel awal kelas juga boilerplate untuk membuat objek singleton aman utas.

Kemudian, HeartRateModel mengekspos 3 peristiwa:

  • EnabledChanged - Menunjukkan bahwa penyimpanan denyut jantung telah diaktifkan atau dinonaktifkan (perhatikan bahwa penyimpanan awalnya dinonaktifkan).
  • ErrorMessageChanged - Untuk aplikasi sampel ini, kami memiliki model penanganan kesalahan yang sangat sederhana: string dengan kesalahan terakhir .
  • HeartRateStored - Dinaikkan ketika detak jantung disimpan dalam database Kit Kesehatan.

Perhatikan bahwa setiap kali peristiwa ini diaktifkan, itu dilakukan melalui NSObject.InvokeOnMainThread(), yang memungkinkan pelanggan untuk memperbarui UI. Atau, peristiwa dapat didokumentasikan sebagai dinaikkan pada utas latar belakang dan tanggung jawab untuk memastikan kompatibilitas dapat diserahkan kepada penangan mereka. Pertimbangan utas penting dalam aplikasi Health Kit karena banyak fungsi, seperti permintaan izin, asinkron dan menjalankan panggilan balik mereka pada utas non-utama.

Kode khusus Heath Kit ada dalam HeartRateModel dua fungsi HeartRateInBeatsPerMinute() dan StoreHeartRate().

HeartRateInBeatsPerMinute() mengonversi argumennya menjadi Kit HKQuantityKesehatan yang sangat ditik . Jenis kuantitas adalah yang ditentukan oleh HKQuantityTypeIdentifierKey.HeartRate dan unit kuantitas HKUnit.Count dibagi dengan (dengan HKUnit.Minute kata lain, unit berdetak per menit).

Fungsi mengambil StoreHeartRate() HKQuantity (dalam aplikasi sampel, satu dibuat oleh HeartRateInBeatsPerMinute() ). Untuk memvalidasi datanya, ia menggunakan HKQuantity.IsCompatible() metode , yang mengembalikan true jika unit objek dapat dikonversi menjadi unit dalam argumen. Jika kuantitas dibuat dengan HeartRateInBeatsPerMinute() ini jelas akan mengembalikan true, tetapi juga akan kembali true jika kuantitas dibuat sebagai, misalnya, Beats Per Hour. Lebih umum, HKQuantity.IsCompatible() dapat digunakan untuk memvalidasi massa, jarak, dan energi yang mungkin dimasukkan atau ditampilkan pengguna atau perangkat dalam satu sistem pengukuran (seperti unit Kekaisaran) tetapi yang mungkin disimpan di sistem lain (seperti unit metrik).

Setelah kompatibilitas kuantitas divalidasi, HKQuantitySample.FromType() metode pabrik digunakan untuk membuat objek yang diketik heartRateSample dengan kuat. HKSample objek memiliki tanggal mulai dan berakhir; untuk pembacaan seketika, nilai-nilai ini harus sama, seperti dalam contoh. Sampel juga tidak mengatur data nilai kunci dalam argumennya HKMetadata , tetapi seseorang dapat menggunakan kode seperti kode berikut untuk menentukan lokasi sensor:

var hkm = new HKMetadata();
hkm.HeartRateSensorLocation = HKHeartRateSensorLocation.Chest;

heartRateSample Setelah dibuat, kode membuat koneksi baru ke database dengan blok penggunaan. Dalam blok itu HKHealthStore.SaveObject() , metode mencoba penulisan asinkron ke database. Panggilan yang dihasilkan ke ekspresi lambda memicu peristiwa yang relevan, baik HeartRateStored atau ErrorMessageChanged.

Sekarang setelah model telah diprogram, saatnya untuk melihat bagaimana pengontrol mencerminkan status model. HKWorkViewController.cs Buka file. Konstruktor hanya menghubungkan HeartRateModel metode singleton ke penanganan peristiwa (sekali lagi, ini dapat dilakukan sebaris dengan ekspresi lambda, tetapi metode terpisah membuat niat sedikit lebih jelas):

public HKWorkViewController (IntPtr handle) : base (handle)
{
     HeartRateModel.Instance.EnabledChanged += OnEnabledChanged;
     HeartRateModel.Instance.ErrorMessageChanged += OnErrorMessageChanged;
     HeartRateModel.Instance.HeartRateStored += OnHeartBeatStored;
}

Berikut adalah handler yang relevan:

void OnEnabledChanged (object sender, GenericEventArgs<bool> args)
{
        StoreData.Enabled = args.Value;
        PermissionsLabel.Text = args.Value ? "Ready to record" : "Not authorized to store data.";
        PermissionsLabel.SizeToFit ();
}

void OnErrorMessageChanged (object sender, GenericEventArgs<string> args)
{
        PermissionsLabel.Text = args.Value;
}

void OnHeartBeatStored (object sender, GenericEventArgs<double> args)
{
        PermissionsLabel.Text = String.Format ("Stored {0} BPM", args.Value);
}

Jelas, dalam aplikasi dengan satu pengontrol, dimungkinkan untuk menghindari pembuatan objek model terpisah dan penggunaan peristiwa untuk alur kontrol, tetapi penggunaan objek model lebih tepat untuk aplikasi dunia nyata.

Menjalankan aplikasi sampel

Simulator iOS tidak mendukung Health Kit. Penelusuran kesalahan harus dilakukan pada perangkat fisik yang menjalankan iOS 8.

Lampirkan perangkat pengembangan iOS 8 yang disediakan dengan benar ke sistem Anda. Pilih sebagai target penyebaran di Visual Studio untuk Mac dan dari menu pilih Jalankan > Debug.

Penting

Kesalahan yang berkaitan dengan provisi akan muncul pada saat ini. Untuk memecahkan masalah kesalahan, tinjau bagian Membuat dan Menyediakan Aplikasi Kit Kesehatan di atas. Komponennya adalah:

  • iOS Dev Center - ID Aplikasi Eksplisit & Profil Provisi yang diaktifkan Kit Kesehatan.
  • Opsi Proyek - Pengidentifikasi Bundel (ID Aplikasi eksplisit) & Profil Provisi.
  • Kode sumber - Entitlements.plist & Info.plist

Dengan asumsi bahwa ketentuan telah ditetapkan dengan benar, aplikasi Anda akan dimulai. Ketika mencapai metodenya OnActivated , ia akan meminta otorisasi Health Kit. Pertama kali ini ditemui oleh sistem operasi, pengguna Anda akan disajikan dengan dialog berikut:

Pengguna akan disajikan dengan dialog ini

Aktifkan aplikasi Anda untuk memperbarui data Heart Rate dan aplikasi Anda akan muncul kembali. Panggilan ReactToHealthCarePermissions balik akan diaktifkan secara asinkron. Ini akan menyebabkan HeartRateModel’s Enabled properti berubah, yang akan meningkatkan EnabledChanged peristiwa, yang akan menyebabkan HKPermissionsViewController.OnEnabledChanged() penanganan aktivitas berjalan, yang memungkinkan tombol StoreData . Diagram berikut menunjukkan urutannya:

Diagram ini menunjukkan urutan peristiwa

Tekan tombol Rekam . Ini akan menyebabkan StoreData_TouchUpInside() handler berjalan, yang akan mencoba mengurai nilai heartRate bidang teks, mengonversi menjadi HKQuantity melalui fungsi yang dibahas sebelumnya dan meneruskan HeartRateModel.HeartRateInBeatsPerMinute() kuantitas tersebut ke HeartRateModel.StoreHeartRate(). Seperti yang dibahas sebelumnya, ini akan mencoba menyimpan data dan akan menaikkan atau HeartRateStored ErrorMessageChanged peristiwa.

Klik dua kali tombol Beranda di perangkat Anda dan buka aplikasi Kesehatan. Klik tab Sumber dan Anda akan melihat aplikasi sampel tercantum. Pilih dan larang izin untuk memperbarui data denyut jantung. Klik dua kali tombol Beranda dan beralih kembali ke aplikasi Anda. Sekali lagi, ReactToHealthCarePermissions() akan dipanggil, tetapi kali ini, karena akses ditolak, tombol StoreData akan dinonaktifkan (perhatikan bahwa ini terjadi secara asinkron dan perubahan antarmuka pengguna mungkin terlihat oleh pengguna akhir).

Topik tingkat lanjut

Membaca data dari database Health Kit sangat mirip dengan menulis data: satu menentukan jenis data yang coba diakses, meminta otorisasi, dan jika otorisasi tersebut diberikan, data tersedia, dengan konversi otomatis ke unit ukuran yang kompatibel.

Ada sejumlah fungsi kueri yang lebih canggih yang memungkinkan kueri dan kueri berbasis predikat yang melakukan pembaruan saat data yang relevan diperbarui.

Pengembang aplikasi Health Kit harus meninjau bagian Kit Kesehatan dari Panduan Tinjauan Aplikasi Apple.

Setelah model keamanan dan sistem jenis dipahami, menyimpan dan membaca data dalam database Health Kit bersama cukup mudah. Banyak fungsi dalam Health Kit beroperasi secara asinkron dan pengembang aplikasi harus menulis program mereka dengan tepat.

Pada penulisan artikel ini, saat ini tidak ada yang setara dengan Health Kit di Android atau Windows Phone.

Ringkasan

Dalam artikel ini kita telah melihat bagaimana Health Kit memungkinkan aplikasi untuk menyimpan, mengambil, dan berbagi informasi terkait kesehatan, sekaligus menyediakan aplikasi Kesehatan standar yang memungkinkan pengguna mengakses dan mengontrol data ini.

Kami juga telah melihat bagaimana privasi, keamanan, dan integritas data mengesampingkan kekhawatiran akan informasi dan aplikasi terkait kesehatan menggunakan Health Kit harus menangani peningkatan kompleksitas dalam aspek manajemen aplikasi (provisi), pengodean (sistem jenis Kit Kesehatan), dan pengalaman pengguna (kontrol pengguna izin melalui dialog sistem dan aplikasi Kesehatan).

Terakhir, kami telah melihat implementasi sederhana Health Kit menggunakan aplikasi sampel yang disertakan yang menulis data heartbeat ke penyimpanan Health Kit dan memiliki desain sadar asinkron.