Xamarin. iOS içinde HealthKit

Sistem durumu seti, kullanıcının sistem durumuyla ilgili bilgiler için güvenli bir veri deposu sağlar. Sistem durumu seti uygulamaları, kullanıcının açık izniyle bu veri deposuna okuma ve yazma ve ilgili veriler eklendiğinde bildirim alma olabilir. Uygulamalar verileri sunabilir veya kullanıcının tüm verilerinin bir panosunu görüntülemek için Apple 'ın belirtilen sistem durumu uygulamasını kullanabilir.

Sağlık ile ilgili veriler bu kadar hassas ve önemli olduğundan, sistem durumu kiti ölçü birimleri ve Kaydedilmekte olan bilgilerin türüyle açık bir ilişki ile kesin bir şekilde türdedir (örneğin, kan şekeri düzeyi veya kalp oranı). Ayrıca, sistem durumu seti uygulamaları açık yetkilendirmeler kullanmalıdır, belirli bilgi türlerine erişim istemesi gerekir ve kullanıcının uygulamaya bu tür veriler için açıkça erişim vermesi gerekir.

Bu makalede şunları öğreneceksiniz:

  • Health Kit veritabanına erişmek için uygulama sağlama ve Kullanıcı izni isteme dahil olmak üzere sistem durumu seti 'nin güvenlik gereksinimleri;
  • Sistem durumu setinin tür sistemi, verilerin yanlış uygulanması veya hatalı yorumlanma olasılığını en aza indirir;
  • Paylaşılan, sistem genelinde sistem durumu seti veri deposuna yazma.

Bu makalede, veritabanını sorgulama, ölçü birimleri arasında dönüştürme veya yeni verilerin bildirimlerini alma gibi daha gelişmiş konular ele alınacaktır.

Bu makalede, kullanıcının kalp oranını kaydetmek için bir örnek uygulama oluşturacağız:

Kullanıcı kalp oranını kaydetmek için örnek bir uygulama

Gereksinimler

Bu makalede sunulan adımları tamamlayabilmeniz için aşağıdakiler gereklidir:

  • Xcode 7 ve iOS 8 (veya üzeri) – Apple 'ın en son Xcode ve IOS API 'lerinin geliştiricinin bilgisayarında yüklü ve yapılandırılmış olması gerekir.
  • Mac için Visual Studio veya Visual Studio – en son Mac için Visual Studio sürümü geliştiricinin bilgisayarında yüklü ve yapılandırılmış olmalıdır.
  • iOS 8 (veya üzeri) cihaz : iOS 8 ' in en son sürümünü çalıştıran bir iOS cihazı veya test için daha fazla.

Önemli

Health Kit, iOS 8 ' de kullanıma sunulmuştur. Şu anda, sistem durumu kiti iOS simülatörü üzerinde kullanılamıyor ve hata ayıklama bir fiziksel iOS cihazına bağlantı gerektiriyor.

Health Kit uygulaması oluşturma ve sağlama

Xamarin iOS 8 uygulamasının HealthKit API 'sini kullanabilmesi için, doğru şekilde yapılandırılması ve sağlanması gerekir. Bu bölüm, Xamarin uygulamanızı düzgün şekilde ayarlamak için gereken adımları ele alınmaktadır.

Health Kit Uygulamaları şunları gerektirir:

  • Açık uygulama kimliği.
  • Bu açık uygulama kimliğiyle ve sistem durumu seti Izinleriyle ilişkili bir sağlama profili .
  • Entitlements.plistcom.apple.developer.healthkit Türünde, özelliği Boolean olarak ayarlanmış bir Yes .
  • Info.plistUIRequiredDeviceCapabilities Anahtarı değerine sahip bir giriş içeren bir anahtar Stringhealthkit .
  • Info.plistAyrıca, uygun gizlilik-açıklama girişlerine sahip olmalıdır: uygulama, StringNSHealthUpdateUsageDescriptionStringNSHealthShareUsageDescription sistem durumu seti verilerini okuyabiliyorsa, anahtar için bir açıklama ve uygulamanın veri yazması durumunda anahtar için bir açıklama.

