Udostępnij za pośrednictwem


Implementowanie zestawu SiriKit na platformie Xamarin.iOS

W tym artykule opisano kroki wymagane do zaimplementowania obsługi zestawu SiriKit w aplikacjach platformy Xamarin.iOS.

Nowość dla systemu iOS 10 SiriKit umożliwia aplikacji Xamarin.iOS dostarczanie usług, które są dostępne dla użytkownika przy użyciu Siri i aplikacji Maps na urządzeniu z systemem iOS. W tym artykule opisano kroki wymagane do zaimplementowania obsługi SiriKit w aplikacjach platformy Xamarin.iOS przez dodanie wymaganych rozszerzeń intencji, rozszerzeń interfejsu użytkownika intencji i słownictwa.

Siri współpracuje z koncepcją Domeny, grupami wiedzy akcji związanych z powiązanymi zadaniami. Każda interakcja aplikacji z programem Siri musi należeć do jednej ze znanych domen usług w następujący sposób:

  • Połączenia audio lub wideo.
  • Rezerwacja jazdy.
  • Zarządzanie treningami.
  • Obsługa komunikatów.
  • Wyszukiwanie zdjęć.
  • Wysyłanie lub odbieranie płatności.

Gdy użytkownik wysyła żądanie Siri z udziałem jednej z usług rozszerzenia aplikacji, SiriKit wysyła rozszerzenie obiekt Intent opisujący żądanie użytkownika wraz z wszelkimi danymi pomocniczymi. Następnie rozszerzenie aplikacji generuje odpowiedni obiekt Odpowiedzi dla danej intencji, szczegółowo opisujący sposób obsługi żądania przez rozszerzenie.

Ten przewodnik przedstawia szybki przykład dołączania obsługi SiriKit do istniejącej aplikacji. Na potrzeby tego przykładu będziemy używać fałszywej aplikacji MonkeyChat:

Ikona MonkeyChat

MonkeyChat przechowuje własną książkę kontaktową znajomych użytkownika, z których każda jest skojarzona z nazwą ekranu (na przykład Bobo), i umożliwia użytkownikowi wysyłanie czatów tekstowych do każdego znajomego według nazwy ekranu.

Rozszerzanie aplikacji za pomocą zestawu SiriKit

Jak pokazano w przewodniku Understanding SiriKit Concepts (Omówienie pojęć związanych z zestawem SiriKit), istnieją trzy główne elementy związane z rozszerzaniem aplikacji za pomocą zestawu SiriKit:

Rozszerzanie aplikacji za pomocą diagramu SiriKit

Są to:

  1. Rozszerzenie intencji — weryfikuje odpowiedzi użytkowników, potwierdza, że aplikacja może obsłużyć żądanie i faktycznie wykonuje zadanie w celu spełnienia żądania użytkownika.
  2. Rozszerzenie interfejsu - użytkownika Intencje opcjonalne, udostępnia niestandardowy interfejs użytkownika odpowiedzi w środowisku Siri i może wprowadzić interfejs użytkownika aplikacji i znakowanie do Siri, aby wzbogacić środowisko użytkownika.
  3. Aplikacja — udostępnia aplikację ze słownictwem specyficznym dla użytkownika, aby pomóc Siri w pracy z nim.

Wszystkie te elementy i kroki, które należy uwzględnić w aplikacji, zostaną szczegółowo omówione w poniższych sekcjach.

Przygotowywanie aplikacji

Zestaw SiriKit jest oparty na rozszerzeniach, jednak przed dodaniem jakichkolwiek rozszerzeń do aplikacji istnieje kilka rzeczy, które deweloper musi zrobić, aby pomóc w wdrożeniu SiriKit.

Przenoszenie wspólnego kodu udostępnionego

Najpierw deweloper może przenieść część wspólnego kodu, który będzie współużytkowany między aplikacją i rozszerzeniami, do udostępnionych projektów, bibliotek klas przenośnych (PCLS) lub bibliotek natywnych.

Rozszerzenia muszą mieć możliwość wykonywania wszystkich czynności, które wykonuje aplikacja. Jeśli chodzi o przykładową aplikację MonkeyChat, takie jak znajdowanie kontaktów, dodawanie nowych kontaktów, wysyłanie wiadomości i pobieranie historii wiadomości.

Dzięki przeniesieniu tego wspólnego kodu do udostępnionego projektu, biblioteki PCL lub biblioteki natywnej można łatwo zachować ten kod we wspólnym miejscu i gwarantuje, że rozszerzenie i aplikacja nadrzędna zapewniają jednolite środowiska i funkcje dla użytkownika.

W przypadku przykładowej aplikacji MonkeyChat modele danych i kod przetwarzania, taki jak dostęp do sieci i bazy danych, zostaną przeniesione do biblioteki natywnej.

