Share via


Xamarin.iOS'ta HomeKit

HomeKit, Apple'ın ev otomasyon cihazlarını denetleme çerçevesidir. Bu makale HomeKit'i tanıtır ve HomeKit Donatı Simülatörü'nde test donatılarını yapılandırmayı ve bu aksesuarlarla etkileşime geçmek için basit bir Xamarin.iOS uygulaması yazmayı kapsar.

HomeKit özellikli uygulama örneği

Apple, çeşitli satıcılardan gelen birden çok ev otomasyonu cihazını tek ve tutarlı bir ünitede sorunsuz bir şekilde tümleştirmenin bir yolu olarak iOS 8'de HomeKit'i tanıttı. HomeKit, ev otomasyonu cihazlarını bulmak, yapılandırmak ve denetlemek için ortak bir protokolü teşvik ederek, birbiriyle ilgili olmayan satıcıların cihazlarının tek tek satıcıların çabalarını koordine etmek zorunda kalmadan birlikte çalışmasına olanak tanır.

HomeKit ile, satıcı tarafından sağlanan API'leri veya uygulamaları kullanmadan HomeKit özellikli tüm cihazları denetleyebilen bir Xamarin.iOS uygulaması oluşturabilirsiniz. HomeKit kullanarak aşağıdakileri yapabilirsiniz:

  • HomeKit özellikli yeni ev otomasyonu cihazlarını keşfedin ve bunları kullanıcının tüm iOS cihazlarında kalıcı olacak bir veritabanına ekleyin.
  • HomeKit Giriş Yapılandırma Veritabanı'nda herhangi bir cihazı ayarlayın, yapılandırın, görüntüleyin ve denetleyin.
  • Önceden yapılandırılmış herhangi bir HomeKit cihazıyla iletişim kurun ve tek tek eylemler gerçekleştirmelerini veya mutfaktaki tüm ışıkları açma gibi konserlerde çalışmalarını isteyin.

HomeKit özellikli uygulamalarda Ev Yapılandırma Veritabanı'ndaki cihazlara hizmet vermeye ek olarak, HomeKit Siri sesli komutlarına erişim sağlar. Uygun şekilde yapılandırılmış bir HomeKit kurulumu göz önüne alındığında, kullanıcı "Siri, oturma odasındaki ışıkları aç" gibi sesli komutlar verebilir.

Giriş Yapılandırma Veritabanı

HomeKit, belirli bir konumdaki tüm otomasyon cihazlarını Ev Koleksiyonu'nda düzenler. Bu koleksiyon, kullanıcının ev otomasyonu cihazlarını anlamlı, okunabilir etiketlerle mantıksal olarak düzenlenmiş birimler halinde gruplandırmasını sağlar.

Ev Koleksiyonu, kullanıcının tüm iOS cihazlarında otomatik olarak yedeklenecek ve eşitlenecek bir Ev Yapılandırma Veritabanında depolanır. HomeKit, Ev Yapılandırma Veritabanı ile çalışmak için aşağıdaki sınıfları sağlar:

  • HMHome - Bu, tüm ev otomasyon cihazları için tüm bilgileri ve yapılandırmaları tek bir fiziksel konumda (tek bir aile konağı gibi) tutan en üst düzey kapsayıcıdır. Kullanıcının ana evi ve tatil evi gibi birden fazla ikametgahı olabilir. Ya da aynı mülkte ana ev ve garajın üzerindeki bir konuk evi gibi farklı "evleri" olabilir. Her iki durumda da, diğer HomeKit bilgilerinin girilmesi için en az bir HMHome nesnenin ayarlanması ve depolanması gerekir .
  • HMRoom - İsteğe bağlı olarak, HMRoom kullanıcının bir evinHMHome () içinde mutfak, banyo, garaj veya oturma odası gibi belirli odaları tanımlamasına izin verir. Kullanıcı, evindeki belirli bir konumdaki tüm ev otomasyon cihazlarını bir HMRoom içinde gruplandırabilir ve bir birim olarak üzerinde işlem yapabilir. Örneğin Siri'nin garaj ışıklarını kapatmasını isteme.
  • HMAccessory - Bu, kullanıcının ikametgahında (akıllı termostat gibi) yüklenmiş bireysel, fiziksel HomeKit özellikli otomasyon cihazını temsil eder. Her HMAccessory biri bir HMRoomöğesine atanır. Kullanıcı herhangi bir oda yapılandırmadıysa, HomeKit aksesuarları özel bir varsayılan odaya atar.
  • HMService - Bir ışığın veya renginin açık/kapalı durumu (renk değişikliği destekleniyorsa) gibi belirli HMAccessorybir tarafından sağlanan bir hizmeti temsil eder. Her HMAccessory birinde aynı zamanda ışık içeren garaj kapısı açıcı gibi birden fazla hizmet bulunabilir. Ayrıca, belirli HMAccessory bir hizmette kullanıcı denetiminin dışında olan üretici yazılımı güncelleştirmesi gibi hizmetler olabilir.
  • HMZone - Kullanıcının bir nesne koleksiyonunu HMRoom Üst Kat, Alt Kat veya Bodrum gibi mantıksal bölgeler halinde gruplandırmasına izin verir. İsteğe bağlı olsa da bu, Siri'nin alt kattaki tüm ışığı kapatmasını isteme gibi etkileşimlere olanak tanır.

HomeKit Uygulaması Sağlama

HomeKit tarafından uygulanan güvenlik gereksinimleri nedeniyle, HomeKit çerçevesini kullanan bir Xamarin.iOS uygulamasının hem Apple Geliştirici Portalı'nda hem de Xamarin.iOS proje dosyasında düzgün yapılandırılması gerekir.