İOS uygulaması sağlama hakkında daha fazla bilgi edinmek için Xamarin 'in Başlangıç serisinde cihaz sağlama makalesi geliştirici sertifikaları, uygulama kimlikleri, sağlama profilleri ve uygulama yetkilendirmeleri arasındaki ilişkiyi açıklar.

Açık uygulama KIMLIĞI ve sağlama profili

açık uygulama kimliği ve uygun bir sağlama profili oluşturma, Apple 'ın iOS Geliştirme Merkeziiçinde yapılır.

geçerli uygulama kimlikleriniz Geliştirme Merkezi sertifikalar, tanımlayıcılar profilleri bölümünde listelenir. Genellikle, bu liste, uygulama kimliğiadının herhangi bir sayıda sonek ile kullanılabileceğini gösteren kimlik değerlerini gösterir. Bu joker karakter uygulama kimlikleri Health Kit ile kullanılamaz.

Açık uygulama kimliğioluşturmak için sağ üst köşedeki düğmeye TıKLAYARAK iOS uygulama kimliğini kaydet sayfasına götürün:

Apple Geliştirici Portalında uygulama kaydetme

Yukarıdaki görüntüde gösterildiği gibi, uygulama açıklaması oluşturduktan sonra uygulamanız için bir KIMLIK oluşturmak üzere açık uygulama kimliği bölümünü kullanın. Uygulama hizmetleri bölümünde Hizmetleri etkinleştir bölümünde sistem durumu kiti ' ni denetleyin.

İşiniz bittiğinde, hesabınıza uygulama kimliğini kaydetmek için devam düğmesine basın. Sertifikalar, tanımlayıcılar ve profiller sayfasına geri getirilecektir. Kaynak sağlama profillerinizin listesine gitmek için sağlama profilleri ' ne tıklayın ve ardından sizi iOS sağlama profili Ekle sayfasına götürmek için sağ üst köşedeki düğmeye tıklayın. IOS uygulama geliştirme seçeneğini belirleyin ve uygulama kimliği Seç sayfasına ulaşmak için devam ' a tıklayın. Burada, daha önce belirttiğiniz açık uygulama kimliğini seçin:

Açık uygulama KIMLIĞINI seçin

Devam ' a tıklayın ve Geliştirici sertifikalarınızı, cihazınızıve bu sağlama profiliiçin bir ad belirlediğiniz geri kalan ekranlarda çalışın:

Sağlama profili oluşturuluyor

Oluştur ' a tıklayın ve profilinizin oluşturulmasını bekler. Dosyayı indirin ve Xcode 'da yüklemek için çift tıklayın. Bu yüklemenin Xcode tercihleri > hesaplarının görünüm ayrıntıları bölümünde olduğunu doğrulayabilirsiniz > ... Yalnızca yüklü sağlama profilinizi görmeniz gerekir ve bu, sistem durumu kiti simgesine ve > satırındaki diğer özel hizmetlere sahip olmalıdır:

Profili Xcode 'da görüntüleme

Uygulama KIMLIĞI ve sağlama profilini Xamarin. iOS uygulamanızla ilişkilendirme

açıklandığı şekilde, uygun bir sağlama profilini oluşturup yükledikten sonra, Mac için Visual Studio veya Visual Studio bir çözüm oluşturulması zaman alabilir. Health Kit erişimi tüm iOS C# veya F # projeleri için kullanılabilir.