Należy wykonać następujące czynności:

  1. Uruchom Visual Studio dla komputerów Mac i otwórz aplikację MonkeyChat.

  2. Kliknij prawym przyciskiem myszy nazwę rozwiązania w okienku rozwiązania i wybierz polecenie Dodaj>nowy projekt...:

    Dodawanie nowego projektu

  3. Wybierz pozycję Biblioteka klas biblioteki systemu>iOS>i kliknij przycisk Dalej:

    Wybieranie biblioteki klas

  4. Wprowadź MonkeyChatCommon nazwę i kliknij przycisk Utwórz:

    Wprowadź wartość MonkeyChatCommon jako nazwę

  5. Kliknij prawym przyciskiem myszy folder Odwołania głównej aplikacji w Eksplorator rozwiązań i wybierz polecenie Edytuj odwołania.... Sprawdź projekt MonkeyChatCommon i kliknij przycisk OK:

    Sprawdzanie projektu MonkeyChatCommon

  6. W Eksplorator rozwiązań przeciągnij wspólny kod udostępniony z głównej aplikacji do biblioteki natywnej.

  7. W przypadku aplikacji MonkeyChat przeciągnij foldery DataModels i Processors z głównej aplikacji do biblioteki natywnej:

    Foldery DataModels i Processors w Eksplorator rozwiązań

Zmodyfikuj dowolne pliki, które zostały przeniesione do biblioteki natywnej, i zmień przestrzeń nazw tak, aby była zgodna z tą biblioteką. Na przykład zmiana MonkeyChat na :MonkeyChatCommon

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

Następnie wróć do głównej aplikacji i dodaj instrukcję using dla przestrzeni nazw biblioteki natywnej w dowolnym miejscu, w którym aplikacja używa jednej z przeniesionych klas:

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

Tworzenie architektury aplikacji dla rozszerzeń

Zazwyczaj aplikacja będzie rejestrować się w wielu intencjach, a deweloper musi upewnić się, że aplikacja jest zaprojektowana pod kątem odpowiedniej liczby rozszerzeń intencji.

W sytuacji, gdy aplikacja wymaga więcej niż jednej intencji, deweloper ma możliwość umieszczenia całej jej obsługi intencji w jednym rozszerzeniu intencji lub utworzenia oddzielnego rozszerzenia intencji dla każdej intencji.

Jeśli zdecydujesz się utworzyć oddzielne rozszerzenie intencji dla każdej intencji, deweloper może zduplikować dużą ilość kodu kotłowego w każdym rozszerzeniu i utworzyć dużą ilość procesora i obciążenia pamięci.

Aby ułatwić wybór między dwiema opcjami, sprawdź, czy którakolwiek z intencji naturalnie należy do siebie. Na przykład aplikacja, która wykonała wywołania audio i wideo, może chcieć uwzględnić obie te intencje w jednym rozszerzeniu intencji, ponieważ obsługują podobne zadania i mogą zapewnić największe ponowne użycie kodu.

W przypadku dowolnej intencji lub grupy intencji, które nie mieszczą się w istniejącej grupie, utwórz nowe rozszerzenie intencji w rozwiązaniu aplikacji, aby je zawierać.

Ustawianie wymaganych uprawnień

Każda aplikacja platformy Xamarin.iOS obejmująca integrację SiriKit musi mieć ustawiony prawidłowy zestaw uprawnień. Jeśli deweloper nie ustawi tych wymaganych uprawnień poprawnie, nie będzie mógł zainstalować ani przetestować aplikacji na rzeczywistym sprzęcie z systemem iOS 10 (lub nowszym), co jest również wymagane, ponieważ symulator systemu iOS 10 nie obsługuje SiriKit.

Należy wykonać następujące czynności:

  1. Entitlements.plist Kliknij dwukrotnie plik w Eksplorator rozwiązań, aby otworzyć go do edycji.

  2. Przejdź do karty Źródło.

  3. com.apple.developer.siri Dodaj właściwość , ustaw wartość Type na Boolean i wartość na Yes:

    Dodawanie właściwości com.apple.developer.siri

  4. Zapisz zmiany w pliku.

  5. Kliknij dwukrotnie plik projektu w Eksplorator rozwiązań, aby otworzyć go do edycji.

  6. Wybierz pozycję Podpisywanie pakietu systemu iOS i upewnij się, że Entitlements.plist plik został wybrany w polu Uprawnienia niestandardowe:

    Wybierz plik Entitlements.plist w polu Uprawnienia niestandardowe

  7. Kliknij przycisk OK, aby zapisać zmiany.

Po zakończeniu plik aplikacji Entitlements.plist powinien wyglądać następująco (w otwartym edytorze zewnętrznym):

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

Prawidłowa aprowizacja aplikacji

Ze względu na ścisłe zabezpieczenia umieszczone przez firmę Apple wokół struktury SiriKit każda aplikacja platformy Xamarin.iOS, która implementuje zestaw SiriKit , musi mieć prawidłowy identyfikator aplikacji i uprawnienia (patrz sekcja powyżej) i musi być podpisana przy użyciu odpowiedniego profilu aprowizacji.