Aşağıdakileri yapın:

  1. Apple Geliştirici Portalı'na giriş yapın.

  2. Sertifikalar, Tanımlayıcılar ve Profiller'e tıklayın.

  3. Henüz yapmadıysanız, Tanımlayıcılar'a tıklayın ve uygulamanız için bir kimlik oluşturun (örneğin), com.company.appnameyoksa mevcut kimliğinizi düzenleyin.

  4. Verilen kimlik için HomeKit hizmetinin denetlendiğinden emin olun:

    Verilen kimlik için HomeKit hizmetini etkinleştirme

  5. Değişikliklerinizi kaydedin.

  6. Sağlama Profilleri>Geliştirme'ye tıklayın ve uygulamanız için yeni bir geliştirme sağlama profili oluşturun:

    Uygulama için yeni bir geliştirme sağlama profili oluşturma

  7. Yeni sağlama profilini indirip yükleyin veya Xcode kullanarak profili indirip yükleyin.

  8. Xamarin.iOS proje seçeneklerinizi düzenleyin ve az önce oluşturduğunuz sağlama profilini kullandığınızdan emin olun:

    Yeni oluşturulan sağlama profilini seçin

  9. Ardından Info.plist dosyanızı düzenleyin ve sağlama profilini oluşturmak için kullanılan Uygulama Kimliğini kullandığınızdan emin olun:

    Uygulama Kimliğini ayarlama

  10. Son olarak, Entitlements.plist dosyanızı düzenleyin ve HomeKit yetkilendirmesinin seçildiğinden emin olun:

    HomeKit yetkilendirmesini etkinleştirme

  11. Değişiklikleri tüm dosyalara kaydedin.

Bu ayarlar hazır olduğunda uygulama artık HomeKit Framework API'lerine erişmeye hazırdır. Sağlama hakkında ayrıntılı bilgi için lütfen Cihaz Sağlama ve Uygulamanızı Sağlama kılavuzlarımıza bakın.

Önemli

HomeKit özellikli bir uygulamanın test edilmesi için geliştirme için düzgün bir şekilde sağlanmış gerçek bir iOS cihazı gerekir. HomeKit, iOS Simülatöründen test edilemez.

HomeKit Aksesuar Simülatörü

Fiziksel bir cihaza sahip olmak zorunda kalmadan tüm olası ev otomasyonu cihazlarını ve hizmetlerini test etmek için bir yol sağlamak için Apple, HomeKit Accessory Simulator'ı oluşturdu. Bu simülatörü kullanarak sanal HomeKit cihazları ayarlayabilir ve yapılandırabilirsiniz.

Simülatörü Yükleme

Apple, HomeKit Accessory Simulator'ı Xcode'dan ayrı bir indirme olarak sağlar, bu nedenle devam etmeden önce yüklemeniz gerekir.

Aşağıdakileri yapın:

  1. Web tarayıcısında Apple Geliştiricileri için İndirmeler'i ziyaret edin

  2. Xcode xxx için Ek Araçlar'ı indirin (burada xxx, yüklediğiniz Xcode sürümüdür):

    Xcode için Ek Araçlar'ı indirin

  3. Disk görüntüsünü açın ve araçları Uygulamalar dizininize yükleyin.

HomeKit Donatı Simülatörü yüklüyken test için sanal aksesuarlar oluşturulabilir.

Sanal Donatılar Oluşturma

HomeKit Donatı Simülatörü'ne başlamak ve birkaç sanal donatı oluşturmak için aşağıdakileri yapın:

  1. Uygulamalar klasöründen HomeKit Accessory Simulator'ı başlatın:

    HomeKit Aksesuar Simülatörü

  2. Düğmeye + tıklayın ve Yeni Aksesuar... öğesini seçin:

    Yeni aksesuar ekleme

  3. Yeni aksesuar hakkındaki bilgileri doldurun ve Son düğmesine tıklayın:

    Yeni aksesuar hakkındaki bilgileri doldurun

  4. Hizmet Ekle.. düğmesine tıklayın ve açılan listeden bir hizmet türü seçin:

    Açılan listeden bir hizmet türü seçin

  5. Hizmet için bir Ad girin ve Son düğmesine tıklayın:

    Hizmet için bir Ad girin

  6. Özellik Ekle düğmesine tıklayıp gerekli ayarları yapılandırarak bir hizmet için isteğe bağlı özellikler sağlayabilirsiniz:

    Gerekli ayarları yapılandırma

  7. HomeKit'in desteklediği her sanal ev otomasyonu cihazından birini oluşturmak için yukarıdaki adımları yineleyin.

Bazı örnek sanal HomeKit donatıları oluşturulup yapılandırıldığında, artık Xamarin.iOS uygulamanızdan bu cihazları kullanabilir ve denetleyebilirsiniz.

Info.plist Dosyasını Yapılandırma

iOS 10 (ve üzeri) için yeni olan geliştiricinin NSHomeKitUsageDescription anahtarı uygulamanın dosyasına eklemesi ve uygulamanın Info.plist neden kullanıcının HomeKit veritabanına erişmek istediğini belirten bir dize sağlaması gerekir. Bu dize, uygulamayı ilk kez çalıştırıldığında kullanıcıya sunulacaktır:

HomeKit izin iletişim kutusu

Bu anahtarı ayarlamak için aşağıdakileri yapın:

  1. Çözüm Gezgini dosyaya çift tıklayarak Info.plist düzenlemek üzere açın.

  2. Ekranın alt kısmında Kaynak görünümüne geçin.

  3. Listeye yeni bir Girdi ekleyin.

  4. Açılan listede Gizlilik - HomeKit Kullanım Açıklaması'nı seçin:

    Gizlilik - HomeKit Kullanım Açıklaması'nın seçilmesi

  5. Uygulamanın kullanıcının HomeKit veritabanına neden erişmek istediğini açıklayan bir açıklama girin:

    Açıklama girin

  6. Dosyadaki değişiklikleri kaydedin.

