Aracılığıyla paylaş


Xamarin.iOS'ta SiriKit Uygulama

Bu makale, Xamarin.iOS uygulamalarında SiriKit desteği uygulamak için gereken adımları kapsar.

iOS 10'da yeni olan SiriKit, Xamarin.iOS uygulamasının iOS cihazında Siri ve Haritalar uygulamasını kullanarak kullanıcıya erişilebilen hizmetler sağlamasına olanak tanır. Bu makale, gerekli Intents Extensions, Intents UI Extensions ve Vocabulary değerlerini ekleyerek Xamarin.iOS uygulamalarında SiriKit desteği uygulamak için gereken adımları kapsar.

Siri, etki alanları kavramıyla, ilgili görevler için bilgi eylemleri gruplarıyla çalışır. Uygulamanın Siri ile yaptığı her etkileşim, bilinen hizmet Etki Alanlarından birine aşağıdaki gibi girmelidir:

  • Sesli veya görüntülü arama.
  • Bir gezi için rezervasyon.
  • Antrenmanları yönetme.
  • Mesajlaşma.
  • Fotoğraflar aranıyor.
  • Ödemeleri gönderme veya alma.

Kullanıcı Uygulama Uzantısı'nın hizmetlerinden birini içeren bir Siri isteğinde bulunduğunda SiriKit uzantıya kullanıcının isteğini ve destekleyici verileri açıklayan bir Intent nesnesi gönderir. Uygulama Uzantısı daha sonra verilen Amaç için uygun Yanıt nesnesini oluşturur ve uzantının isteği nasıl işleyebileceğini açıklar.

Bu kılavuz, sirikit desteğini mevcut bir uygulamaya eklemeye yönelik hızlı bir örnek sunar. Bu örnekte sahte MonkeyChat uygulamasını kullanacağız:

MonkeyChat simgesi

MonkeyChat, her biri bir ekran adıyla (örneğin Bobo gibi) ilişkili kullanıcının arkadaşlarının kendi iletişim kitabını tutar ve kullanıcının her bir arkadaşınıza ekran adıyla kısa mesaj göndermesine izin verir.

SiriKit ile Uygulamayı Genişletme

SiriKit Kavramlarını Anlama kılavuzunda gösterildiği gibi, SiriKit ile bir uygulamanın genişletilmesiyle ilgili üç ana bölüm vardır:

Uygulamayı SiriKit diyagramıyla genişletme

Bu modüller şunlardır:

  1. Amaç Uzantısı - Kullanıcıların yanıtlarını doğrular, uygulamanın isteği işleyebileceğini onaylar ve kullanıcının isteğini yerine getirmek için görevi gerçekleştirir.
  2. Intents UI Uzantısı - İsteğe bağlı olarak, Siri Ortamı'ndaki yanıtlara özel bir kullanıcı arabirimi sağlar ve kullanıcının deneyimini zenginleştirmek için uygulamaların kullanıcı arabirimini ve markasını Siri'ye getirebilir.
  3. Uygulama - Siri'nin bu sözlükle çalışmasına yardımcı olmak için Uygulamaya Kullanıcıya özgü sözlükler sağlar.

Bu öğelerin tümü ve bunları uygulamaya ekleme adımları aşağıdaki bölümlerde ayrıntılı olarak ele alınacaktır.

Uygulamayı Hazırlama

SiriKit Uzantılar üzerine kurulmuştur ancak uygulamaya uzantı eklemeden önce, geliştiricinin SiriKit'in benimsenmesi konusunda yardımcı olması için yapması gereken birkaç şey vardır.

Ortak Paylaşılan Kodu Taşıma