Wykonaj następujące czynności na komputerze Mac:

  1. W przeglądarce internetowej przejdź do https://developer.apple.com swojego konta i zaloguj się do niej.

  2. Kliknij pozycję Certyfikaty, identyfikatory i profile.

  3. Wybierz pozycję Profile aprowizacji i wybierz pozycję Identyfikatory aplikacji, a następnie kliknij + przycisk.

  4. Wprowadź nazwę nowego profilu.

  5. Wprowadź identyfikator pakietu zgodnie z zaleceniem nazewnictwa firmy Apple.

  6. Przewiń w dół do sekcji App Services , wybierz pozycję SiriKit i kliknij przycisk Kontynuuj :

    Wybierz pozycję SiriKit

  7. Sprawdź wszystkie ustawienia, a następnie prześlij identyfikator aplikacji.

  8. Wybierz pozycję Tworzenie profilów>aprowizacji, kliknij + przycisk, wybierz identyfikator Apple ID, a następnie kliknij przycisk Kontynuuj.

  9. Kliknij pozycję Zaznacz wszystko, a następnie kliknij przycisk Kontynuuj.

  10. Kliknij ponownie pozycję Zaznacz wszystko , a następnie kliknij przycisk Kontynuuj.

  11. Wprowadź nazwę profilu przy użyciu sugestii nazewnictwa firmy Apple, a następnie kliknij przycisk Kontynuuj.

  12. Uruchom program Xcode.

  13. Z menu Xcode wybierz pozycję Preferencje...

  14. Wybierz pozycję Konta, a następnie kliknij przycisk Wyświetl szczegóły...

    Wybieranie kont

  15. Kliknij przycisk Pobierz wszystkie profile w lewym dolnym rogu:

    Pobierz wszystkie profile

  16. Upewnij się, że utworzony powyżej profil aprowizacji został zainstalowany w programie Xcode.

  17. Otwórz projekt, aby dodać obsługę SiriKit w Visual Studio dla komputerów Mac.

  18. Info.plist Kliknij dwukrotnie plik w Eksplorator rozwiązań.

  19. Upewnij się, że identyfikator pakietu jest zgodny z identyfikatorem utworzonym w portalu deweloperów firmy Apple powyżej:

    Identyfikator pakietu

  20. W Eksplorator rozwiązań wybierz projekt.

  21. Kliknij prawym przyciskiem myszy projekt i wybierz pozycję Opcje.

  22. Wybierz pozycję Podpisywanie pakietu dla systemu iOS, wybierz utworzony powyżej profil podpisywania tożsamości i aprowizacji:

    Wybierz profil podpisywania tożsamości i aprowizacji

  23. Kliknij przycisk OK, aby zapisać zmiany.

Ważne

Testowanie zestawu SiriKit działa tylko na rzeczywistym urządzeniu sprzętowym z systemem iOS 10, a nie w symulatorze systemu iOS 10. Jeśli masz problemy z instalowaniem aplikacji Xamarin.iOS z obsługą SiriKit na rzeczywistym sprzęcie, upewnij się, że wymagane uprawnienia, identyfikator aplikacji, identyfikator podpisywania i profil aprowizacji zostały prawidłowo skonfigurowane zarówno w portalu deweloperów firmy Apple, jak i Visual Studio dla komputerów Mac.

Żądanie autoryzacji Siri

Zanim aplikacja doda dowolne słownictwo specyficzne dla użytkownika lub rozszerzenia intencji połączy się z Siri, musi zażądać autoryzacji od użytkownika w celu uzyskania dostępu do Siri.

Edytuj plik aplikacji Info.plist , przejdź do widoku Źródło i dodaj NSSiriUsageDescription klucz z wartością ciągu opisującą sposób, w jaki aplikacja będzie używać Siri i jakie typy danych zostaną wysłane. Na przykład aplikacja MonkeyChat może powiedzieć"Kontakty MonkeyChat zostaną wysłane do Siri":

NSSiriUsageDescription w edytorze Info.plist

Wywołaj metodę RequestSiriAuthorization klasy po pierwszym uruchomieniu INPreferences aplikacji. Edytuj klasę AppDelegate.cs i utwórz metodę FinishedLaunching podobną do następującej:

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

Przy pierwszej wywołaniu tej metody zostanie wyświetlony alert z monitem użytkownika o zezwolenie aplikacji na dostęp do Siri. W tym alercie zostanie wyświetlony komunikat dodany przez dewelopera do powyższego NSSiriUsageDescription alertu. Jeśli użytkownik początkowo odmawia dostępu, może użyć aplikacji Ustawienia , aby udzielić dostępu do aplikacji.

W dowolnym momencie aplikacja może sprawdzić zdolność aplikacji do uzyskiwania dostępu do Siri, wywołując SiriAuthorizationStatus metodę INPreferences klasy .

Lokalizacja i Siri