Önemli

Dosyadaki anahtarın ayarlanamaması Info.plistNSHomeKitUsageDescription, iOS 10'da (veya daha büyük) çalıştırıldığında uygulamanın hatasız bir şekilde sessizce başarısız olmasına (çalışma zamanında sistem tarafından kapatılmasına) neden olur.

HomeKit'e Bağlan

HomeKit ile iletişim kurmak için Xamarin.iOS uygulamanızın önce sınıfının bir örneğini oluşturması HMHomeManager gerekir. Home Manager, HomeKit'in merkezi giriş noktasıdır ve kullanılabilir evlerin listesini sağlamak, bu listeyi güncelleştirmek ve korumak ve kullanıcının Birincil Giriş'ini döndürmekle sorumludur.

HMHome nesnesi, bir ev ile ilgili tüm bilgileri içerir; içerebileceği odalar, gruplar veya bölgeler ve yüklenmiş olan ev otomasyonu aksesuarları da dahil. HomeKit'te herhangi bir işlemin gerçekleştirilebilmesi için en az birinin HMHome oluşturulması ve Birincil Giriş olarak atanması gerekir.

Uygulamanız Birincil Giriş'in var olup olmadığını denetlemek ve yoksa bir giriş oluşturup atamakla sorumludur.

Ev Yöneticisi Ekleme

Xamarin.iOS uygulamasına HomeKit farkındalığı eklemek için AppDelegate.cs dosyasını düzenleyerek düzenleyin ve aşağıdaki gibi görünmesini sağlayın:

using HomeKit;
...

public HMHomeManager HomeManager { get; set; }
...

public override void FinishedLaunching (UIApplication application)
{
    // Attach to the Home Manager
    HomeManager = new HMHomeManager ();
    Console.WriteLine ("{0} Home(s) defined in the Home Manager", HomeManager.Homes.Count());

    // Wire-up Home Manager Events
    HomeManager.DidAddHome += (sender, e) => {
        Console.WriteLine("Manager Added Home: {0}",e.Home);
    };

    HomeManager.DidRemoveHome += (sender, e) => {
        Console.WriteLine("Manager Removed Home: {0}",e.Home);
    };
    HomeManager.DidUpdateHomes += (sender, e) => {
        Console.WriteLine("Manager Updated Homes");
    };
    HomeManager.DidUpdatePrimaryHome += (sender, e) => {
        Console.WriteLine("Manager Updated Primary Home");
    };
}

Uygulama ilk kez çalıştırıldığında, kullanıcıya HomeKit bilgilerine erişmesine izin vermek isteyip istemediği sorulur:

Kullanıcıya HomeKit bilgilerine erişmesine izin vermek isteyip istemediği sorulur

Kullanıcı Tamam'ı yanıtlarsa, uygulama HomeKit Donatıları ile çalışabilir, aksi takdirde çalışmaz ve HomeKit'e yapılan çağrılar bir hatayla başarısız olur.

Ev Yöneticisi'nin hazır olmasıyla, uygulamanın bir Birincil Giriş'in yapılandırılıp yapılandırılmadığını görmesi ve yapılandırılmamışsa kullanıcının oluşturması ve ataması için bir yol sağlaması gerekir.

Birincil Girişe Erişme

Yukarıda belirtildiği gibi, HomeKit kullanılabilir duruma gelmeden önce bir Birincil Giriş oluşturulup yapılandırılmalıdır ve kullanıcının önceden mevcut değilse Birincil Giriş oluşturması ve ataması için bir yol sağlamak uygulamanın sorumluluğundadır.

Uygulamanız arka planda ilk kez başlatıldığında veya geri döndüğünde, Birincil Giriş'in HMHomeManager varlığını denetlemek için sınıfın olayını izlemesi DidUpdateHomes gerekir. Yoksa, kullanıcının oluşturması için bir arabirim sağlamalıdır.

Birincil Giriş'i denetlemek için bir görünüm denetleyicisine aşağıdaki kod eklenebilir:

using HomeKit;
...

public AppDelegate ThisApp {
    get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
}
...

// Wireup events
ThisApp.HomeManager.DidUpdateHomes += (sender, e) => {

    // Was a primary home found?
    if (ThisApp.HomeManager.PrimaryHome == null) {
        // Ask user to add a home
        PerformSegue("AddHomeSegue",this);
    }
};

Ev Yöneticisi HomeKit ile bağlantı kurarken olay DidUpdateHomes tetiklenir, mevcut tüm evler yöneticinin ev koleksiyonuna yüklenir ve varsa Birincil Ev yüklenir.

Birincil Giriş Ekleme

özelliğinin PrimaryHomeHMHomeManager bir olaydan sonra DidUpdateHomes olması null durumunda, devam etmeden önce kullanıcının Birincil Giriş oluşturması ve ataması için bir yol sağlamanız gerekir.

Genellikle uygulama, kullanıcının yeni bir ev adlandırması için bir form sunar ve ardından Birincil Giriş olarak ayarlamak üzere Ev Yöneticisi'ne geçirilir. HomeKitIntro örnek uygulaması için, Xcode Interface Builder'da kalıcı bir görünüm oluşturuldu ve uygulamanın ana arabiriminden segue tarafından AddHomeSegue çağrıldı.

Kullanıcının yeni giriş için bir ad ve giriş ekleyebilmek için bir düğme girmesi için bir metin alanı sağlar. Kullanıcı Giriş Ekle düğmesine dokunduğunda, aşağıdaki kod giriş eklemek için Giriş Yöneticisi'ni çağırır:

// Add new home to HomeKit
ThisApp.HomeManager.AddHome(HomeName.Text,(home,error) =>{
    // Did an error occur
    if (error!=null) {
        // Yes, inform user
        AlertView.PresentOKAlert("Add Home Error",string.Format("Error adding {0}: {1}",HomeName.Text,error.LocalizedDescription),this);
        return;
    }

    // Make the primary house
    ThisApp.HomeManager.UpdatePrimaryHome(home,(err) => {
        // Error?
        if (err!=null) {
            // Inform user of error
            AlertView.PresentOKAlert("Add Home Error",string.Format("Unable to make this the primary home: {0}",err.LocalizedDescription),this);
            return ;
        }
    });

    // Close the window when the home is created
    DismissViewController(true,null);
});

AddHome yöntemi yeni giriş oluşturmayı ve verilen geri çağırma yordamına döndürmeyi dener. error özelliği değilsenull, bir hata oluştu ve kullanıcıya sunulmalı. En yaygın hatalar, benzersiz olmayan bir giriş adından veya Home Manager'ın HomeKit ile iletişim kuramamasından kaynaklanıyor.

Ev başarıyla oluşturulduysa, yeni evi Birincil Giriş olarak ayarlamak için yöntemini çağırmanız UpdatePrimaryHome gerekir. Yine özelliği değilse errornullbir hata oluştu ve kullanıcıya sunulmalı.

Ayrıca Home Manager'ın ve olaylarını DidAddHome izlemeli ve DidRemoveHome uygulamanın kullanıcı arabirimini gerektiği gibi güncelleştirmelisiniz.

Önemli

AlertView.PresentOKAlert Yukarıdaki örnek kodda kullanılan yöntem, HomeKitIntro uygulamasında iOS Uyarıları ile çalışmayı kolaylaştıran bir yardımcı sınıftır.

Yeni Aksesuarlar Bulma

Birincil Ev tanımlandıktan veya Home Manager'dan yüklendikten sonra, Xamarin.iOS uygulamanız yeni ev otomasyonu donatılarını bulmak ve bunları bir eve eklemek için öğesini çağırabilir HMAccessoryBrowser .

StartSearchingForNewAccessories Yeni donatıları aramaya başlamak için yöntemini ve bittiğinde yöntemi çağırınStopSearchingForNewAccessories.

Önemli

StartSearchingForNewAccessories iOS cihazının hem pil ömrünü hem de performansını olumsuz etkileyeceğinden uzun süre çalışır durumda bırakılmamalıdır. Apple, bir dakika sonra veya StopSearchingForNewAccessories yalnızca Kullanıcıya Aksesuar Bul kullanıcı arabirimi sunulduğunda arama yapmanızı önerir.

Olay DidFindNewAccessory , yeni aksesuarlar bulunduğunda çağrılır ve Aksesuar Tarayıcısı'ndaki listeye eklenir DiscoveredAccessories .

Liste, DiscoveredAccessories HomeKit özellikli bir ev otomasyonu cihazı ve ışıklar veya garaj kapısı denetimi gibi kullanılabilir hizmetlerini tanımlayan bir nesne koleksiyonu HMAccessory içerir.

Yeni aksesuar bulunduktan sonra kullanıcıya sunulmalı ve böylece bunu seçip bir eve ekleyebilmeleri gerekir. Örnek:

Yeni aksesuar bulma

Seçili aksesuarı AddAccessory evin koleksiyonuna eklemek için yöntemini çağırın. Örneğin:

// Add the requested accessory to the home
ThisApp.HomeManager.PrimaryHome.AddAccessory (_controller.AccessoryBrowser.DiscoveredAccessories [indexPath.Row], (err) => {
    // Did an error occur
    if (err !=null) {
        // Inform user of error
        AlertView.PresentOKAlert("Add Accessory Error",err.LocalizedDescription,_controller);
    }
});

err özelliği değilsenull, bir hata oluştu ve kullanıcıya sunulmalı. Aksi takdirde kullanıcıdan cihazın ekleneceği kurulum kodunu girmesi istenir:

Eklenecek cihazın kurulum kodunu girin

HomeKit Donatı Simülatörü'nde bu numara Kurulum Kodu alanında bulunabilir:

HomeKit Donatı Simülatörü'ndeki Kurulum Kodu alanı

Gerçek HomeKit aksesuarları için kurulum kodu cihazın üzerindeki bir etikete, ürün kutusuna veya aksesuarın kullanım kılavuzuna yazdırılır.

Aksesuar Tarayıcısı'nın DidRemoveNewAccessory olayını izlemeniz ve kullanıcı, bir aksesuarı Ev Koleksiyonuna ekledikten sonra kullanılabilir listeden kaldırmak için kullanıcı arabirimini güncelleştirmeniz gerekir.

Aksesuarlarla Çalışma

Birincil Ev kurulduktan ve donatılar eklendikten sonra, kullanıcının birlikte çalışacağı aksesuarların (ve isteğe bağlı odaların) listesini sunabilirsiniz.

Nesne, HMRoom belirli bir oda ve ona ait tüm aksesuarlar hakkındaki tüm bilgileri içerir. Odalar isteğe bağlı olarak bir veya daha fazla bölgede düzenlenebilir. , HMZone belirli bir bölge ve bu bölgeye ait tüm odalar hakkındaki tüm bilgileri içerir.

Bu örnek için, işleri basit tutacağız ve ev aksesuarlarıyla doğrudan çalışmak yerine bunları odalara veya bölgelere böleceğiz.

nesnesi, HMHome özelliğinde Accessories kullanıcıya sunulabilecek atanmış aksesuarın listesini içerir. Örneğin:

Örnek aksesuar

Burada, kullanıcı belirli bir aksesuarı seçebilir ve sağladığı hizmetlerle çalışabilir.

Hizmetlerle Çalışma