İlk olarak, geliştirici uygulama ve uzantılar arasında paylaşılacak ortak kodlardan bazılarını Paylaşılan Projeler, Taşınabilir Sınıf Kitaplıkları (PCL' ler) veya Yerel Kitaplıklar'a taşıyabilir.

Uzantıların uygulamanın yaptığı her şeyi yapabilmesi gerekir. Örnek MonkeyChat uygulaması açısından kişileri bulma, yeni kişiler ekleme, ileti gönderme ve ileti geçmişini alma gibi şeyler.

Bu ortak kodu Paylaşılan Proje, PCL veya Yerel Kitaplık'a taşıyarak, bu kodun ortak bir yerde tutulmasını kolaylaştırır ve Uzantı ile üst uygulamanın kullanıcı için tekdüzen deneyimler ve işlevler sağlamasını sağlar.

MonkeyChat örnek uygulaması söz konusu olduğunda, ağ ve veritabanı erişimi gibi veri modelleri ve işleme kodu Yerel Kitaplığa taşınacaktır.

Aşağıdakileri yapın:

  1. Mac için Visual Studio başlatın ve MonkeyChat uygulamasını açın.

  2. Çözüm Bölmesi'nde Çözüm Adı'na sağ tıklayın ve Yeni Proje Ekle...'yi>seçin:

    Yeni proje ekleme

  3. iOS>Kitaplığı Sınıf Kitaplığı'nı> seçin ve İleri düğmesine tıklayın:

    Sınıf Kitaplığı Seç

  4. Ad alanına girin MonkeyChatCommon ve Oluştur düğmesine tıklayın:

    Ad olarak MonkeyChatCommon girin

  5. Çözüm Gezgini ana uygulamanın Başvurular klasörüne sağ tıklayın ve Başvuruları Düzenle... öğesini seçin. MonkeyChatCommon projesini kontrol edin ve Tamam düğmesine tıklayın:

    MonkeyChatCommon projesini kontrol edin

  6. Çözüm Gezgini, ortak paylaşılan kodu ana uygulamadan Yerel Kitaplık'a sürükleyin.

  7. MonkeyChat söz konusu olduğunda, DataModels ve İşlemciler klasörlerini ana uygulamadan Yerel Kitaplık'a sürükleyin:

    Çözüm Gezgini DataModels ve İşlemciler klasörleri

Yerel Kitaplığa taşınan dosyalardan herhangi birini düzenleyin ve ad alanını kitaplığınkiyle eşleşecek şekilde değiştirin. Örneğin, olarak değiştiriliyor MonkeyChatMonkeyChatCommon:

using System;
namespace MonkeyChatCommon
{
    /// <summary>
    /// A message sent from one user to another within a conversation.
    /// </summary>
    public class MonkeyMessage
    {
        public MonkeyMessage ()
        {
        }
        ...
    }
}

Ardından ana uygulamaya dönün ve uygulamanın taşınan sınıflardan birini kullandığı her yere Yerel Kitaplığın ad alanı için bir using deyim ekleyin:

using System;
using System.Collections.Generic;
using UIKit;
using Foundation;
using CoreGraphics;
using MonkeyChatCommon;

namespace MonkeyChat
{
    public partial class MasterViewController : UITableViewController
    {
        public DetailViewController DetailViewController { get; set; }

        DataSource dataSource;
        ...
    }
}

Uzantılar için Uygulama Mimarisi Oluşturma

Genellikle bir uygulama birden çok Amaç için kaydolacaktır ve geliştiricinin uygulamanın uygun sayıda Amaç Uzantısı için tasarlandığından emin olması gerekir.

Bir uygulamanın birden fazla Amaç gerektirdiği durumlarda geliştirici, Amaç işlemesinin tümünü tek bir Amaç Uzantısına yerleştirme veya her Amaç için ayrı bir Amaç Uzantısı oluşturma seçeneğine sahiptir.

Her Amaç için ayrı bir Amaç Uzantısı oluşturmayı seçerseniz, geliştirici her uzantıda büyük miktarda ortak kod çoğaltabilir ve büyük miktarda işlemci ve bellek yükü oluşturabilir.

İki seçenek arasında seçim yapmaya yardımcı olmak için Amaçlardan herhangi birinin doğal olarak birbirine ait olup olmadığını görün. Örneğin, sesli ve görüntülü aramalar yapan bir uygulama, benzer görevleri işlerken bu Amaçların her ikisini de tek bir Amaç Uzantısına dahil etmek isteyebilir ve kodun en çok yeniden kullanılmasını sağlayabilir.

Var olan bir gruba sığmayan herhangi bir Amaç veya Amaç grubu için, uygulamanın çözümünde bunları içerecek yeni bir Amaç Uzantısı oluşturun.

Gerekli Yetkilendirmeleri Ayarlama

SiriKit tümleştirmesi içeren tüm Xamarin.iOS uygulamaları doğru yetkilendirmelere sahip olmalıdır. Geliştirici bu gerekli yetkilendirmeleri doğru ayarlamazsa, uygulamayı gerçek iOS 10 (veya üzeri) donanıma yükleyemez veya test edemeyecektir. Bu, iOS 10 Simülatörü SiriKit'i desteklemediğinden de gereklidir.

Aşağıdakileri yapın:

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

  2. Kaynak sekmesine geçin.

  3. com.apple.developer.siriÖzelliğini ekleyin, TürBoolean değerini ve Değeri olarak Yesayarlayın:

    com.apple.developer.siri Özelliğini ekleme

  4. Dosyadaki değişiklikleri kaydedin.

  5. Düzenlemek üzere açmak için Çözüm Gezgini proje dosyasına çift tıklayın.

  6. iOS Paket İmzalama'ya tıklayın ve Özel Yetkilendirmeler alanında dosyanın seçili olduğundan emin olunEntitlements.plist:

    Özel Yetkilendirmeler alanında Entitlements.plist dosyasını seçin

  7. Değişiklikleri kaydetmek için Tamam düğmesine tıklayın.

tamamlandığında, uygulamanın Entitlements.plist dosyası aşağıdaki gibi görünmelidir (bir dış düzenleyicide açılır):

<?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.siri</key>
    <true/>
</dict>
</plist>

Uygulamayı Doğru Sağlama

Apple'ın SiriKit çerçevesinin çevresine yerleştirdiği katı güvenlik nedeniyle, SiriKit'i uygulayan tüm Xamarin.iOS uygulamaları doğru Uygulama Kimliğine ve Yetkilendirmelere sahip olmalıdır (yukarıdaki bölüme bakın) ve uygun bir Sağlama Profili ile imzalanmalıdır.

Mac bilgisayarınızda aşağıdakileri yapın:

  1. Bir web tarayıcısında adresine gidin https://developer.apple.com ve hesabınızda oturum açın.

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

  3. Sağlama Profilleri'ni seçin ve Uygulama Kimlikleri'ni seçin ve ardından düğmeye + tıklayın.

  4. Yeni Profil için bir Ad girin.

  5. Apple'ın adlandırma önerisini izleyerek bir Paket Kimliği girin.

  6. Aşağı kaydırarak App Services bölümüne gelin, SiriKit'i seçin ve Devam düğmesine tıklayın:

    SiriKit'i seçin

  7. Tüm ayarları doğrulayın ve uygulama kimliğini gönderin .

  8. Sağlama Profilleri>Geliştirme'yi seçin, düğmeye + tıklayın, Apple Kimliğini seçin ve ardından Devam'a tıklayın.

  9. Tümünü Seç'e ve ardından Devam'a tıklayın.

  10. Tümünü Seç'e yeniden tıklayın ve ardından Devam'a tıklayın.

  11. Apple'ın adlandırma önerilerini kullanarak bir Profil Adı girin ve Devam'a tıklayın.

  12. Xcode'ı başlatın.

  13. Xcode menüsünde Tercihler... öğesini seçin .

  14. Hesaplar'ı seçin, ardından Ayrıntıları Görüntüle... düğmesine tıklayın:

    Hesaplar'ı seçin

  15. Sol alt köşedeki Tüm Profilleri İndir Düğmesine tıklayın:

    Tüm Profilleri İndir

  16. Yukarıda oluşturulan Sağlama Profilinin Xcode'a yüklendiğinden emin olun.

  17. Mac için Visual Studio'da SiriKit desteği eklemek için projeyi açın.

  18. Çözüm Gezgini dosyasına çift tıklayınInfo.plist.

  19. Paket Tanımlayıcısının yukarıdaki Apple Geliştirici Portalı'nda oluşturulanla eşleştiğinden emin olun:

    Paket Tanımlayıcısı

  20. Çözüm Gezgini Proje'yi seçin.

  21. Projeye sağ tıklayın ve Seçenekler'i seçin.

  22. iOS Paket İmzalama'yı seçin, yukarıda oluşturulan İmzalama Kimliği ve Sağlama Profili'ni seçin:

    İmzalama Kimliği ve Sağlama Profili'ni seçin

  23. Değişiklikleri kaydetmek için Tamam düğmesine tıklayın.

Önemli

SiriKit'i test etme, iOS 10 Simülatörü'nde değil yalnızca gerçek bir iOS 10 Donanım Cihazı'nda çalışır. SiriKit özellikli bir Xamarin.iOS uygulamasını gerçek donanıma yüklerken sorun yaşıyorsanız gerekli Yetkilendirmeler, Uygulama Kimliği, İmzalama Tanımlayıcısı ve Sağlama Profili'nin hem Apple Geliştirici Portalı'nda hem de Mac için Visual Studio doğru yapılandırıldığından emin olun.

Siri Yetkilendirmesi İsteme

Uygulama Herhangi bir Kullanıcıya Özgü Sözcük Dağarcığı eklemeden veya Amaçlar Uzantıları Siri'ye bağlanmadan önce, kullanıcıdan Siri'ye erişmek için yetkilendirme istemesi gerekir.

Uygulamanın Info.plist dosyasını düzenleyin, Kaynak görünümüne geçin ve anahtarı uygulamanın Siri'yi nasıl kullanacağını ve hangi veri türlerinin gönderileceğini açıklayan bir dize değeriyle ekleyinNSSiriUsageDescription. Örneğin, MonkeyChat uygulaması "MonkeyChat kişileri Siri'ye gönderilecek" diyebilir:

Info.plist düzenleyicisindeki NSSiriUsageDescription

RequestSiriAuthorization Uygulama ilk kez başlatıldığında sınıfının yöntemini INPreferences çağırın. sınıfını AppDelegate.cs düzenleyin ve yönteminin FinishedLaunching aşağıdaki gibi görünmesini sağlayın:

using Intents;
...

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{

    // Request access to Siri
    INPreferences.RequestSiriAuthorization ((INSiriAuthorizationStatus status) => {
        // Respond to returned status
        switch (status) {
        case INSiriAuthorizationStatus.Authorized:
            break;
        case INSiriAuthorizationStatus.Denied:
            break;
        case INSiriAuthorizationStatus.NotDetermined:
            break;
        case INSiriAuthorizationStatus.Restricted:
            break;
        }
    });

    return true;
}

Bu yöntem ilk kez çağrıldığında, kullanıcıdan uygulamanın Siri'ye erişmesine izin vermesini isteyen bir uyarı görüntülenir. Geliştiricinin yukarıdakine NSSiriUsageDescription eklediği ileti bu uyarıda görüntülenir. Kullanıcı başlangıçta erişimi reddederse, uygulamaya erişim vermek için Ayarlar uygulamasını kullanabilir.

Uygulama istediğiniz zaman sınıfının yöntemini çağırarak uygulamanın Siri'ye erişme becerisini SiriAuthorizationStatusINPreferences denetleyebiliyor.

Yerelleştirme ve Siri

Bir iOS cihazında kullanıcı Siri için sistem varsayılanı olandan farklı bir dil seçebilir. Yerelleştirilmiş verilerle çalışırken uygulamanın Siri'den dil kodunu almak için sınıfının yöntemini INPreferences kullanması SiriLanguageCode gerekir. Örneğin:

var language = INPreferences.SiriLanguageCode();

// Take action based on language
if (language == "en-US") {
    // Do something...
}

Kullanıcıya Özgü Sözcük Dağarcığı Ekleme

Kullanıcıya Özgü Sözlük, uygulamanın bireysel kullanıcılarına özel sözcükler veya tümcecikler sağlayacaktır. Bunlar çalışma zamanında ana uygulamadan (Uygulama Uzantıları'ndan değil), kullanıcılar için en önemli kullanım önceliğine göre sıralanmış, listenin başındaki en önemli terimlerle sıralanmış bir terim kümesi olarak sağlanacaktır.

Kullanıcıya Özgü Sözlük aşağıdaki kategorilerden birine ait olmalıdır:

  • Kişi Adları (Kişiler çerçevesi tarafından yönetilmeyen adlar).
  • Fotoğraf Etiketleri.
  • Fotoğraf Albümü Adları.
  • Antrenman Adları.

Özel kelime dağarcığı olarak kaydolmak için terminolojiyi seçerken, yalnızca uygulamaya aşina olmayan biri tarafından yanlış anlaşılacak terimleri seçin. "Antrenmanım" veya "Albümüm" gibi yaygın terimleri hiçbir zaman kaydetmeyin. Örneğin, MonkeyChat uygulaması her bir kişiyle ilişkili takma adları kullanıcının adres defterine kaydeder.

Uygulama, sınıfının yöntemini INVocabulary çağırarak SetVocabularyStrings ve ana uygulamadan bir NSOrderedSet koleksiyon geçirerek Kullanıcıya Özgü Sözcük Dağarcığını sağlar. Yeni terimler eklemeden önce mevcut terimleri kaldırmak için uygulamanın her zaman önce yöntemini çağırması RemoveAllVocabularyStrings gerekir. Örneğin:

using System;
using System.Linq;
using System.Collections.Generic;
using Foundation;
using Intents;

namespace MonkeyChatCommon
{
    public class MonkeyAddressBook : NSObject
    {
        #region Computed Properties
        public List<MonkeyContact> Contacts { get; set; } = new List<MonkeyContact> ();
        #endregion

        #region Constructors
        public MonkeyAddressBook ()
        {
        }
        #endregion

        #region Public Methods
        public NSOrderedSet<NSString> ContactNicknames ()
        {
            var nicknames = new NSMutableOrderedSet<NSString> ();

            // Sort contacts by the last time used
            var query = Contacts.OrderBy (contact => contact.LastCalledOn);

            // Assemble ordered list of nicknames by most used to least
            foreach (MonkeyContact contact in query) {
                nicknames.Add (new NSString (contact.ScreenName));
            }

            // Return names
            return new NSOrderedSet<NSString> (nicknames.AsSet ());
        }

        // This method MUST only be called on a background thread!
        public void UpdateUserSpecificVocabulary ()
        {
            // Clear any existing vocabulary
            INVocabulary.SharedVocabulary.RemoveAllVocabularyStrings ();

            // Register new vocabulary
            INVocabulary.SharedVocabulary.SetVocabularyStrings (ContactNicknames (), INVocabularyStringType.ContactName);
        }
        #endregion
    }
}

Bu kod uygun olduğunda, aşağıdaki gibi çağrılabilir:

using System;
using System.Threading;
using UIKit;
using MonkeyChatCommon;
using Intents;

namespace MonkeyChat
{
    public partial class ViewController : UIViewController
    {
        #region AppDelegate Access
        public AppDelegate ThisApp {
            get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
        }
        #endregion

        #region Constructors
        protected ViewController (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Do we have access to Siri?
            if (INPreferences.SiriAuthorizationStatus == INSiriAuthorizationStatus.Authorized) {
                // Yes, update Siri's vocabulary
                new Thread (() => {
                    Thread.CurrentThread.IsBackground = true;
                    ThisApp.AddressBook.UpdateUserSpecificVocabulary ();
                }).Start ();
            }
        }

        public override void DidReceiveMemoryWarning ()
        {
            base.DidReceiveMemoryWarning ();
            // Release any cached data, images, etc that aren't in use.
        }
        #endregion
    }
}

Önemli

Siri özel kelime dağarcığını ipuçları olarak ele alır ve terminolojinin mümkün olduğunca çoğunu içerir. Ancak, özel sözlük alanı sınırlı olduğundan yalnızca kafa karıştırıcı olabilecek terminolojiyi kaydetmeyi önemli hale getirir ve bu nedenle kayıtlı terimlerin toplam sayısını en az düzeyde tutar.

Daha fazla bilgi için lütfen Kullanıcıya Özgü Sözlük Başvurusu ve Apple'ın Özel Sözlük Başvurusu Belirtme bölümüne bakın.

Uygulamaya Özgü Sözcük Dağarcığı Ekleme

Uygulamaya Özgü Sözlük, araç türleri veya antrenman adları gibi uygulamanın tüm kullanıcıları tarafından bilinecek belirli sözcükleri ve tümcecikleri tanımlar. Bunlar uygulamanın bir parçası olduğundan, ana uygulama paketinin bir parçası olarak bir AppIntentVocabulary.plist dosyada tanımlanırlar. Ayrıca, bu sözcükler ve tümcecikler yerelleştirilmelidir.

Uygulamaya Özgü Sözlük terimleri aşağıdaki kategorilerden birine ait olmalıdır:

  • Sürüş Seçenekleri.
  • Antrenman Adları.

Uygulamaya Özgü Sözlük dosyası iki kök düzeyi anahtarı içerir:

  • ParameterVocabulariesGerekli - Uygulamanın özel terimlerini ve uygulandıkları Amaç Parametrelerini tanımlar.
  • IntentPhrasesİsteğe bağlı - içinde ParameterVocabulariestanımlanan özel terimleri kullanarak örnek tümcecikler içerir.

içindeki ParameterVocabularies her girdi bir kimlik dizesi, terim ve terimin uygulandığı Amaç belirtmelidir. Ayrıca, tek bir terim birden çok Amaç için geçerli olabilir.

Kabul edilebilir değerlerin ve gerekli dosya yapısının tam listesi için bkz. Apple'ın Uygulama Sözlüğü Dosya Biçimi Başvurusu.

Uygulama projesine dosya AppIntentVocabulary.plist eklemek için aşağıdakileri yapın:

  1. Çözüm Gezgini Proje Adı'na sağ tıklayın ve Yeni Dosya Ekle>... öğesini seçin.>iOS:

    Özellik listesi ekleme

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

  3. + Bir anahtar eklemek için öğesine tıklayın, Ad ParameterVocabularies ve TürArrayolarak ayarlayın:

    Name değerini ParameterVocabularies ve Type değerini Array olarak ayarlayın

  4. Genişletip ParameterVocabularies düğmeye + tıklayın ve Tür değerini olarak Dictionaryayarlayın:

    Tür'leri Sözlük olarak ayarlama

  5. + Yeni bir anahtar eklemek için öğesine tıklayın, Ad ParameterNames ve TürArrayolarak ayarlayın:

    Adı ParameterNames ve Tür değerini Dizi olarak ayarlayın

  6. + TürüString ve değeri kullanılabilir Parametre Adlarından biri olarak yeni bir anahtar eklemek için öğesine tıklayın. Örneğin, INStartWorkoutIntent.workoutName:

    INStartWorkoutIntent.workoutName anahtarı

  7. anahtarı türüne ParameterVocabularyParameterVocabularies sahip anahtara Arrayekleyin:

    ParameterVocabulary anahtarını Array Türü ile ParameterVocabularies anahtarına ekleme

  8. Türüne Dictionarysahip yeni bir anahtar ekleyin:

    Mac için Visual Studio'de Sözlük Türü ile yeni bir anahtar ekleyin.

  9. Türüne VocabularyItemIdentifierString sahip anahtarı ekleyin ve terim için benzersiz bir kimlik belirtin:

    Dize Türü ile VocabularyItemIdentifier anahtarını ekleyin ve benzersiz bir kimlik belirtin

  10. VocabularyItemSynonyms anahtarını türüyle Arrayekleyin:

    Dizi Türü ile VocabularyItemSynonyms anahtarını ekleyin

  11. Türüne Dictionarysahip yeni bir anahtar ekleyin:

    Mac için Visual Studio'da Sözlük Türü ile başka bir yeni anahtar ekleyin.

  12. VocabularyItemPhrase Anahtarı TürüString ve uygulamanın tanımlanmakta olduğu terimle ekleyin:

    String türüne ve uygulamanın tanımlıyor olduğu terime sahip VocabularyItemPhrase anahtarını ekleyin

  13. VocabularyItemPronunciation TürüString ve teriminin fonetik söylenişi ile anahtarı ekleyin:

    String Türü ve terimin fonetik söylenişi ile VocabularyItemPronunciation anahtarını ekleyin

  14. VocabularyItemExamples anahtarını türüyle Arrayekleyin:

    Dizi Türü ile VocabularyItemExamples anahtarını ekleyin

  15. Terimin örnek kullanımlarıyla birkaç String anahtar ekleyin:

    Mac için Visual Studio'da terimin örnek kullanımlarıyla birkaç Dize anahtarı ekleyin.

  16. Uygulamanın tanımlaması gereken diğer özel terimler için yukarıdaki adımları yineleyin.

  17. Anahtarı daraltın ParameterVocabularies .

  18. IntentPhrases anahtarını türüyle Arrayekleyin:

    IntentPhrases anahtarını Dizi Türü ile ekleme

  19. Türüne Dictionarysahip yeni bir anahtar ekleyin:

    Mac için Visual Studio'de Sözlük Türü ile ek bir yeni anahtar ekleyin.

  20. IntentName Örneğin TürüString ve Amacı ile anahtarı ekleyin:

    Örnek için Dize ve Amaç Türü ile IntentName anahtarını ekleyin

  21. IntentExamples anahtarını türüyle Arrayekleyin:

    Dizi Türü ile IntentExamples anahtarını ekleyin

  22. Terimin örnek kullanımlarıyla birkaç String anahtar ekleyin:

    Mac için Visual Studio'da terimin örnek kullanımlarıyla birkaç ek Dize anahtarı ekleyin.

  23. Uygulamanın örnek kullanımı sağlaması gereken amaçlar için yukarıdaki adımları yineleyin.

Önemli

geliştirme AppIntentVocabulary.plist sırasında test cihazlarında Siri'ye kaydedilir ve Siri'nin özel kelime dağarcığını eklemesi biraz zaman alabilir. Sonuç olarak, test edenin güncelleştirildiğinde Uygulamaya Özgü Sözcük Dağarcığını test etmeye çalışmadan önce birkaç dakika beklemesi gerekir.

Daha fazla bilgi için lütfen Uygulamaya Özgü Sözlük Başvurusu ve Apple'ın Özel Sözlük Başvurusu Belirtme bölümüne bakın.

Intents Uzantısı Ekleme

Uygulama Artık SiriKit'i benimsemeye hazır olduğuna göre, geliştiricinin Siri tümleştirmesi için gereken Amaçları işlemek için çözüme bir (veya daha fazla) Amaç Uzantısı eklemesi gerekir.

Gereken her Intents Uzantısı için aşağıdakileri yapın:

  • Xamarin.iOS uygulama çözümüne bir Intents Extension projesi ekleyin.
  • Intents Uzantısı Info.plist dosyasını yapılandırın.
  • Intents Uzantısı ana sınıfını değiştirin.

Daha fazla bilgi için lütfen Amaçlar Uzantısı Başvurusu ve Apple'ın Intents Uzantısını Oluşturma başvurumuza bakın.

Uzantı Oluşturma

Çözüme bir Intents Uzantısı eklemek için aşağıdakileri yapın:

  1. Çözüm Bölmesi'nde Çözüm Adı'na sağ tıklayın ve Yeni Proje Ekle>... öğesini seçin.

  2. İletişim kutusundan iOS>Uzantıları>Amaç Uzantısı'nıseçin ve İleri düğmesine tıklayın:

    Amaç Uzantısını Seçin

  3. Ardından Amaç Uzantısı için bir Ad girin ve İleri düğmesine tıklayın:

    Amaç Uzantısı için bir Ad girin.

  4. Son olarak, Uygulama çözümüne Amaç Uzantısını eklemek için Oluştur düğmesine tıklayın:

    Intent Extension'ı uygulamalar çözümüne ekleyin.

  5. Çözüm Gezgini, yeni oluşturulan Amaç Uzantısının Başvurular klasörüne sağ tıklayın. Ortak paylaşılan kod kitaplığı projesinin adını (yukarıda oluşturulan uygulama) denetleyin ve Tamam düğmesine tıklayın:

    Ortak paylaşılan kod kitaplığı projesinin adını seçin.

Uygulamanın gerektireceği Amaç Uzantıları sayısı (yukarıdaki Uzantılar için Uygulama Mimarisi Oluşturma bölümüne göre) için bu adımları yineleyin.

Info.plist'i yapılandırma

Uygulamanın çözümüne eklenen Intents Extensions'ın her biri için, dosyalarda Info.plist uygulamayla çalışacak şekilde yapılandırılması gerekir.

Her tipik Uygulama Uzantısında olduğu gibi, uygulamada da ve NSExtensionAttributesanahtarları NSExtension bulunur. Intents Uzantısı için yapılandırılması gereken iki yeni öznitelik vardır:

Yapılandırılması gereken iki yeni öznitelik

  • IntentsSupported - Gereklidir ve uygulamanın Amaç Uzantısı'ndan desteklemek istediği bir Amaç Sınıfı adları dizisinden oluşur.
  • IntentsRestrictedWhileLocked - Uygulamanın uzantının kilit ekranı davranışını belirtmesi için isteğe bağlı bir anahtardır. Uygulamanın, kullanıcının Intent Extension'dan kullanmak üzere oturum açmasını gerektirdiği Bir Amaç Sınıfı adları dizisinden oluşur.

Intent Extension'ın Info.plist dosyasını yapılandırmak için Çözüm Gezgini çift tıklayarak düzenlemek üzere açın. Ardından Kaynak görünümüne geçin ve düzenleyicide ve NSExtensionAttributes tuşlarını genişletinNSExtension:

IntentsSupported Anahtarı genişletin ve bu uzantının destekleyeceğini herhangi bir Intent Sınıfının adını ekleyin. Örnek MonkeyChat uygulaması için şunu destekler INSendMessageIntent:

Uygulama isteğe bağlı olarak kullanıcının belirli bir amacı kullanmak için cihazda oturum açmasını gerektiriyorsa, anahtarı genişletin IntentRestrictedWhileLocked ve erişimi kısıtlanmış Amaçların Sınıf adlarını ekleyin. Örnek MonkeyChat uygulaması için kullanıcının sohbet iletisi göndermek için oturum açmış olması gerekir, bu nedenle ekledik INSendMessageIntent:

Kullanılabilir Amaç Etki Alanlarının tam listesi için lütfen Apple'ın Amaç Etki Alanları Başvurusu'ne bakın.

Ana Sınıfı Yapılandırma

Ardından geliştiricinin, Siri'ye Amaç Uzantısı için ana giriş noktası işlevi gören ana sınıfı yapılandırması gerekir. Temsilciye INExtensionIINIntentHandler uygun bir alt sınıfı olmalıdır. Örneğin:

using System;
using System.Collections.Generic;

using Foundation;
using Intents;

namespace MonkeyChatIntents
{
    [Register ("IntentHandler")]
    public class IntentHandler : INExtension, IINSendMessageIntentHandling, IINSearchForMessagesIntentHandling, IINSetMessageAttributeIntentHandling
    {
        #region Constructors
        protected IntentHandler (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        #endregion

        #region Override Methods
        public override NSObject GetHandler (INIntent intent)
        {
            // This is the default implementation.  If you want different objects to handle different intents,
            // you can override this and return the handler you want for that particular intent.

            return this;
        }
        #endregion
        ...
    }
}

Uygulamanın Intent Extension ana sınıfı GetHandler olan yöntemi üzerinde uygulaması gereken tek bir tekli yöntem vardır. Bu yöntem SiriKit tarafından bir Intent geçirilir ve uygulamanın verilen Amaç türüyle eşleşen bir Amaç İşleyicisi döndürmesi gerekir.

Örnek MonkeyChat uygulaması yalnızca bir amacı işlediğinden, yönteminde GetHandler kendini döndürmektedir. Uzantı birden fazla amacı işlediyse, geliştirici her amaç türü için bir sınıf ekler ve yöntemine geçirilene göre Intent burada bir örnek döndürür.

Çözümleme Aşamasını İşleme

Çözüm aşaması, Amaç Uzantısının Siri'den geçirilen ve kullanıcının konuşması aracılığıyla ayarlanmış parametreleri netleştireceği ve doğruladığı yerdir.

Siri'den gönderilen her parametre için bir Resolve yöntem vardır. Uygulamanın, kullanıcıdan doğru yanıtı almak için Siri'nin yardımına ihtiyaç duyabileceği her parametre için bu yöntemi uygulaması gerekir.

Örnek MonkeyChat uygulaması söz konusu olduğunda, Amaç Uzantısı iletiyi göndermek için bir veya daha fazla alıcı gerektirir. Listedeki her alıcı için uzantının aşağıdaki sonuca sahip olabilecek bir kişi araması yapması gerekir:

  • Tam olarak eşleşen bir kişi bulunur.
  • İki veya daha fazla eşleşen kişi bulunur.
  • Eşleşen kişi bulunamadı.

Buna ek olarak, MonkeyChat iletinin gövdesi için içerik gerektirir. Kullanıcı bunu sağlamadıysa Siri'nin kullanıcıdan içeriği istemesi gerekir.

Amaç Uzantısının bu durumların her birini düzgün bir şekilde işlemesi gerekir.

[Export ("resolveRecipientsForSearchForMessages:withCompletion:")]
public void ResolveRecipients (INSendMessageIntent intent, Action<INPersonResolutionResult []> completion)
{
    var recipients = intent.Recipients;
    // If no recipients were provided we'll need to prompt for a value.
    if (recipients.Length == 0) {
        completion (new INPersonResolutionResult [] { (INPersonResolutionResult)INPersonResolutionResult.NeedsValue });
        return;
    }

    var resolutionResults = new List<INPersonResolutionResult> ();

    foreach (var recipient in recipients) {
        var matchingContacts = new INPerson [] { recipient }; // Implement your contact matching logic here to create an array of matching contacts
        if (matchingContacts.Length > 1) {
            // We need Siri's help to ask user to pick one from the matches.
            resolutionResults.Add (INPersonResolutionResult.GetDisambiguation (matchingContacts));
        } else if (matchingContacts.Length == 1) {
            // We have exactly one matching contact
            resolutionResults.Add (INPersonResolutionResult.GetSuccess (recipient));
        } else {
            // We have no contacts matching the description provided
            resolutionResults.Add ((INPersonResolutionResult)INPersonResolutionResult.Unsupported);
        }
    }

    completion (resolutionResults.ToArray ());
}

[Export ("resolveContentForSendMessage:withCompletion:")]
public void ResolveContent (INSendMessageIntent intent, Action<INStringResolutionResult> completion)
{
    var text = intent.Content;
    if (!string.IsNullOrEmpty (text))
        completion (INStringResolutionResult.GetSuccess (text));
    else
        completion ((INStringResolutionResult)INStringResolutionResult.NeedsValue);
}

Daha fazla bilgi için lütfen Çözümlenme Aşaması Başvurusu ve Apple'ın Çözümleme ve İşleme Amaçları Başvurusu'na bakın.

Onaylama Aşamasını İşleme

Onay Aşaması, Amaç Uzantısının kullanıcının isteğini yerine getirmek için tüm bilgilere sahip olup olmadığını denetlediği yerdir. Uygulama, Siri'ye ne olacağıyla ilgili tüm destekleyici ayrıntıları birlikte göndermek istiyor, böylece kullanıcıdan istenen eylemin bu olduğu doğrulanabilir.

[Export ("confirmSendMessage:completion:")]
public void ConfirmSendMessage (INSendMessageIntent intent, Action<INSendMessageIntentResponse> completion)
{
    // Verify user is authenticated and the app is ready to send a message.
    ...

    var userActivity = new NSUserActivity (nameof (INSendMessageIntent));
    var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Ready, userActivity);
    completion (response);
}

Daha fazla bilgi için lütfen Aşama Başvurumuzu Onayla bölümüne bakın.

Amacı İşleme

Amaç Uzantısı'nın kullanıcının isteğini yerine getirmek ve sonuçları Siri'ye geri ileterek kullanıcının bilgilenebilmesini sağlamak için görevi gerçekleştirdiği nokta budur.

public void HandleSendMessage (INSendMessageIntent intent, Action<INSendMessageIntentResponse> completion)
{
    // Implement the application logic to send a message here.
    ...

    var userActivity = new NSUserActivity (nameof (INSendMessageIntent));
    var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Success, userActivity);
    completion (response);
}

public void HandleSearchForMessages (INSearchForMessagesIntent intent, Action<INSearchForMessagesIntentResponse> completion)
{
    // Implement the application logic to find a message that matches the information in the intent.
    ...

    var userActivity = new NSUserActivity (nameof (INSearchForMessagesIntent));
    var response = new INSearchForMessagesIntentResponse (INSearchForMessagesIntentResponseCode.Success, userActivity);

    // Initialize with found message's attributes
    var sender = new INPerson (new INPersonHandle ("sarah@example.com", INPersonHandleType.EmailAddress), null, "Sarah", null, null, null);
    var recipient = new INPerson (new INPersonHandle ("+1-415-555-5555", INPersonHandleType.PhoneNumber), null, "John", null, null, null);
    var message = new INMessage ("identifier", "I am so excited about SiriKit!", NSDate.Now, sender, new INPerson [] { recipient });
    response.Messages = new INMessage [] { message };
    completion (response);
}

public void HandleSetMessageAttribute (INSetMessageAttributeIntent intent, Action<INSetMessageAttributeIntentResponse> completion)
{
    // Implement the application logic to set the message attribute here.
    ...

    var userActivity = new NSUserActivity (nameof (INSetMessageAttributeIntent));
    var response = new INSetMessageAttributeIntentResponse (INSetMessageAttributeIntentResponseCode.Success, userActivity);
    completion (response);
}

Daha fazla bilgi için bkz . The Handle Stage Reference.

Intents KULLANıCı Arabirimi Uzantısı Ekleme

İsteğe bağlı Amaçlar Kullanıcı Arabirimi Uzantısı, uygulamanın kullanıcı arabirimini ve markasını Siri deneyimine getirme ve kullanıcıların uygulamaya bağlı hissetmesini sağlama fırsatı sunar. Bu uzantı ile uygulama, markanın yanı sıra görsel ve diğer bilgileri transkripte getirebilir.

Örnek Intents UI Uzantısı çıkışı

Amaç Uzantısında olduğu gibi geliştirici de Intents UI Uzantısı için aşağıdaki adımı gerçekleştirir:

  • Xamarin.iOS uygulama çözümüne bir Intents UI Uzantısı projesi ekleyin.
  • Intents UI Uzantısı Info.plist dosyasını yapılandırın.
  • Intents UI Uzantısı ana sınıfını değiştirin.

Daha fazla bilgi için lütfen Amaçlar Kullanıcı Arabirimi Uzantısı Başvurusu ve Apple'ın Özel Arabirim Başvurusu Sağlama bölümüne bakın.

Uzantı Oluşturma

Çözüme Intents UI Uzantısı eklemek için aşağıdakileri yapın:

  1. Çözüm Bölmesi'nde Çözüm Adı'na sağ tıklayın ve Yeni Proje Ekle>... öğesini seçin.

  2. İletişim kutusundan iOS>Uzantıları>Amaç Kullanıcı Arabirimi Uzantısı'nıseçin ve İleri düğmesine tıklayın:

    Amaç Kullanıcı Arabirimi Uzantısını Seçin

  3. Ardından Amaç Uzantısı için bir Ad girin ve İleri düğmesine tıklayın:

    Mac için Visual Studio'da Amaç Uzantısı için bir Ad girin.

  4. Son olarak, Uygulama çözümüne Amaç Uzantısını eklemek için Oluştur düğmesine tıklayın:

    amaç uzantısını Mac için Visual Studio uygulamalar çözümüne ekleyin.

  5. Çözüm Gezgini, yeni oluşturulan Amaç Uzantısının Başvurular klasörüne sağ tıklayın. Ortak paylaşılan kod kitaplığı projesinin adını (yukarıda oluşturulan uygulama) denetleyin ve Tamam düğmesine tıklayın:

    Mac için Visual Studio ortak paylaşılan kod kitaplığı projesinin adını seçin.

Info.plist'i yapılandırma

Intents UI Uzantısının Info.plist dosyasını uygulamayla çalışacak şekilde yapılandırın.

Her tipik Uygulama Uzantısında olduğu gibi, uygulamada da ve NSExtensionAttributesanahtarları NSExtension bulunur. Intents Uzantısı için yapılandırılması gereken yeni bir öznitelik vardır:

Yapılandırılması gereken yeni bir öznitelik

IntentsSupported gereklidir ve uygulamanın Intent Extension'dan desteklemek istediği bir Amaç Sınıfı adları dizisinden oluşur.

Intent UI Uzantısı'nın Info.plist dosyasını yapılandırmak için Çözüm Gezgini çift tıklayarak düzenlemek üzere açın. Ardından Kaynak görünümüne geçin ve düzenleyicide ve NSExtensionAttributes tuşlarını genişletinNSExtension:

NSExtension ve NSExtensionAttributes anahtarları düzenleyicide bulunur.

IntentsSupported Anahtarı genişletin ve bu uzantının destekleyeceğini herhangi bir Intent Sınıfının adını ekleyin. Örnek MonkeyChat uygulaması için şunu destekler INSendMessageIntent:

Kullanılabilir Amaç Etki Alanlarının tam listesi için lütfen Apple'ın Amaç Etki Alanları Başvurusu'ne bakın.

Ana Sınıfı Yapılandırma

Siri'ye Intent UI Uzantısı için ana giriş noktası işlevi gören ana sınıfı yapılandırın. Arabirime IINUIHostedViewController uyan bir alt sınıfı UIViewController olmalıdır. Örneğin:

using System;
using Foundation;
using CoreGraphics;
using Intents;
using IntentsUI;
using UIKit;

namespace MonkeyChatIntentsUI
{
    public partial class IntentViewController : UIViewController, IINUIHostedViewControlling
    {
        #region Constructors
        protected IntentViewController (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Do any required interface initialization here.
        }

        public override void DidReceiveMemoryWarning ()
        {
            // Releases the view if it doesn't have a superview.
            base.DidReceiveMemoryWarning ();

            // Release any cached data, images, etc that aren't in use.
        }
        #endregion

        #region Public Methods
        [Export ("configureWithInteraction:context:completion:")]
        public void Configure (INInteraction interaction, INUIHostedViewContext context, Action<CGSize> completion)
        {
            // Do configuration here, including preparing views and calculating a desired size for presentation.

            if (completion != null)
                completion (DesiredSize ());
        }

        [Export ("desiredSize:")]
        public CGSize DesiredSize ()
        {
            return ExtensionContext.GetHostedViewMaximumAllowedSize ();
        }
        #endregion
    }
}

Siri, Intent UI Uzantısı içindeki Configure örneğin yöntemine UIViewController bir INInteraction sınıf örneği geçirir.

INInteraction nesnesi, uzantıya üç önemli bilgi parçası sağlar:

  1. İşlenen Intent nesnesi.
  2. Intent Extension'ın Confirm ve Handle yöntemlerinden Intent Response nesnesi.
  3. Uygulama ile Siri arasındaki etkileşimin durumunu tanımlayan Etkileşim Durumu.

Örnek UIViewController , Siri ile etkileşim için ilke sınıfıdır ve öğesinden UIViewControllerdevraldığı için UIKit'in tüm özelliklerine erişebilir.

Siri yöntemini çağırdığındaConfigure, Görünüm Denetleyicisinin UIViewController bir Siri Kod Parçacığında veya Haritalar Kartında barındırılacağını belirten bir Görünüm Bağlamı'na geçer.

Siri ayrıca uygulamanın yapılandırmayı tamamladıktan sonra görünümün istenen boyutunu döndürmesi gereken bir tamamlama işleyicisi de geçirir.

iOS Tasarım Aracı'de kullanıcı arabirimini tasarlama

iOS Tasarım Aracı Intents UI Uzantısı'nın kullanıcı arabirimini düzenleyebilirsiniz. Düzenlemek üzere açmak için Çözüm Gezgini uzantının MainInterface.storyboarddosyasına çift tıklayın. Kullanıcı Arabirimini oluşturmak ve değişiklikleri kaydetmek için gerekli tüm kullanıcı arabirimi öğelerini sürükleyin.

Önemli

Intent UI Uzantısı'nın UIViewControlleröğesine veya UITextFields gibi UIButtons etkileşimli öğeler eklemek mümkün olsa da, bunlar etkileşimli olmayan amaçlarla kullanıcı arabirimi olarak kesinlikle yasaktır ve kullanıcı bunlarla etkileşim kuramaz.

Kullanıcı Arabirimini Bağla

Intents UI Uzantısının iOS Tasarım Aracı oluşturulan Kullanıcı Arabirimi ile alt sınıfı düzenleyin UIViewController ve yöntemini aşağıdaki gibi geçersiz kılınConfigure:

[Export ("configureWithInteraction:context:completion:")]
public void Configure (INInteraction interaction, INUIHostedViewContext context, Action<CGSize> completion)
{
    // Do configuration here, including preparing views and calculating a desired size for presentation.
    ...

    // Return desired size
    if (completion != null)
        completion (DesiredSize ());
}

[Export ("desiredSize:")]
public CGSize DesiredSize ()
{
    return ExtensionContext.GetHostedViewMaximumAllowedSize ();
}

Varsayılan Siri kullanıcı arabirimini geçersiz kılma

Amaçlar Kullanıcı Arabirimi Uzantısı her zaman kullanıcı arabiriminin üst kısmındaki uygulama simgesi ve ad gibi diğer Siri içeriğiyle birlikte görüntülenir veya Amaç temelinde, düğmeler (Gönder veya İptal gibi) altta görüntülenebilir.

Uygulamanın, Siri'nin kullanıcıya varsayılan olarak görüntülediği bilgileri değiştirebileceği birkaç örnek vardır. Örneğin, mesajlaşma veya uygulamanın varsayılan deneyimi uygulamaya uyarlanmış bir deneyimle değiştirebileceği haritalar.

Intents UI Uzantısının varsayılan Siri kullanıcı arabiriminin öğelerini geçersiz kılması gerekiyorsa, alt sınıfın UIViewController arabirimi uygulaması IINUIHostedViewSiriProviding ve belirli bir arabirim öğesini görüntülemeyi kabul etmesi gerekir.

Siri'ye Intent UI Uzantısı'nın UIViewController ileti içeriğini zaten görüntülediğini bildirmek için alt sınıfa aşağıdaki kodu ekleyin:

public bool DisplaysMessage {
    get {return true;}
}

Dikkat edilmesi gereken noktalar

Apple, geliştiricinin Intent UI Uzantılarını tasarlarken ve uygularken aşağıdaki noktaları dikkate almasını önerir:

  • Bellek Kullanımının Bilincinde Olun - Amaç Kullanıcı Arabirimi Uzantıları geçici olduğundan ve yalnızca kısa bir süre gösterildiğinden, sistem tam bir uygulamayla kullanılandan daha sıkı bellek kısıtlamaları uygular.
  • En Düşük ve En Yüksek Görünüm Boyutlarını göz önünde bulundurun - Intent UI Extensions'ın her iOS cihaz türünde, boyutunda ve yönlendirmesinde iyi göründüğünden emin olun. Ayrıca, uygulamanın Siri'ye geri gönderdiği istenen boyut verilemiyor olabilir.
  • Esnek ve Uyarlamalı Düzen Desenlerini kullanma - Yine kullanıcı arabiriminin her cihazda harika göründüğünden emin olmak için.

Özet

Bu makalede SiriKit ele alınmıştır ve iOS cihazında Siri ve Haritalar uygulamasını kullanarak kullanıcıya erişilebilen hizmetler sağlamak için Xamarin.iOS uygulamalarına nasıl eklenebilecekleri gösterilmiştir.