El ile bir Xamarin iOS 8 projesi oluşturma işlemini yapmak yerine, bu makaleye eklenmiş örnek uygulamayı açın (önceden oluşturulmuş bir film şeridi ve kod içerir). örnek uygulamayı sistem durumu seti etkinleştirilmiş sağlama profilinizile ilişkilendirmek için, Çözüm BölmesiProject sağ tıklayıp seçenekler iletişim kutusunu getirin. IOS uygulama paneline geçin ve daha önce uygulamanın paket tanımlayıcısıolarak oluşturduğunuz açık uygulama kimliğini girin:

Açık uygulama KIMLIĞINI girin

Şimdi IOS paket imzalama paneline geçiş yapın. Son yüklenen sağlama profiliniz, açık uygulama kimliğiIle Ilişkilendirilmesi sayesinde artık sağlama profiliolarak kullanılabilir olacaktır:

Sağlama profilini seçin

sağlama profili kullanılamıyorsa, ios uygulama panelindeki paket tanımlayıcısınıios Geliştirme Merkezi belirtilen ve sağlama profilinin yüklü olduğundan (xcode tercihleri hesapları görüntüleme ayrıntıları...) iki kez kontrol edin.

sistem durumu seti etkin sağlama profili seçildiğinde, Project seçenekleri iletişim kutusunu kapatmak için tamam ' ı tıklatın.

Yetkilendirmeler. plist ve Info. PLIST değerleri

örnek uygulama Entitlements.plist , her Project şablonuna dahil olmayan bir dosya (örneğin, sistem durumu seti etkin uygulamalar için gereklidir) içerir. Projeniz yetkilendirmeler içermiyorsa, projenize sağ tıklayın, Dosya yeni dosya... > iOS > yetkilendirmeleri. plist ' i seçerek bir el ile ekleyin.

Sonuç olarak, Entitlements.plist aşağıdaki anahtar ve değer çiftine sahip olmanız gerekir:

<?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>

Benzer şekilde, Info.plist uygulamanın, anahtarıyla ilişkili bir değeri olmalıdır healthkitUIRequiredDeviceCapabilities :

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

Bu makaleyle birlikte sunulan örnek uygulama, Entitlements.plist gerekli tüm anahtarları içeren önceden yapılandırılmış bir içerir.

Programlama durum seti

Health Kit veri deposu, uygulamalar arasında paylaşılan özel, kullanıcıya özel bir veri deposu. Durum bilgileri bu kadar hassas olduğundan, Kullanıcı veri erişimine izin vermek için pozitif adımlar almalıdır. Bu erişim kısmi olabilir (yazma ancak okuma, bazı veri türleri için erişim, ancak diğerleri değil vb.) ve herhangi bir zamanda iptal edilebilir. Durum seti uygulamaları, çok sayıda kullanıcının sistem durumuyla ilgili bilgileri saklamasıyla ilgili bilgi sahibi olacağını öğrenmiş şekilde, savunma olarak yazılmalıdır.

Health Kit verileri Apple belirtilen türlerle sınırlıdır. Bu türler kesin olarak tanımlanmıştır: bazı, Örneğin kan türü, Apple tarafından sağlanan numaralandırmanın belirli değerleriyle sınırlandırılmıştır, diğerleri ise ölçü birimiyle (gram, kalori ve litre gibi) bir büyüklüğü birleştirir. Uyumlu bir ölçü birimini paylaşan veriler bile bunlara göre değişir HKObjectType ; Örneğin, tür sistemi, HKQuantityTypeIdentifier.NumberOfTimesFallenHKQuantityTypeIdentifier.FlightsClimbed her ikisi de ölçü birimini kullansa bile, bir alana bir değeri depolamak için hatalı bir girişimi yakalar HKUnit.Count .

Health Kit veri deposundaki Storable türleri tüm alt sınıflarından oluşur HKObjectType . HKCharacteristicType nesneler, Biik sex, kan türü ve Doğum tarihini depolar. Daha yaygın olsa da, HKSampleType belirli bir zamanda veya bir süre içinde örneklendiği verileri temsil eden nesnelerdir.

HKSampleType nesneleri grafiği