Kullanıcı belirli bir HomeKit özellikli ev otomasyonu cihazıyla etkileşime geçtiğinde, genellikle sağladığı hizmetler aracılığıyla olur. Services sınıfının özelliğiHMAccessory, bir cihazın sunduğu hizmetleri tanımlayan bir nesne koleksiyonu HMService içerir.

Hizmetler ışıklar, termostatlar, garaj kapısı açıcıları, anahtarlar veya kilitler gibi öğelerdir. Bazı cihazlar (garaj kapısı açıcı gibi) ışık ve bir kapıyı açma veya kapatma gibi birden fazla hizmet sağlar.

Belirli bir aksesuarın sağladığı belirli hizmetlere ek olarak, her aksesuar Ad, Üretici, Model ve Seri Numarası gibi özellikleri tanımlayan bir Information Service içerir.

Aksesuar Hizmet Türleri

Aşağıdaki Hizmet Türleri sabit listesi aracılığıyla HMServiceType kullanılabilir:

  • AccessoryInformation - Verilen ev otomasyon cihazı (aksesuar) hakkında bilgi sağlar.
  • AirQualitySensor - Bir hava kalitesi sensörü tanımlar.
  • Pil - Aksesuar pilinin durumunu tanımlar.
  • CarbonDioxideSensor - Bir karbonDioksit Sensörü tanımlar.
  • CarbonMonoxideSensor - Bir Karbon Monoksit Algılayıcısı tanımlar.
  • ContactSensor - Kişi algılayıcısı (açılan veya kapatılan pencere gibi) tanımlar.
  • Kapı - Bir kapı durumu algılayıcısı (açık veya kapalı gibi) tanımlar.
  • Fan - Uzaktan kumandalı bir fan tanımlar.
  • GarageDoorOpener - Garaj kapısı açıcısını tanımlar.
  • HumiditySensor - Nem algılayıcısı tanımlar.
  • LeakSensor - Bir sızıntı sensörü tanımlar (sıcak su ısıtıcısı veya çamaşır makinesi gibi).
  • Ampul - Tek başına bir ışık veya başka bir aksesuarın parçası olan bir ışık (garaj kapısı açıcı gibi) tanımlar.
  • LightSensor - Bir ışık algılayıcısı tanımlar.
  • LockManagement - Otomatik kapı kilidini yöneten bir hizmet tanımlar.
  • LockMechanism - Uzaktan kumandalı kilit (kapı kilidi gibi) tanımlar.
  • MotionSensor - Hareket algılayıcısı tanımlar.
  • OccupancySensor - Bir doluluk algılayıcısı tanımlar.
  • Çıkış - Uzaktan kumandalı bir priz tanımlar.
  • SecuritySystem - Bir ev güvenlik sistemi tanımlar.
  • StatefulProgrammableSwitch - Tetiklendiğinde verme durumunda (çevirme anahtarı gibi) kalan programlanabilir bir anahtar tanımlar.
  • StatelessProgrammableSwitch - Tetiklendikten sonra ilk durumuna geri dönen programlanabilir bir anahtar tanımlar (anında iletme düğmesi gibi).
  • SmokeSensor - Duman algılayıcısı tanımlar.
  • Anahtar - Standart duvar anahtarı gibi bir açma/kapatma anahtarı tanımlar.
  • TemperatureSensor - Sıcaklık algılayıcısı tanımlar.
  • Termostat - HVAC sistemini kontrol etmek için kullanılan akıllı bir termostat tanımlar.
  • Pencere - Uzaktan açılabilir veya kapatılabilir otomatik bir pencere tanımlar.
  • WindowCovering - Açılabilir veya kapatılabilir perdeler gibi uzaktan denetlenen bir pencere kaplaması tanımlar.

Hizmet Bilgilerini Görüntüleme

Yükledikten HMAccessory sonra sağladığı nesneleri tek tek HNService sorgulayabilir ve bu bilgileri kullanıcıya görüntüleyebilirsiniz:

Hizmet Bilgilerini Görüntüleme

Ile çalışmaya çalışmadan önce her zaman özelliğini HMAccessory denetlemeniz Reachable gerekir. Bir aksesuara ulaşılamıyor olabilir ve kullanıcının cihazın aralığında olmaması veya cihazın fişinin takılı olmaması olabilir.

Bir hizmet seçildikten sonra, kullanıcı belirli bir ev otomasyonu cihazını izlemek veya denetlemek için bu hizmetin bir veya daha fazla özelliğini görüntüleyebilir veya değiştirebilir.

Özelliklerle Çalışma

Her HMService nesne, hizmetin durumu hakkında bilgi sağlayan (açılan veya kapatılan bir kapı gibi) veya kullanıcının durumu ayarlamasına (ışığın rengini ayarlama gibi) izin veren bir nesne koleksiyonu HMCharacteristic içerebilir.

HMCharacteristicyalnızca bir özellik ve durumu hakkında bilgi sağlamakla kalmaz, aynı zamanda Özellik Meta Verileri (HMCharacteristisMetadata ) aracılığıyla durumla çalışmaya yönelik yöntemler de sağlar. Bu meta veriler, kullanıcıya bilgi görüntülerken veya durumları değiştirmelerine izin verirken yararlı olan özellikler (en düşük ve en yüksek değer aralıkları gibi) sağlayabilir.