Na urządzeniu z systemem iOS użytkownik może wybrać język Siri, który jest inny niż domyślny system. Podczas pracy z zlokalizowanymi danymi aplikacja musi użyć SiriLanguageCode metody INPreferences klasy , aby pobrać kod języka z Siri. Na przykład:

var language = INPreferences.SiriLanguageCode();

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

Dodawanie słownictwa specyficznego dla użytkownika

Słownictwo specyficzne dla użytkownika będzie zawierać wyrazy lub frazy unikatowe dla poszczególnych użytkowników aplikacji. Zostaną one udostępnione w czasie wykonywania z głównej aplikacji (a nie rozszerzeń aplikacji) jako uporządkowany zestaw terminów uporządkowany w najbardziej znaczącym priorytetzie użycia dla użytkowników, z najważniejszymi terminami na początku listy.

Słownictwo specyficzne dla użytkownika musi należeć do jednej z następujących kategorii:

  • Nazwy kontaktów (które nie są zarządzane przez platformę Kontakty).
  • Tagi zdjęć.
  • Nazwy albumów fotograficznych.
  • Nazwy treningów.

Podczas wybierania terminologii do zarejestrowania się jako słownictwa niestandardowego wybierz tylko terminy, które mogą być źle zrozumiałe dla kogoś, kto nie zna aplikacji. Nigdy nie rejestruj typowych terminów, takich jak "Mój trening" lub "Mój album". Na przykład aplikacja MonkeyChat zarejestruje pseudonimy skojarzone z każdym kontaktem w książce adresowej użytkownika.

Aplikacja udostępnia słownictwo specyficzne dla użytkownika, wywołując SetVocabularyStrings metodę INVocabulary klasy i przekazując NSOrderedSet kolekcję z głównej aplikacji. Aplikacja powinna zawsze najpierw wywołać metodę RemoveAllVocabularyStrings , aby usunąć wszystkie istniejące terminy przed dodaniem nowych. Na przykład:

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

Ten kod może być wywoływany w następujący sposób:

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

Ważne

Siri traktuje słownictwo niestandardowe jako wskazówki i będzie zawierać jak najwięcej terminologii, jak to możliwe. Jednak miejsce na słownictwo niestandardowe jest ograniczone, co sprawia, że ważne jest zarejestrowanie tylko terminologii, która może być myląca, w związku z czym łączna liczba zarejestrowanych terminów do minimum.

Aby uzyskać więcej informacji, zobacz nasze informacje dotyczące słownictwa specyficznego dla użytkownika i informacje o niestandardowym słownictwie firmy Apple.

Dodawanie słownictwa specyficznego dla aplikacji

Słownictwo specyficzne dla aplikacji definiuje określone słowa i frazy, które będą znane wszystkim użytkownikom aplikacji, takimi jak typy pojazdów lub nazwy treningów. Ponieważ są one częścią aplikacji, są one definiowane w pliku w AppIntentVocabulary.plist ramach głównego pakietu aplikacji. Ponadto te wyrazy i frazy powinny być zlokalizowane.

Terminy słownictwa specyficzne dla aplikacji muszą należeć do jednej z następujących kategorii:

  • Opcje przejazdu.
  • Nazwy treningów.

Plik słownictwa specyficznego dla aplikacji zawiera dwa klucze na poziomie głównym:

  • ParameterVocabulariesWymagane — definiuje niestandardowe terminy i parametry intencji aplikacji, do których mają zastosowanie.
  • IntentPhrasesOpcjonalne — zawiera przykładowe frazy używające terminów niestandardowych zdefiniowanych w elemencie ParameterVocabularies.

Każdy wpis w obiekcie ParameterVocabularies musi określać ciąg identyfikatora, termin i intencję, do którego ma zastosowanie termin. Ponadto pojedynczy termin może mieć zastosowanie do wielu intencji.

Aby uzyskać pełną listę dopuszczalnych wartości i wymaganą strukturę plików, zobacz Dokumentację formatu plików słownictwa aplikacji firmy Apple.