HKSampleType soyut ve dört somut alt sınıflara sahiptir. Şu anda yalnızca bir tür veri vardır HKCategoryType . Bu, uyku Analizi olabilir. Sağlık seti 'ndeki verilerin büyük çoğunluğunda, HKQuantityType verileri HKQuantitySample tanıdık fabrika tasarım düzeniyle oluşturulan nesneler türünde ve depolar.

Health Kit içindeki verilerin büyük çoğunluğu, HKQuantityType türündedir ve verilerini HKQuantitySample nesnelerinde depolar

HKQuantityType türleri ile arasında HKQuantityTypeIdentifier.ActiveEnergyBurned değişir HKQuantityTypeIdentifier.StepCount .

Kullanıcıdan Izin isteme

Son kullanıcılar, bir uygulamanın sistem durumu seti verilerini okumasına veya yazmasına izin vermek için pozitif adımlar almalıdır. Bu işlem, iOS 8 cihazlarına önceden yüklenmiş olarak gelen sistem durumu uygulaması aracılığıyla yapılır. Bir sistem durumu seti uygulaması ilk kez çalıştırıldığında, kullanıcıya sistem denetimli bir sistem durumu erişim iletişim kutusu sunulur:

Kullanıcıya sistem denetimli bir sistem durumu erişim iletişim kutusu sunulur

Daha sonra Kullanıcı, sistem durumu uygulamasının kaynaklar iletişim kutusunu kullanarak izinleri değiştirebilir:

Kullanıcı, sistem durumu uygulama kaynakları iletişim kutusunu kullanarak izinleri değiştirebilir

Sistem durumu bilgileri son derece duyarlı olduğundan, uygulama geliştiricilerinin program savunma bilgilerini büyük ölçüde yazması gerekir. Bu, uygulama çalışırken izinlerin reddedilir ve değiştirilme beklentisi olur. En yaygın deyim, yöntemde izin istemek UIApplicationDelegate.OnActivated ve Kullanıcı arabirimini uygun şekilde değiştirmektir.

İzinler için Adım Adım Kılavuz

Health Kit tarafından sağlanan projesinde dosyasını AppDelegate.cs açın. dosyasının üst kısmında HealthKit kullanarak deyimine dikkat olun.

Aşağıdaki kod, Durum Seti izinleri ile ilgilidir:

private HKHealthStore healthKitStore = new HKHealthStore ();

public override void OnActivated (UIApplication 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;
        }
}

Bu yöntemlerde yer alan kodun hepsi içinde satır içinde yapılabilir, ancak örnek uygulama amacını daha net hale getirerek ayrı yöntemler kullanır: yazılacak belirli türlere erişim isteğinde bulunmak (ve uygulama istenirse okumak) ve kullanıcı Health.app'deki izinler iletişim kutusuyla etkileşime girdikten sonra etkinleştirilen bir geri OnActivatedValidateAuthorization()ReactToHealthCarePermissions() çağırmadır.

görevi, ValidateAuthorization() uygulamanın yazacakları ve bu verileri güncelleştirmek için yetkilendirme HKObjectTypes isteğite bulunduracakları kümeyi oluşturmaktır. Örnek uygulamada, HKObjectType anahtarına KHQuantityTypeIdentifierKey.HeartRate göredir. Bu tür kümesine typesToWrite eklenirken küme typesToRead boş kalır. Bu kümeler ve geri çağırma ReactToHealthCarePermissions() başvurusu, 'ye HKHealthStore.RequestAuthorizationToShare() geçirildi.

Geri çağırma, kullanıcı izinler iletişim kutusuyla etkileşime geçtikten ve iki bilgi parçasına geçirildikten sonra çağrılır: kullanıcı izinler iletişim kutusuyla etkileşime geçmişse bir değer ve null olmayan bir değer, izinler iletişim kutusunu sunmakla ilişkili bir tür hata ReactToHealthCarePermissions()booltrueNSError gösterir.