sabit HMCharacteristicType listesi, aşağıdaki gibi tanımlanabilir veya değiştirilebilen bir Dizi Karakteristik Meta Veri değeri sağlar:

  • Yönetici OnlyAccess
  • AirParticulateDensity
  • AirParticulateSize
  • AirQuality
  • AudioFeedback
  • BatteryLevel
  • Parlak -lık
  • CarbonDioxide Algılandı
  • CarbonDioxideLevel
  • CarbonDioxidePeakLevel
  • CarbonMonoxide Algılandı
  • CarbonMonoxideLevel
  • CarbonMonoxidePeakLevel
  • ChargingState
  • ContactState
  • CoolingThreshold
  • CurrentDoorState
  • CurrentHeatingCooling
  • CurrentHorizontalTilt
  • CurrentLightLevel
  • CurrentLockMechanismState
  • Currentposition
  • CurrentRelativeHumidity
  • CurrentSecuritySystemState
  • CurrentTemperature
  • CurrentVerticalTilt
  • FirmwareVersion
  • HardwareVersion
  • HeatingCoolingStatus
  • HeatingThreshold
  • HoldPosition
  • Ton
  • Tanımla
  • InputEvent
  • Sızıntı Algılandı
  • LockManagementAutoSecureTimeout
  • LockManagementControlPoint
  • LockMechanismLastKnownAction
  • Günlükler
  • Üretici
  • Model
  • Hareket Algılandı
  • Veri Akışı Adı
  • Engel Algılandı
  • Doluluk Algılandı
  • OutletInUse
  • OutputState
  • PositionState
  • PowerState
  • RotationDirection
  • RotationSpeed
  • Doygun -luk
  • SerialNumber
  • Duman Algılandı
  • SoftwareVersion
  • StatusActive
  • StatusFault
  • StatusJammed
  • StatusLowBattery
  • StatusTampered
  • TargetDoorState
  • TargetHeatingCooling
  • TargetHorizontalTilt
  • TargetLockMechanismState
  • TargetPosition
  • TargetRelativeHumidity
  • TargetSecuritySystemState
  • TargetTemperature
  • TargetVerticalTilt
  • TemperatureUnits
  • Sürüm

Bir Özelliğin Değeriyle Çalışma

Uygulamanızın belirli bir özelliğin en son durumuna sahip olduğundan emin olmak için sınıfının yöntemini çağırın ReadValueHMCharacteristic . err özelliği değilsenull, bir hata oluştu ve kullanıcıya sunulabilir veya sunulmayabilir.

Özelliği Value , verilen özelliğin geçerli durumunu olarak NSObjectiçerir ve bu nedenle doğrudan C# ile çalışılamaz.

Değeri okumak için HomeKitIntro örnek uygulamasına aşağıdaki yardımcı sınıf eklendi:

using System;
using Foundation;
using System.Globalization;
using CoreGraphics;

namespace HomeKitIntro
{
    /// <summary>
    /// NS object converter is a helper class that helps to convert NSObjects into
    /// C# objects
    /// </summary>
    public static class NSObjectConverter
    {
        #region Static Methods
        /// <summary>
        /// Converts to an object.
        /// </summary>
        /// <returns>The object.</returns>
        /// <param name="nsO">Ns o.</param>
        /// <param name="targetType">Target type.</param>
        public static Object ToObject (NSObject nsO, Type targetType)
        {
            if (nsO is NSString) {
                return nsO.ToString ();
            }

            if (nsO is NSDate) {
                var nsDate = (NSDate)nsO;
                return DateTime.SpecifyKind ((DateTime)nsDate, DateTimeKind.Unspecified);
            }

            if (nsO is NSDecimalNumber) {
                return decimal.Parse (nsO.ToString (), CultureInfo.InvariantCulture);
            }

            if (nsO is NSNumber) {
                var x = (NSNumber)nsO;

                switch (Type.GetTypeCode (targetType)) {
                case TypeCode.Boolean:
                    return x.BoolValue;
                case TypeCode.Char:
                    return Convert.ToChar (x.ByteValue);
                case TypeCode.SByte:
                    return x.SByteValue;
                case TypeCode.Byte:
                    return x.ByteValue;
                case TypeCode.Int16:
                    return x.Int16Value;
                case TypeCode.UInt16:
                    return x.UInt16Value;
                case TypeCode.Int32:
                    return x.Int32Value;
                case TypeCode.UInt32:
                    return x.UInt32Value;
                case TypeCode.Int64:
                    return x.Int64Value;
                case TypeCode.UInt64:
                    return x.UInt64Value;
                case TypeCode.Single:
                    return x.FloatValue;
                case TypeCode.Double:
                    return x.DoubleValue;
                }
            }

            if (nsO is NSValue) {
                var v = (NSValue)nsO;

                if (targetType == typeof(IntPtr)) {
                    return v.PointerValue;
                }

                if (targetType == typeof(CGSize)) {
                    return v.SizeFValue;
                }

                if (targetType == typeof(CGRect)) {
                    return v.RectangleFValue;
                }

                if (targetType == typeof(CGPoint)) {
                    return v.PointFValue;
                }
            }

            return nsO;
        }

        /// <summary>
        /// Convert to string
        /// </summary>
        /// <returns>The string.</returns>
        /// <param name="nsO">Ns o.</param>
        public static string ToString(NSObject nsO) {
            return (string)ToObject (nsO, typeof(string));
        }

        /// <summary>
        /// Convert to date time
        /// </summary>
        /// <returns>The date time.</returns>
        /// <param name="nsO">Ns o.</param>
        public static DateTime ToDateTime(NSObject nsO){
            return (DateTime)ToObject (nsO, typeof(DateTime));
        }

        /// <summary>
        /// Convert to decimal number
        /// </summary>
        /// <returns>The decimal.</returns>
        /// <param name="nsO">Ns o.</param>
        public static decimal ToDecimal(NSObject nsO){
            return (decimal)ToObject (nsO, typeof(decimal));
        }

        /// <summary>
        /// Convert to boolean
        /// </summary>
        /// <returns><c>true</c>, if bool was toed, <c>false</c> otherwise.</returns>
        /// <param name="nsO">Ns o.</param>
        public static bool ToBool(NSObject nsO){
            return (bool)ToObject (nsO, typeof(bool));
        }