Aby dodać AppIntentVocabulary.plist plik do projektu aplikacji, wykonaj następujące czynności:

  1. Kliknij prawym przyciskiem myszy nazwę projektu w Eksplorator rozwiązań i wybierz polecenie Dodaj>nowy plik...>iOS:

    Dodawanie listy właściwości

  2. AppIntentVocabulary.plist Kliknij dwukrotnie plik w Eksplorator rozwiązań, aby otworzyć go do edycji.

  3. Kliknij przycisk , + aby dodać klucz, ustaw wartość Nazwa na ParameterVocabularies i typ na Array:

    Ustaw wartość Nazwa na ParametrVocabularies i typ na tablicę

  4. Rozwiń ParameterVocabularies i kliknij + przycisk i ustaw typ na Dictionary:

    Ustaw typ na słownik

  5. Kliknij przycisk , + aby dodać nowy klucz, ustaw wartość Nazwa na ParameterNames i typ na Array:

    Ustaw wartość Nazwa na Nazwa_parametru i typ na tablicę

  6. Kliknij przycisk , + aby dodać nowy klucz z typem String i wartością jako jedną z dostępnych nazw parametrów. Na przykład : INStartWorkoutIntent.workoutName

    Klucz INStartWorkoutIntent.workoutName

  7. ParameterVocabulary Dodaj klucz do ParameterVocabularies klucza z typem Array:

    Dodaj klucz ParameterVocabulary do klucza ParameterVocabularies z typem tablicy

  8. Dodaj nowy klucz z typem Dictionary:

    Dodaj nowy klucz z typem słownika w Visual Studio dla komputerów Mac.

  9. VocabularyItemIdentifier Dodaj klucz z typem String i określ unikatowy identyfikator terminu:

    Dodaj klucz VocabularyItemIdentifier z typem ciągu i określ unikatowy identyfikator

  10. VocabularyItemSynonyms Dodaj klucz z typem : Array

    Dodaj klucz VocabularyItemSynonyms z typem tablicy

  11. Dodaj nowy klucz z typem Dictionary:

    Dodaj kolejny nowy klucz z typem słownika w Visual Studio dla komputerów Mac.

  12. VocabularyItemPhrase Dodaj klucz z String typem i terminem definiowanym przez aplikację:

    Dodaj klucz VocabularyItemPhrase z typem ciągu i terminem definiowanym przez aplikację

  13. VocabularyItemPronunciation Dodaj klucz z typem String i fonetyczną wymową terminu:

    Dodaj klucz SłownictwoItemPronunciation z typem ciągu i wymową fonetyczną terminu

  14. VocabularyItemExamples Dodaj klucz z typem : Array

    Dodaj klucz VocabularyItemExamples z typem tablicy

  15. Dodaj kilka String kluczy z przykładowymi zastosowaniami terminu:

    Dodaj kilka kluczy ciągów z przykładowymi zastosowaniami terminu w Visual Studio dla komputerów Mac.

  16. Powtórz powyższe kroki dla innych terminów niestandardowych, które aplikacja musi zdefiniować.

  17. Zwiń ParameterVocabularies klucz.

  18. IntentPhrases Dodaj klucz z typem : Array

    Dodaj klucz IntentPhrases z typem tablicy

  19. Dodaj nowy klucz z typem Dictionary:

    Dodaj dodatkowy nowy klucz z typem słownika w Visual Studio dla komputerów Mac.

  20. IntentName Dodaj klucz z typem String i intencją dla przykładu:

    Dodaj klucz IntentName z typem ciągu i intencją dla przykładu

  21. IntentExamples Dodaj klucz z typem : Array

    Dodawanie klucza IntentExamples z typem tablicy

  22. Dodaj kilka String kluczy z przykładowymi zastosowaniami terminu:

    Dodaj kilka dodatkowych kluczy ciągów z przykładowymi zastosowaniami terminu w Visual Studio dla komputerów Mac.

  23. Powtórz powyższe kroki dla wszystkich intencji, dla których aplikacja musi podać przykładowe użycie.

Ważne

Urządzenie AppIntentVocabulary.plist zostanie zarejestrowane w programie Siri na urządzeniach testowych podczas opracowywania i może zająć trochę czasu, aby Siri zawierało słownictwo niestandardowe. W rezultacie tester będzie musiał poczekać kilka minut przed próbą przetestowania słownictwa specyficznego dla aplikacji po zaktualizowaniu.

Aby uzyskać więcej informacji, zobacz dokumentację dotyczącą słownictwa specyficznego dla aplikacji i dokumentację dotyczącą niestandardowego słownictwa firmy Apple.

Dodawanie rozszerzenia intents

Teraz, gdy aplikacja została przygotowana do wdrożenia SiriKit, deweloper będzie musiał dodać jedno (lub więcej) rozszerzeń intencji do rozwiązania w celu obsługi intencji wymaganych do integracji Siri.

Dla każdego wymaganego rozszerzenia intents wykonaj następujące czynności:

  • Dodaj projekt Intents Extension do rozwiązania aplikacji platformy Xamarin.iOS.
  • Skonfiguruj plik rozszerzenia Info.plist Intents.
  • Zmodyfikuj klasę główną rozszerzenia Intents.

Aby uzyskać więcej informacji, zobacz dokumentację rozszerzenia Intents i dokumentację dotyczącą tworzenia rozszerzeń intencji firmy Apple.

Tworzenie rozszerzenia

