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:
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:
Są to:
- 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.
- 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.
- 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:
Uruchom Visual Studio dla komputerów Mac i otwórz aplikację MonkeyChat.
Kliknij prawym przyciskiem myszy nazwę rozwiązania w okienku rozwiązania i wybierz polecenie Dodaj>nowy projekt...:
Wybierz pozycję Biblioteka klas biblioteki systemu>iOS>i kliknij przycisk Dalej:
Wprowadź
MonkeyChatCommon
nazwę i kliknij przycisk Utwórz: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:
W Eksplorator rozwiązań przeciągnij wspólny kod udostępniony z głównej aplikacji do biblioteki natywnej.
W przypadku aplikacji MonkeyChat przeciągnij foldery DataModels i Processors z głównej aplikacji do biblioteki natywnej:
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:
Entitlements.plist
Kliknij dwukrotnie plik w Eksplorator rozwiązań, aby otworzyć go do edycji.Przejdź do karty Źródło.
com.apple.developer.siri
Dodaj właściwość , ustaw wartość Type naBoolean
i wartość naYes
:Zapisz zmiany w pliku.
Kliknij dwukrotnie plik projektu w Eksplorator rozwiązań, aby otworzyć go do edycji.
Wybierz pozycję Podpisywanie pakietu systemu iOS i upewnij się, że
Entitlements.plist
plik został wybrany w polu Uprawnienia niestandardowe: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:
W przeglądarce internetowej przejdź do https://developer.apple.com swojego konta i zaloguj się do niej.
Kliknij pozycję Certyfikaty, identyfikatory i profile.
Wybierz pozycję Profile aprowizacji i wybierz pozycję Identyfikatory aplikacji, a następnie kliknij + przycisk.
Wprowadź nazwę nowego profilu.
Wprowadź identyfikator pakietu zgodnie z zaleceniem nazewnictwa firmy Apple.
Przewiń w dół do sekcji App Services , wybierz pozycję SiriKit i kliknij przycisk Kontynuuj :
Sprawdź wszystkie ustawienia, a następnie prześlij identyfikator aplikacji.
Wybierz pozycję Tworzenie profilów>aprowizacji, kliknij + przycisk, wybierz identyfikator Apple ID, a następnie kliknij przycisk Kontynuuj.
Kliknij pozycję Zaznacz wszystko, a następnie kliknij przycisk Kontynuuj.
Kliknij ponownie pozycję Zaznacz wszystko , a następnie kliknij przycisk Kontynuuj.
Wprowadź nazwę profilu przy użyciu sugestii nazewnictwa firmy Apple, a następnie kliknij przycisk Kontynuuj.
Uruchom program Xcode.
Z menu Xcode wybierz pozycję Preferencje...
Wybierz pozycję Konta, a następnie kliknij przycisk Wyświetl szczegóły...
Kliknij przycisk Pobierz wszystkie profile w lewym dolnym rogu:
Upewnij się, że utworzony powyżej profil aprowizacji został zainstalowany w programie Xcode.
Otwórz projekt, aby dodać obsługę SiriKit w Visual Studio dla komputerów Mac.
Info.plist
Kliknij dwukrotnie plik w Eksplorator rozwiązań.Upewnij się, że identyfikator pakietu jest zgodny z identyfikatorem utworzonym w portalu deweloperów firmy Apple powyżej:
W Eksplorator rozwiązań wybierz projekt.
Kliknij prawym przyciskiem myszy projekt i wybierz pozycję Opcje.
Wybierz pozycję Podpisywanie pakietu dla systemu iOS, wybierz utworzony powyżej profil podpisywania tożsamości i aprowizacji:
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":
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:
ParameterVocabularies
Wymagane — definiuje niestandardowe terminy i parametry intencji aplikacji, do których mają zastosowanie.IntentPhrases
Opcjonalne — zawiera przykładowe frazy używające terminów niestandardowych zdefiniowanych w elemencieParameterVocabularies
.
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:
Kliknij prawym przyciskiem myszy nazwę projektu w Eksplorator rozwiązań i wybierz polecenie Dodaj>nowy plik...>iOS:
AppIntentVocabulary.plist
Kliknij dwukrotnie plik w Eksplorator rozwiązań, aby otworzyć go do edycji.Kliknij przycisk , + aby dodać klucz, ustaw wartość Nazwa na
ParameterVocabularies
i typ naArray
:Rozwiń
ParameterVocabularies
i kliknij + przycisk i ustaw typ naDictionary
:Kliknij przycisk , + aby dodać nowy klucz, ustaw wartość Nazwa na
ParameterNames
i typ naArray
: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
ParameterVocabulary
Dodaj klucz doParameterVocabularies
klucza z typemArray
:Dodaj nowy klucz z typem
Dictionary
:VocabularyItemIdentifier
Dodaj klucz z typemString
i określ unikatowy identyfikator terminu:VocabularyItemSynonyms
Dodaj klucz z typem :Array
Dodaj nowy klucz z typem
Dictionary
:VocabularyItemPhrase
Dodaj klucz zString
typem i terminem definiowanym przez aplikację:VocabularyItemPronunciation
Dodaj klucz z typemString
i fonetyczną wymową terminu:VocabularyItemExamples
Dodaj klucz z typem :Array
Dodaj kilka
String
kluczy z przykładowymi zastosowaniami terminu:Powtórz powyższe kroki dla innych terminów niestandardowych, które aplikacja musi zdefiniować.
Zwiń
ParameterVocabularies
klucz.IntentPhrases
Dodaj klucz z typem :Array
Dodaj nowy klucz z typem
Dictionary
:IntentName
Dodaj klucz z typemString
i intencją dla przykładu:IntentExamples
Dodaj klucz z typem :Array
Dodaj kilka
String
kluczy z przykładowymi zastosowaniami terminu: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:
Kliknij prawym przyciskiem myszy nazwę rozwiązania w okienku rozwiązania i wybierz polecenie Dodaj>nowy projekt....
W oknie dialogowym wybierz pozycję Rozszerzenie intencji rozszerzeń systemu>iOS>, a następnie kliknij przycisk Dalej:
Następnie wprowadź nazwę rozszerzenia intencji i kliknij przycisk Dalej :
Na koniec kliknij przycisk Utwórz , aby dodać rozszerzenie intencji do rozwiązania aplikacji:
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 :
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ć:
- 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.
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:
Kliknij prawym przyciskiem myszy nazwę rozwiązania w okienku rozwiązania i wybierz polecenie Dodaj>nowy projekt....
W oknie dialogowym wybierz pozycję Rozszerzenie interfejsu użytkownika intencji rozszerzeń systemu>iOS>, a następnie kliknij przycisk Dalej:
Następnie wprowadź nazwę rozszerzenia intencji i kliknij przycisk Dalej :
Na koniec kliknij przycisk Utwórz , aby dodać rozszerzenie intencji do rozwiązania aplikacji:
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 :
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ć:
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:
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:
- Przetwarzany obiekt Intent.
- Obiekt Intent Response z
Confirm
metod iHandle
rozszerzenia intent. - 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 UIViewController
klasy , 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 UIViewController
interfejsu 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.