        /// <summary>
        /// Convert to character
        /// </summary>
        /// <returns>The char.</returns>
        /// <param name="nsO">Ns o.</param>
        public static char ToChar(NSObject nsO){
            return (char)ToObject (nsO, typeof(char));
        }

        /// <summary>
        /// Convert to integer
        /// </summary>
        /// <returns>The int.</returns>
        /// <param name="nsO">Ns o.</param>
        public static int ToInt(NSObject nsO){
            return (int)ToObject (nsO, typeof(int));
        }

        /// <summary>
        /// Convert to float
        /// </summary>
        /// <returns>The float.</returns>
        /// <param name="nsO">Ns o.</param>
        public static float ToFloat(NSObject nsO){
            return (float)ToObject (nsO, typeof(float));
        }

        /// <summary>
        /// Converts to double
        /// </summary>
        /// <returns>The double.</returns>
        /// <param name="nsO">Ns o.</param>
        public static double ToDouble(NSObject nsO){
            return (double)ToObject (nsO, typeof(double));
        }
        #endregion
    }
}

NSObjectConverter, uygulamanın bir özelliğin geçerli durumunu okuması gerektiğinde kullanılır. Örneğin:

var value = NSObjectConverter.ToFloat (characteristic.Value);

Yukarıdaki satır değeri, daha sonra Xamarin C# kodunda kullanılabilecek bir float değerine dönüştürür.

değiştirmek HMCharacteristiciçin yöntemini çağırın WriteValue ve yeni değeri bir NSObject.FromObject çağrıya sarmalar. Örneğin:

Characteristic.WriteValue(NSObject.FromObject(value),(err) =>{
    // Was there an error?
    if (err!=null) {
        // Yes, inform user
        AlertView.PresentOKAlert("Update Error",err.LocalizedDescription,Controller);
    }
});

err özelliği değilsenull, bir hata oluştu ve kullanıcıya sunulmalı.

Özellik Değeri Değişikliklerini Test Etme

Aksesuarlarla ve simülasyon aksesuarlarıyla HMCharacteristics çalışırken, özellikte yapılan değişiklikler Value HomeKit Donatı Simülatörü içinde izlenebilir.

HomeKitIntro uygulaması gerçek iOS Cihaz Donanımı üzerinde çalışırken, bir özelliğin değerinde yapılan değişiklikler HomeKit Donatı Simülatörü'nde neredeyse anında görülmelidir. Örneğin, iOS uygulamasında ışığın durumunu değiştirme:

iOS uygulamasında ışığın durumunu değiştirme

HomeKit Aksesuar Simülatörü'nde ışığın durumunu değiştirmelidir. Değer değişmezse, yeni özellik değerleri yazarken hata iletisinin durumunu denetleyin ve aksesuara hala ulaşılabilir olduğundan emin olun.

Gelişmiş HomeKit Özellikleri

Bu makalede, Xamarin.iOS uygulamasında HomeKit donatılarıyla çalışmak için gereken temel özellikler ele alınmıştır. Ancak, HomeKit'in bu girişte ele alınmayan birkaç gelişmiş özelliği vardır:

  • Odalar - HomeKit özellikli aksesuarlar isteğe bağlı olarak son kullanıcı tarafından odalar halinde düzenlenebilir. Bu, HomeKit'in aksesuarları kullanıcının anlaması ve çalışması kolay bir şekilde sunmasını sağlar. Oda oluşturma ve bakımını yapma hakkında daha fazla bilgi için Apple'ın HMRoom belgelerine bakın.
  • Bölgeler - Odalar isteğe bağlı olarak son kullanıcı tarafından bölgeler halinde düzenlenebilir. Bölge, kullanıcının tek bir birim olarak değerlendirebileceği oda koleksiyonunu ifade eder. Örneğin: Üst Kat, Alt Kat veya Bodrum. Bu da HomeKit'in son kullanıcıya anlamlı bir şekilde aksesuarlar sunmasını ve aksesuarlarla çalışmasını sağlar. Bölgeleri oluşturma ve koruma hakkında daha fazla bilgi için Apple'ın HMZone belgelerine bakın.
  • Eylemler ve Eylem Kümeleri - Eylemler aksesuar hizmeti özelliklerini değiştirir ve kümeler halinde gruplandırılabilir. Eylem Kümeleri, bir aksesuar grubunu denetlemek ve eylemlerini koordine etmek için betik görevi görür. Örneğin, "TV İzle" betiği perdeleri kapatabilir, ışıkları karartabilir ve televizyonu ve ses sistemini açabilir. Eylemleri ve Eylem Kümelerini oluşturma ve sürdürme hakkında daha fazla bilgi için Apple'ın HMAction ve HMActionSet belgelerine bakın.
  • Tetikleyiciler - Bir tetikleyici, belirli bir koşul kümesi karşılandığında bir veya daha fazla Eylem Kümesini etkinleştirebilir. Örneğin, bağlantı noktası ışığını açın ve dışarısı karardığında tüm dış kapıları kilitleyin. Tetikleyici oluşturma ve koruma hakkında daha fazla bilgi için Apple'ın HMTrigger belgelerine bakın.

Bu özellikler yukarıda sunulan tekniklerin aynısını kullandığından, Apple'ın HomeKitDeveloper Kılavuzu, HomeKit Kullanıcı Arabirimi Yönergeleri ve HomeKit Framework Başvurusu'nu izleyerek kolayca uygulanmalıdır.

HomeKit Uygulaması Gözden Geçirme Yönergeleri