Önemli

Bu işlevin bağımsız değişkenlerini net bir şekilde ifade etmek için: başarı ve hata parametreleri kullanıcının Health Kit verilerine erişim izni verip ver verilmedi! Yalnızca kullanıcıya verilere erişim izni verme fırsatı verildiğini gösteriyor.

Uygulamanın verilere erişimi olup olmadığını onaylamak için kullanılır HKHealthStore.GetAuthorizationStatus() ve ile birlikte HKQuantityTypeIdentifierKey.HeartRate kullanılır. Döndürülen durumlara bağlı olarak uygulama, veri girme özelliğini etkinleştiren veya devre dışı bırakan bir uygulamadır. Erişim reddiyle ilgilenmek için standart bir kullanıcı deneyimi yoktur ve birçok olası seçenek vardır. Örnek uygulamada, durum tek bir nesnede ayarlanır ve bu da HeartRateModel ilgili olayları oluşturur.

Model, Görünüm ve Denetleyici

Singleton HeartRateModel nesnesini gözden geçirmek için dosyasını HeartRateModel.cs açın:

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

İlk bölüm, genel olaylar ve işleyiciler oluşturmak için ortak koddur. Sınıfının ilk HeartRateModel kısmı, iş parçacığı güvenli tek nesne oluşturmak için de ortaktır.

Ardından, HeartRateModel 3 olay ortaya çıkarır:

  • EnabledChanged - Kalp atış hızı depolamanın etkinleştirildiğinde veya devre dışı bırakılmıştır (depolamanın başlangıçta devre dışı bırakılmıştır) olduğunu gösterir.
  • ErrorMessageChanged - Bu örnek uygulama için çok basit bir hata işleme modelimiz vardır: son hata içeren bir dize.
  • HeartRateStored - Bir kalp atış hızı Health Kit veritabanında depolandığı zaman yükseltildi.

Bu olaylar her sınansa, bunun üzerinden yapılır ve bu da NSObject.InvokeOnMainThread() abonelerin kullanıcı arabirimini güncelleştirmesini sağlar. Alternatif olarak, olaylar arka plan iş parçacıklarında yükseltildi olarak belgelenmiş olabilir ve uyumluluk sağlama sorumluluğu işleyicilerine bırakılana kadar devam eder. İzin isteği gibi işlevlerin çoğu zaman uyumsuz olduğundan ve ana olmayan iş parçacıklarında geri çağırmalarını yürüttklerinden, iş parçacığı önemli noktalar Health Kit uygulamalarında önemlidir.

içinde Heath Kit'e özgü HeartRateModel kod, ve işlevlerinde HeartRateInBeatsPerMinute() yer alan iki StoreHeartRate() işlevdir.

HeartRateInBeatsPerMinute() bağımsız değişkenini türü kesin olarak kesin olan bir Durum Seti'ne HKQuantity dönüştürür. Miktarın türü tarafından belirtilen ve miktarın birimlerine bölünen miktardır (başka bir deyişle, birim dakika başına HKQuantityTypeIdentifierKey.HeartRateHKUnit.Count dakika başına HKUnit.MinuteHKQuantityTypeIdentifierKey.HeartRate

İşlev StoreHeartRate() bir alır HKQuantity (örnek uygulamada bir tane tarafından HeartRateInBeatsPerMinute() oluşturulur). Verilerini doğrulamak için yöntemini kullanır. Bu yöntem, bağımsız değişkende nesnenin birimlerinin birimlere HKQuantity.IsCompatible()true dönüştürülmesi için döndürür. Bu değerle oluşturulan miktar açıkça değerine dönüşecek olsa da, örneğin, Saat Başına Ücret olarak oluşturulmuşsa HeartRateInBeatsPerMinute()true da değeri de trueHeartRateInBeatsPerMinute() Daha yaygın olarak, kullanıcının veya cihazın bir ölçüm sisteminde (Örneğin, İngiliz birimleri) girebiliyor veya görüntüleyebiliyor olduğu ancak başka bir sistemde depolandırılana (ölçüm birimleri gibi) yığın, uzaklık ve enerjiyi doğrulamak için HKQuantity.IsCompatible() kullanılabilir.