Aby dodać rozszerzenie Intents do rozwiązania, wykonaj następujące czynności:

  1. Kliknij prawym przyciskiem myszy nazwę rozwiązania w okienku rozwiązania i wybierz polecenie Dodaj>nowy projekt....

  2. W oknie dialogowym wybierz pozycję Rozszerzenie intencji rozszerzeń systemu>iOS>, a następnie kliknij przycisk Dalej:

    Wybieranie rozszerzenia intencji

  3. Następnie wprowadź nazwę rozszerzenia intencji i kliknij przycisk Dalej :

    Wprowadź nazwę rozszerzenia intencji.

  4. Na koniec kliknij przycisk Utwórz , aby dodać rozszerzenie intencji do rozwiązania aplikacji:

    Dodaj rozszerzenie Intent do rozwiązania aplikacji.

  5. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy folder Odwołania nowo utworzonego rozszerzenia intencji. Sprawdź nazwę wspólnego projektu biblioteki kodu udostępnionego (utworzonej powyżej aplikacji) i kliknij przycisk OK :

    Wybierz nazwę wspólnego projektu biblioteki kodu udostępnionego.

Powtórz te kroki dla liczby rozszerzeń intencji (w oparciu o architekturę aplikacji dla rozszerzeń powyżej), które będą wymagane przez aplikację.

Konfigurowanie pliku Info.plist

Dla każdego rozszerzenia intents, które zostały dodane do rozwiązania aplikacji, należy skonfigurować w Info.plist plikach do pracy z aplikacją.

Podobnie jak w przypadku każdego typowego rozszerzenia aplikacji aplikacja będzie mieć istniejące klucze NSExtension i NSExtensionAttributes. W przypadku rozszerzenia intents istnieją dwa nowe atrybuty, które należy skonfigurować:

Dwa nowe atrybuty, które należy skonfigurować

  • IntentsSupported — jest wymagany i składa się z tablicy nazw klas intencji, które aplikacja chce obsługiwać z rozszerzenia intencji.
  • IntentsRestrictedWhileLocked — jest opcjonalnym kluczem dla aplikacji w celu określenia zachowania ekranu blokady rozszerzenia. Składa się z tablicy nazw klas intencji, które aplikacja chce wymagać od użytkownika zalogowania się w celu użycia z rozszerzenia intencji.

Aby skonfigurować plik rozszerzenia Info.plist intencji, kliknij go dwukrotnie w Eksplorator rozwiązań, aby otworzyć go do edycji. Następnie przejdź do widoku Źródło , a następnie rozwiń NSExtension i NSExtensionAttributes w edytorze:

IntentsSupported Rozwiń klucz i dodaj nazwę dowolnej klasy Intent, która będzie obsługiwać to rozszerzenie. Przykładowa aplikacja MonkeyChat obsługuje następujące elementy:INSendMessageIntent

Jeśli aplikacja opcjonalnie wymaga zalogowania użytkownika na urządzeniu w celu użycia danej intencji, rozwiń IntentRestrictedWhileLocked klucz i dodaj nazwy klas intencji z ograniczonym dostępem. W przypadku przykładowej aplikacji MonkeyChat użytkownik musi być zalogowany, aby wysłać wiadomość czatu, aby dodać polecenie INSendMessageIntent:

Aby uzyskać pełną listę dostępnych domen intencji, zobacz Dokumentacja domen intencji firmy Apple.

Konfigurowanie klasy głównej

Następnie deweloper będzie musiał skonfigurować klasę główną, która działa jako główny punkt wejścia rozszerzenia intent do Siri. Musi być podklasą INExtension zgodną z pełnomocnikiem IINIntentHandler . Na przykład:

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

Istnieje jedna samotna metoda, którą aplikacja musi zaimplementować w głównej klasie Rozszerzenia intencji.GetHandler Ta metoda jest przekazywana intencji przez SiriKit, a aplikacja musi zwrócić program obsługi intencji zgodny z typem danej intencji.

Ponieważ przykładowa aplikacja MonkeyChat obsługuje tylko jedną intencję, zwraca się ona w metodzie GetHandler . Jeśli rozszerzenie obsłużyło więcej niż jedną intencję, deweloper doda klasę dla każdego typu intencji i zwróci wystąpienie w tym miejscu na podstawie przekazanego Intent do metody .

Obsługa etapu rozwiązywania

Etap rozpoznawania to miejsce, w którym rozszerzenie intencji wyjaśni i zweryfikuje parametry przekazywane z programu Siri i zostały ustawione za pośrednictwem konwersacji użytkownika.

Dla każdego parametru wysyłanego Resolve z Siri istnieje metoda. Aplikacja będzie musiała zaimplementować tę metodę dla każdego parametru, który aplikacja może potrzebować pomocy Siri, aby uzyskać poprawną odpowiedź od użytkownika.

W przypadku przykładowej aplikacji MonkeyChat rozszerzenie intencji będzie wymagać co najmniej jednego adresata do wysłania wiadomości. Dla każdego adresata na liście rozszerzenie musi wykonać wyszukiwanie kontaktów, które może mieć następujący wynik:

  • Znaleziono dokładnie jeden pasujący kontakt.
  • Znaleziono co najmniej dwa zgodne kontakty.
  • Nie znaleziono pasujących kontaktów.

Ponadto monkeyChat wymaga zawartości treści wiadomości. Jeśli użytkownik tego nie podał, Siri musi monitować użytkownika o zawartość.