HomeKit özellikli bir Xamarin.iOS uygulamasını iTunes App Store'da yayımlanmak üzere iTunes Bağlan göndermeden önce Apple'ın HomeKit özellikli uygulamalarla ilgili yönergelerine uyduğunuzdan emin olun:

  • HomeKit çerçevesi kullanılıyorsa uygulamanın birincil amacı ev otomasyonu olmalıdır .
  • Uygulamanın pazarlama metni, HomeKit'in kullanıldığını kullanıcılara bildirmeli ve bir gizlilik ilkesi sağlamalıdır.
  • Kullanıcı bilgilerini toplamak veya HomeKit'i reklam için kullanmak kesinlikle yasaktır.

Tam inceleme yönergeleri için lütfen Apple'ın App Store Gözden Geçirme Yönergeleri'ne bakın.

iOS 9'daki Yenilikler

Apple, iOS 9 için HomeKit'e aşağıdaki değişiklikleri ve eklemeleri yaptı:

  • Mevcut Nesneleri Koruma - Mevcut bir aksesuar değiştirilirse, Ev Yöneticisi (HMHomeManager) değiştirilen belirli öğeyi size bildirir.
  • Kalıcı Tanımlayıcılar - Tüm ilgili HomeKit sınıfları artık HomeKit özellikli uygulamalarda (veya aynı uygulamanın örneklerinde) belirli bir öğeyi benzersiz olarak tanımlamak için bir özellik içeriyor UniqueIdentifier .
  • Kullanıcı Yönetimi - Birincil kullanıcının evindeki HomeKit cihazlarına erişimi olan kullanıcılar üzerinde kullanıcı yönetimi sağlamak için yerleşik bir görünüm denetleyicisi eklendi.
  • Kullanıcı Özellikleri - HomeKit kullanıcıları artık HomeKit ve HomeKit özellikli aksesuarlarda hangi işlevleri kullanabileceklerini denetleyebilen bir ayrıcalık kümesine sahiptir. Uygulamanız yalnızca geçerli kullanıcıya uygun özellikleri görüntülemelidir. Örneğin, yalnızca bir yöneticinin diğer kullanıcıları koruyabilmesi gerekir.
  • Önceden Tanımlanmış Sahneler - Ortalama HomeKit kullanıcısı için gerçekleşen dört yaygın olay için önceden tanımlanmış sahneler oluşturulmuştur: Kalk, Ayrıl, Dön, Yatağa Git. Önceden tanımlanmış bu sahneler bir evden silinemez.
  • Sahneler ve Siri - Siri, iOS 9'da Sahneler için daha derin desteğe sahiptir ve HomeKit'te tanımlanan herhangi bir Sahnenin adını tanıyabilir. Kullanıcı, siri ile adını konuşarak bir sahneyi yürütebilir.
  • Aksesuar Kategorileri - Tüm Aksesuarlara önceden tanımlanmış bir kategori kümesi eklenmiştir ve bir Giriş'e eklenen veya uygulamanızın içinden üzerinde çalışılan Aksesuar türünü tanımlamaya yardımcı olur. Bu yeni kategoriler Aksesuar kurulumu sırasında kullanılabilir.
  • Apple Watch Desteği - HomeKit artık watchOS için kullanılabilir ve Apple Watch, i Telefon saatin yakınında olmadan HomeKit özellikli cihazları denetleyebilecek. watchOS için HomeKit şu özellikleri destekler: Evleri Görüntüleme, Aksesuarları Denetleme ve Sahneleri Yürütme.
  • Yeni Olay TetikleyiciSi Türü - iOS 8'de desteklenen zamanlayıcı türü tetikleyicilerine ek olarak, iOS 9 artık Donatı Durumuna (algılayıcı verileri gibi) veya coğrafi konum temelinde Olay Tetikleyicilerini destekliyor. Olay Tetikleyicileri, yürütme koşulları ayarlamak için kullanır NSPredicates .
  • Uzaktan Erişim - Uzaktan Erişim sayesinde kullanıcı artık EvKit özellikli Ev Otomasyonu Donatılarını uzak bir konumda evden uzaktayken denetleyebiliyor. iOS 8'de bu yalnızca kullanıcının evde 3. nesil bir Apple TV'ye sahip olduğu durumlarda destekleniyordu. iOS 9'da bu sınırlama kaldırılır ve iCloud ve HomeKit Aksesuar Protokolü (HAP) aracılığıyla uzaktan erişim desteklenir.
  • Yeni Bluetooth Düşük Enerji (BLE) Yetenekleri - HomeKit artık Bluetooth Düşük Enerji (BLE) protokolü aracılığıyla iletişim kurabilen daha fazla aksesuar türünü destekliyor. HAP Secure Tunneling kullanarak HomeKit Accessory, Wi-Fi üzerinden başka bir Bluetooth Aksesuarını kullanıma açabilir (Bluetooth aralığının dışındaysa). iOS 9'da BLE Donatıları bildirimler ve meta veriler için tam desteğe sahiptir.
  • Yeni Aksesuar Kategorileri - Apple, iOS 9'da şu yeni Aksesuar Kategorilerini ekledi: Pencere Kaplamaları, Motorlu Kapılar ve Pencereler, Alarm Sistemleri, Algılayıcılar ve Programlanabilir Anahtarlar.

iOS 9'da HomeKit'in yeni özellikleri hakkında daha fazla bilgi için lütfen Apple'ın HomeKit Dizini ve HomeKit'teki Yenilikler videosuna bakın.

Özet

Bu makalede Apple'ın HomeKit ev otomasyonu çerçevesi tanıtılmıştır. HomeKit Donatı Simülatörü'ni kullanarak test cihazlarını ayarlama ve yapılandırma ve HomeKit kullanarak ev otomasyonu cihazlarını keşfetmek, iletişim kurmak ve denetlemek için basit bir Xamarin.iOS uygulamasının nasıl oluşturulacağını gösterdi.