Miktarın uyumluluğu doğrulandıktan sonra, kesin türe sahip bir nesne HKQuantitySample.FromType() oluşturmak için fabrika yöntemi heartRateSample kullanılır. HKSample nesnelerin başlangıç ve bitiş tarihi vardır; anlık okumalar için, bu değerler örnektekilerle aynı olması gerekir. Örnek ayrıca bağımsız değişkende herhangi bir anahtar-değer verisi ayarlamaz, ancak algılayıcı konumunu belirtmek için aşağıdaki HKMetadata kod gibi bir kod kullanabilir:

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

oluşturulduktan heartRateSample sonra kod, using bloğuyla veritabanına yeni bir bağlantı oluşturur. Bu blok içinde HKHealthStore.SaveObject() yöntemi veritabanına zaman uyumsuz yazma girişiminde bulunmaktadır. Lambda ifadesine yapılan çağrı, veya gibi ilgili olayları HeartRateStoredErrorMessageChanged tetikler.

Artık model programlanmıştır, denetleyicinin modelin durumunu nasıl yansıtdığını görmenin zamanı geldi. HKWorkViewController.cs dosyasını açın. Oluşturucu tekliyi olay işleme yöntemlerine kablolar (yine bu işlem lambda ifadeleriyle satır içi yapılabilir ancak ayrı yöntemler amacı biraz daha HeartRateModel belirgin hale gelir):

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

İlgili işleyiciler şu şekildedir:

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

Tek bir denetleyiciye sahip bir uygulamada, ayrı bir model nesnesi oluşturulmasından ve denetim akışı için olayların kullanımından kaçınmak mümkün olabilir, ancak model nesnelerinin kullanımı gerçek dünya uygulamaları için daha uygundur.

Örnek uygulamayı çalıştırma

iOS Simülatörü, Durum Setini desteklemez. Hata ayıklama, iOS 8 çalıştıran bir fiziksel cihazda yapılması gerekir.

Sisteminize düzgün şekilde sağlanan bir iOS 8 geliştirme cihazı ekleme. Dağıtım hedefi olarak bunu seçin Mac için Visual Studio menüden Hata Ayıklamayı Çalıştır'ı seçin.

Önemli

Sağlamayla ilgili hatalar bu noktada ortaya çıkar. Hataları gidermek için yukarıdaki Durum Seti Uygulaması Oluşturma ve Sağlama bölümünü gözden geçirebilirsiniz. Bileşenler:

  • iOS Geliştirme Merkezi - Açık Uygulama Kimliği Sağlık Seti sağlama profilini etkinleştirdi.
  • Project Seçenekleri - Paket Tanımlayıcısı (açık Uygulama Kimliği) Sağlama Profili.
  • Kaynak kodu - Entitlements.plist Info.plist

Hükümler düzgün şekilde ayarlanmışsa, uygulama başlar. Yöntemine OnActivated ulaştığında, Durum Seti yetkilendirmesi isteğinde lar. İşletim sistemi bu sorunla ilk kez karşılaştığında, kullanıcınıza aşağıdaki iletişim kutusu görüntülenir:

Kullanıcıya bu iletişim kutusu görüntülenir

Kalp Atış Hızı verilerini güncelleştirmek için uygulamanıza olanak sağlarsanız, uygulamanız yeniden ortaya gelecektir. ReactToHealthCarePermissionsGeri çağırma zaman uyumsuz olarak etkinleştirilir. Bu özellik değişmeye neden olur ve bu olay, düğmeyi sağlayan olay işleyicinin HeartRateModel’sEnabledEnabledChangedHKPermissionsViewController.OnEnabledChanged() çalışmasına neden StoreData olur. Aşağıdaki diyagramda sırayı gösterir:

Bu diyagramda olayların sırası gösterir

Kayıt düğmesine basın. Bu, işleyicinin çalışmasına neden olur. Bu, metin alanı değerini ayrıştırmayı, daha önce tartışılan işlevi aracılığıyla içine dönüştürmeyi ve bu miktarı StoreData_TouchUpInside()heartRateHKQuantityHeartRateModel.HeartRateInBeatsPerMinute() 'ye HeartRateModel.StoreHeartRate() iletir. Daha önce de belirtildiği gibi bu, verileri depolamayı dener ve bir veya HeartRateStored olayına neden ErrorMessageChanged olur.

Cihazınızın Giriş düğmesine çift tıklayın ve Health uygulamasını açın. Kaynaklar sekmesine tıklarsanız örnek uygulamanın listelenmiş olduğunu görebilirsiniz. Seçin ve kalp atış hızı verilerini güncelleştirme iznine izin vermez. Giriş düğmesine çift tıklayın ve uygulamanıza geri dönebilirsiniz. Bir kez daha çağrılır, ancak bu kez erişim reddedilirse StoreData düğmesi devre dışı bırakılır (bunun zaman uyumsuz olarak oluştuğuna ve kullanıcı arabiriminde değişikliğin son kullanıcıya görünür olduğunu ReactToHealthCarePermissions() unutmayın). ReactToHealthCarePermissions()

İleri Düzey Konular

Health Kit veritabanından veri okumak, veri yazmaya çok benzer: biri erişmeye çalıştığı veri türlerini belirtir, yetkilendirme isteğinde bulunuyor ve bu yetkilendirme izni verildi ise veriler kullanılabilir ve uyumlu ölçü birimlerine otomatik dönüştürme ile kullanılabilir.

İlgili veriler güncelleştirildiğinde güncelleştirmeler gerçekleştiren, önkate dayalı sorgulara ve sorgulara olanak sağlayan bir dizi daha gelişmiş sorgu işlevi vardır.

Health Kit uygulamalarının geliştiricileri, Apple'ın Uygulama Gözden Geçirme Yönergeleri'nin Health Kit bölümünü gözden geçirmalıdır.

Güvenlik ve tür sistemi modelleri anlaşıldıktan sonra verileri paylaşılan Health Kit veritabanında depolamak ve okumak oldukça kolaydır. Health Kit'in içindeki işlevlerin çoğu zaman uyumsuz olarak çalışır ve uygulama geliştiricilerinin programlarını uygun şekilde yazması gerekir.

Bu makalenin yazısında şu anda Android veya Windows Phone'da Sistem Sağlığı Seti ile eşdeğer Windows Phone.

Özet

Bu makalede, Sistem Sağlığı Seti'nin uygulamaların sistem durumuyla ilgili bilgileri depolamasını, almasını ve paylaşmasını sağlarken aynı zamanda kullanıcıya bu veriler üzerinde erişim ve denetim sağlayan standart bir Health uygulaması sağlamayı da gördük.

Ayrıca gizlilik, güvenlik ve veri bütünlüğünün sistem durumuyla ilgili bilgilerle ve Sistem Sağlığı Seti kullanan uygulamaların, uygulama yönetimi açısından (sağlama), kodlama (Health Kit'in tür sistemi) ve kullanıcı deneyimi (sistem iletişim kutuları ve Sistem Durumu uygulaması aracılığıyla izinlerin kullanıcı denetimi) karmaşıklığıyla nasıl başa olması gerektiğini de gördük.

Son olarak, Health Kit deposuna sinyal verileri yazan ve zaman uyumsuz bir tasarıma sahip olan örnek uygulamayı kullanarak Basit bir Health Kit uygulamasına göz atarak.