Rozszerzenie intencji będzie musiało bezpiecznie obsługiwać każdy z tych przypadków.

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

Aby uzyskać więcej informacji, zobacz dokumentację dotyczącą rozwiązywania etapów oraz dokumentację rozpoznawania i obsługi intencji firmy Apple.

Obsługa etapu potwierdzania

Etap potwierdzania to miejsce, w którym rozszerzenie intencji sprawdza, czy zawiera wszystkie informacje w celu spełnienia żądania użytkownika. Aplikacja chce wysłać potwierdzenie wraz ze wszystkimi szczegółami pomocniczymi tego, co ma się zdarzyć siri, aby można było potwierdzić użytkownikowi, że jest to zamierzone działanie.

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

Aby uzyskać więcej informacji, zobacz dokumentację potwierdzania etapu.

Przetwarzanie intencji

Jest to punkt, w którym rozszerzenie intent rzeczywiście wykonuje zadanie, aby spełnić żądanie użytkownika i przekazać wyniki z powrotem do Siri, aby umożliwić użytkownikowi informowanie.

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

Aby uzyskać więcej informacji, zobacz dokumentację dotyczącą etapu obsługi.

Dodawanie rozszerzenia interfejsu użytkownika intencji

Opcjonalne rozszerzenie interfejsu użytkownika Intents udostępnia możliwość przełączenia interfejsu użytkownika i znakowania aplikacji do środowiska Siri i sprawić, że użytkownicy będą czuli się połączeni z aplikacją. Dzięki temu rozszerzeniu aplikacja może przenieść markę, a także wizualizację i inne informacje do transkrypcji.

Przykładowe dane wyjściowe rozszerzenia interfejsu użytkownika intents

Podobnie jak rozszerzenie Intents, deweloper wykona następujący krok dla rozszerzenia interfejsu użytkownika Intents:

  • Dodaj projekt rozszerzenia interfejsu użytkownika Intents do rozwiązania aplikacji platformy Xamarin.iOS.
  • Skonfiguruj plik rozszerzenia Info.plist interfejsu użytkownika intents.
  • Zmodyfikuj główną klasę rozszerzenia interfejsu użytkownika intents.

Aby uzyskać więcej informacji, zobacz dokumentację rozszerzenia interfejsu użytkownika intencji i dokumentację interfejsu niestandardowego firmy Apple.

Tworzenie rozszerzenia

Aby dodać rozszerzenie interfejsu użytkownika intents do rozwiązania, wykonaj następujące czynności:

  1. Kliknij prawym przyciskiem myszy nazwę rozwiązania w okienku rozwiązania i wybierz polecenie Dodaj>nowy projekt....

  2. W oknie dialogowym wybierz pozycję Rozszerzenie interfejsu użytkownika intencji rozszerzeń systemu>iOS>, a następnie kliknij przycisk Dalej:

    Wybieranie rozszerzenia interfejsu użytkownika intencji

  3. Następnie wprowadź nazwę rozszerzenia intencji i kliknij przycisk Dalej :

    Wprowadź nazwę rozszerzenia intencji w Visual Studio dla komputerów Mac.

  4. Na koniec kliknij przycisk Utwórz , aby dodać rozszerzenie intencji do rozwiązania aplikacji:

    Dodaj rozszerzenie intent do rozwiązania aplikacji w Visual Studio dla komputerów Mac.

  5. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy folder Odwołania nowo utworzonego rozszerzenia intencji. Sprawdź nazwę wspólnego projektu biblioteki kodu udostępnionego (utworzonej powyżej aplikacji) i kliknij przycisk OK :

    Wybierz nazwę wspólnego projektu biblioteki kodu udostępnionego w Visual Studio dla komputerów Mac.

Konfigurowanie pliku Info.plist

Skonfiguruj plik rozszerzenia Info.plist interfejsu użytkownika intents do pracy z aplikacją.

Podobnie jak w przypadku każdego typowego rozszerzenia aplikacji aplikacja będzie mieć istniejące klucze NSExtension i NSExtensionAttributes. W przypadku rozszerzenia intents istnieje jeden nowy atrybut, który należy skonfigurować:

Jeden nowy atrybut, który należy skonfigurować

IntencjeSupported są wymagane i składa się z tablicy nazw klas intencji, które aplikacja chce obsługiwać z rozszerzenia intencji.

Aby skonfigurować plik rozszerzenia Info.plist interfejsu użytkownika intencji, kliknij go dwukrotnie w Eksplorator rozwiązań, aby otworzyć go do edycji. Następnie przejdź do widoku Źródło , a następnie rozwiń NSExtension i NSExtensionAttributes w edytorze:

Klucze NSExtension i NSExtensionAttributes w edytorze.

IntentsSupported Rozwiń klucz i dodaj nazwę dowolnej klasy Intent, która będzie obsługiwać to rozszerzenie. Przykładowa aplikacja MonkeyChat obsługuje następujące elementy:INSendMessageIntent

Aby uzyskać pełną listę dostępnych domen intencji, zobacz Dokumentacja domen intencji firmy Apple.

Konfigurowanie klasy głównej

Skonfiguruj klasę główną, która działa jako główny punkt wejścia rozszerzenia interfejsu użytkownika intencji w Siri. Musi być podklasą UIViewController zgodną z interfejsem IINUIHostedViewController . Na przykład:

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 przekaże INInteraction wystąpienie klasy do Configure metody UIViewController wystąpienia wewnątrz rozszerzenia interfejsu użytkownika intencji.

Obiekt INInteraction udostępnia trzy kluczowe informacje do rozszerzenia:

  1. Przetwarzany obiekt Intent.
  2. Obiekt Intent Response z Confirm metod i Handle rozszerzenia intent.
  3. Stan interakcji, który definiuje stan interakcji między aplikacją a Siri.

UIViewController Wystąpienie jest podstawową klasą interakcji z programem Siri i ponieważ dziedziczy z UIViewControllerklasy , ma dostęp do wszystkich funkcji zestawu UIKit.

Gdy Siri wywołuje metodę Configure UIViewController , którą przekazuje w kontekście widoku z informacją, że kontroler widoku będzie hostowany w karty Siri Snippit lub Maps.

Siri przekaże również procedurę obsługi uzupełniania, którą aplikacja musi zwrócić żądany rozmiar widoku po zakończeniu jego konfigurowania.

Projektowanie interfejsu użytkownika w projektancie systemu iOS

Układ interfejsu użytkownika rozszerzenia Intents UI w projektancie systemu iOS. Kliknij dwukrotnie plik rozszerzenia MainInterface.storyboard w Eksplorator rozwiązań, aby otworzyć go do edycji. Przeciągnij we wszystkich wymaganych elementach interfejsu użytkownika, aby skompilować interfejs użytkownika i zapisać zmiany.

Ważne

Chociaż istnieje możliwość dodania elementów interakcyjnych, takich jak UIButtons lub UITextFields do rozszerzenia UIViewControllerinterfejsu użytkownika intencji, są one ściśle zabronione, ponieważ interfejs użytkownika intencji w interfejsie użytkownika nieinterakcyjnym i użytkownik nie będzie mógł z nimi korzystać.

Podłącz interfejs użytkownika

Za pomocą interfejsu użytkownika rozszerzenia Intents UI utworzonego w projektancie systemu iOS edytuj podklasę UIViewController i przesłoń metodę Configure w następujący sposób:

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

Zastępowanie domyślnego interfejsu użytkownika Siri

Rozszerzenie interfejsu użytkownika intencji będzie zawsze wyświetlane wraz z inną zawartością Siri, taką jak ikona aplikacji i nazwa w górnej części interfejsu użytkownika lub, na podstawie intencji, przyciski (takie jak Wyślij lub Anuluj) mogą być wyświetlane u dołu.

Istnieje kilka wystąpień, w których aplikacja może zastąpić informacje wyświetlane użytkownikowi przez Siri domyślnie, takie jak komunikaty lub mapy, w których aplikacja może zastąpić domyślne środowisko jednym dostosowanym do aplikacji.

Jeśli rozszerzenie interfejsu użytkownika intents musi zastąpić elementy domyślnego interfejsu użytkownika Siri, podklasa UIViewController będzie musiała zaimplementować IINUIHostedViewSiriProviding interfejs i wyrazić zgodę na wyświetlanie określonego elementu interfejsu.

Dodaj następujący kod do UIViewController podklasy, aby poinformować Siri, że rozszerzenie interfejsu użytkownika intencji wyświetla już zawartość komunikatu:

public bool DisplaysMessage {
    get {return true;}
}

Kwestie wymagające rozważenia

Firma Apple sugeruje, że deweloper bierze pod uwagę następujące kwestie podczas projektowania i implementowania rozszerzeń interfejsu użytkownika intencji:

  • Bądź świadomy użycia pamięci — ponieważ rozszerzenia interfejsu użytkownika intencji są tymczasowe i wyświetlane tylko przez krótki czas, system nakłada ostrzejsze ograniczenia pamięci niż są używane z pełną aplikacją.
  • Rozważ minimalne i maksymalne rozmiary widoku — upewnij się, że rozszerzenia interfejsu użytkownika intencji wyglądają dobrze na każdym typie, rozmiarze i orientacji urządzenia z systemem iOS. Ponadto żądany rozmiar, który aplikacja wysyła z powrotem do Siri, może nie być w stanie udzielić.
  • Użyj elastycznych i adaptacyjnych wzorców układu — ponownie, aby upewnić się, że interfejs użytkownika wygląda świetnie na każdym urządzeniu.

Podsumowanie

W tym artykule omówiono bibliotekę SiriKit i pokazano, jak można ją dodać do aplikacji platformy Xamarin.iOS w celu dostarczania usług, które są dostępne dla użytkownika przy użyciu Siri i aplikacji Maps na urządzeniu z systemem iOS.