Sdílet prostřednictvím


Implementace SiriKitu v Xamarin.iOS

Tento článek popisuje kroky potřebné k implementaci podpory SiriKitu v aplikacích Xamarin.iOS.

SiriKit pro iOS 10 nově umožňuje aplikaci Xamarin.iOS poskytovat služby, které jsou přístupné pro uživatele pomocí Siri a aplikace Mapy na zařízení s iOSem. Tento článek popisuje kroky potřebné k implementaci podpory SiriKitu v aplikacích Xamarin.iOS přidáním požadovaných rozšíření záměrů, rozšíření uživatelského rozhraní Intents a Slovník.

Siri spolupracuje s konceptem Domén, skupinami znaných akcí pro související úkoly. Každá interakce, kterou má aplikace se Siri, musí spadat do jedné ze známých domén služeb následujícím způsobem:

  • Hlasové hovory nebo videohovory.
  • Rezervace jízdy.
  • Vedení cvičení.
  • Zasílání zpráv.
  • Hledání fotek.
  • Odesílání nebo příjem plateb.

Když uživatel odešle žádost o Siri zahrnující jednu ze služeb rozšíření aplikace, SiriKit odešle rozšíření objekt záměru, který popisuje žádost uživatele spolu se všemi podpůrnými daty. Rozšíření aplikace pak vygeneruje příslušný objekt Response pro daný záměr a podrobně popisuje, jak rozšíření dokáže zpracovat požadavek.

Tato příručka představuje rychlý příklad zahrnutí podpory SiriKitu do existující aplikace. Pro účely tohoto příkladu budeme používat falešnou aplikaci MonkeyChat:

Ikona MonkeyChat

MonkeyChat uchovává svou vlastní kontaktní knihu přátel uživatele, každý přidružený k názvu obrazovky (například Bobo) a umožňuje uživateli posílat textové chaty každému příteli podle názvu obrazovky.

Rozšíření aplikace pomocí SiriKitu

Jak je znázorněno v průvodci principy SiriKitu , existují tři hlavní části, které se týkají rozšíření aplikace pomocí SiriKitu:

Rozšíření aplikace pomocí diagramu SiriKit

Tady jsou některé z nich:

  1. Intents Extension – Ověřuje odpovědi uživatelů, potvrzuje, že aplikace může žádost zpracovat a skutečně provede úlohu, která splní požadavek uživatele.
  2. Záměry rozšíření - uživatelského rozhraní Volitelné, poskytuje vlastní uživatelské rozhraní pro odpovědi v prostředí Siri a může přinést uživatelské rozhraní aplikací a branding do Siri, aby se prostředí uživatele obohatilo.
  3. Aplikace – poskytuje aplikaci slovníky specifické pro uživatele, které siri pomáhají při práci s ní.

Všechny tyto prvky a kroky k jejich zahrnutí do aplikace budou podrobně popsány v následujících částech.

Příprava aplikace

SiriKit je ale před přidáním rozšíření do aplikace postaven na rozšířeních, existuje několik věcí, které vývojář musí udělat, aby pomohl s přijetím SiriKitu.

Přesun společného sdíleného kódu

Nejprve může vývojář přesunout některý z běžných kódů, které se budou sdílet mezi aplikací a rozšířeními, do sdílených projektů, přenosných knihoven tříd (PCLS) nebo nativních knihoven.

Rozšíření musí být schopná provádět všechny akce, které aplikace dělá. Z hlediska ukázkové aplikace MonkeyChat, například hledání kontaktů, přidávání nových kontaktů, odesílání zpráv a načítání historie zpráv.

Když tento společný kód přesunete do sdíleného projektu, knihovny PCL nebo nativní knihovny, usnadníte si údržbu tohoto kódu na jednom společném místě a zajistíte, aby rozšíření a nadřazená aplikace poskytovaly uživatelům jednotné prostředí a funkce.

V případě ukázkové aplikace MonkeyChat se datové modely a kód pro zpracování, jako je síť a přístup k databázi, přesunou do nativní knihovny.

Postupujte následovně:

  1. Spusťte Visual Studio pro Mac a otevřete aplikaci MonkeyChat.

  2. Klikněte pravým tlačítkem na název řešení v oblasti řešení a vyberte Přidat>nový projekt...:

    Přidání nového projektu

  3. Vyberte knihovnu tříd knihovny>pro iOS>a klikněte na tlačítko Další:

    Vybrat knihovnu tříd

  4. Zadejte MonkeyChatCommon název a klikněte na tlačítko Vytvořit:

    Jako název zadejte MonkeyChatCommon.

  5. Klikněte pravým tlačítkem myši na složku Reference hlavní aplikace v Průzkumník řešení a vyberte Upravit odkazy.... Zkontrolujte projekt MonkeyChatCommon a klikněte na tlačítko OK:

    Kontrola projektu MonkeyChatCommon

  6. V Průzkumník řešení přetáhněte společný sdílený kód z hlavní aplikace do nativní knihovny.

  7. V případě MonkeyChat přetáhněte složky DataModels a Processors z hlavní aplikace do nativní knihovny:

    Složky DataModels a Processors v Průzkumník řešení

Upravte všechny soubory přesunuté do nativní knihovny a změňte obor názvů tak, aby odpovídal názvů knihovně. Například změna 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 ()
        {
        }
        ...
    }
}

Pak se vraťte do hlavní aplikace a přidejte using příkaz pro obor názvů nativní knihovny kdekoli, kde aplikace používá jednu z přesunutých tříd:

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

Návrh aplikace pro rozšíření

Aplikace se obvykle zaregistruje do několika záměrů a vývojář musí zajistit, aby byla aplikace navržená pro odpovídající počet rozšíření záměrů.

V situaci, kdy aplikace vyžaduje více než jeden záměr, má vývojář možnost umístit veškeré zpracování záměru do jednoho rozšíření záměru nebo vytvořit samostatné rozšíření záměru pro každý záměr.

Pokud se rozhodnete vytvořit samostatné rozšíření záměru pro každý záměr, vývojář může skončit duplikováním velkého množství často používaného kódu v jednotlivých rozšířeních a vytvořit velké množství režijních nákladů na procesor a paměť.

Chcete-li si vybrat mezi těmito dvěma možnostmi, podívejte se, jestli některý z záměrů přirozeně patří dohromady. Aplikace, která provedla hlasové hovory a videohovory, může například chtít zahrnout oba tyto záměry do jednoho rozšíření záměru, protože zpracovávají podobné úlohy a můžou poskytovat nejvíce opakovaného použití kódu.

Pro jakýkoli záměr nebo skupinu záměrů, které se nevejdou do existující skupiny, vytvořte v řešení aplikace nové rozšíření záměru, které je bude obsahovat.

Nastavení požadovaných nároků

Každá aplikace Xamarin.iOS, která zahrnuje integraci SiriKitu, musí mít nastavená správná oprávnění. Pokud vývojář tyto požadované nároky nenastaví správně, nebude moct aplikaci nainstalovat ani otestovat na skutečném hardwaru iOS 10 (nebo novějším), což je také požadavek, protože simulátor iOS 10 nepodporuje SiriKit.

Postupujte následovně:

  1. Poklikáním na Entitlements.plist soubor v Průzkumník řešení ho otevřete pro úpravy.

  2. Přepněte na kartu Zdroj.

  3. com.apple.developer.siri Přidejte vlastnost, nastavte typ na Boolean hodnotu a hodnotu naYes:

    Přidání vlastnosti com.apple.developer.siri

  4. Uložte změny souboru.

  5. Poklikáním na soubor projektu v Průzkumník řešení ho otevřete pro úpravy.

  6. Vyberte podepisování balíčků iOS a ujistěte se, že Entitlements.plist je soubor vybraný v poli Vlastní nároky :

    V poli Vlastní nároky vyberte soubor Entitlements.plist.

  7. Kliknutím na tlačítko OK uložte změny.

Po dokončení by soubor aplikace Entitlements.plist měl vypadat takto (v otevřeném externím editoru):

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

Správné zřizování aplikace

Vzhledem k přísnému zabezpečení, které Apple umístil kolem architektury SiriKit, musí mít každá aplikace Xamarin.iOS, která implementuje SiriKit, správné ID a nároky aplikace (viz část výše) a musí být podepsána správným zřizovacím profilem.

Na Macu udělejte toto:

  1. Ve webovém prohlížeči přejděte na https://developer.apple.com svůj účet a přihlaste se k ho.

  2. Klikněte na Certifikáty, identifikátory a profily.

  3. Vyberte Zřizovací profily a vyberte ID aplikací a klikněte na + tlačítko.

  4. Zadejte název nového profilu.

  5. Zadejte ID sady podle doporučení společnosti Apple k pojmenování.

  6. Přejděte dolů do části App Services , vyberte SiriKit a klikněte na tlačítko Pokračovat :

    Výběr SiriKitu

  7. Ověřte všechna nastavení a pak odešlete ID aplikace.

  8. Vyberte Vývoj zřizovacích profilů>, klikněte na + tlačítko, vyberte Apple ID a pak klikněte na Pokračovat.

  9. Klikněte na Vybrat vše a potom klikněte na Pokračovat.

  10. Znovu klikněte na Vybrat vše a potom klikněte na Pokračovat.

  11. Zadejte název profilu pomocí návrhů pojmenování společnosti Apple a potom klikněte na Pokračovat.

  12. Spusťte Xcode.

  13. V nabídce Xcode vyberte Předvolby...

  14. Vyberte Účty a potom klikněte na tlačítko Zobrazit podrobnosti...

    Vybrat účty

  15. Klikněte na tlačítko Stáhnout všechny profily v levém dolním rohu:

    Stáhnout všechny profily

  16. Ujistěte se, že je ve Xcode nainstalovaný profil zřizování, který jste vytvořili výše.

  17. Otevřete projekt a přidejte podporu SiriKitu do Visual Studio pro Mac.

  18. Poklikejte na Info.plist soubor v Průzkumník řešení.

  19. Ujistěte se, že identifikátor sady odpovídá identifikátoru vytvořenému na portálu pro vývojáře Společnosti Apple výše:

    Identifikátor sady

  20. V Průzkumník řešení vyberte projekt.

  21. Klikněte pravým tlačítkem myši na projekt a vyberte Možnosti.

  22. Vyberte podepisování balíčků pro iOS, vyberte profil podpisové identity a zřizovací profil vytvořený výše:

    Výběr podpisové identity a zřizovacího profilu

  23. Kliknutím na tlačítko OK uložte změny.

Důležité

Testování SiriKitu funguje jenom na skutečném hardwarovém zařízení s iOSem 10 a ne v simulátoru iOS 10. Pokud máte problémy s instalací aplikace Xamarin.iOS s podporou SiriKitu na skutečný hardware, ujistěte se, že jsou na portálu pro vývojáře Apple i na Visual Studio pro Mac správně nakonfigurované požadované nároky, ID aplikace, podpisový identifikátor a zřizovací profil.

Žádost o autorizaci Siri

Než aplikace přidá slovník specifický pro uživatele nebo rozšíření záměrů se připojí k Siri, musí požádat uživatele o autorizaci pro přístup k Siri.

Upravte soubor aplikace Info.plist , přepněte do zobrazení Zdroj a přidejte NSSiriUsageDescription klíč s řetězcovou hodnotou popisující, jak bude aplikace používat Siri a jaké typy dat se odešlou. Například aplikace MonkeyChat může říct"MonkeyChat contacts will be sent to Siri":

NSSiriUsageDescription v editoru Info.plist

RequestSiriAuthorization Při prvním spuštění aplikace zavolejte metodu INPreferences třídy. AppDelegate.cs Upravte třídu a nastavte metodu FinishedLaunching tak, aby vypadala takto:

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

Při prvním zavolání této metody se zobrazí upozornění s výzvou, aby aplikaci povolil přístup k Siri. V této výstraze se zobrazí zpráva, že vývojář přidaný do NSSiriUsageDescription výše uvedeného upozornění. Pokud uživatel původně odepře přístup, může k udělení přístupu k aplikaci použít aplikaci Nastavení .

Kdykoli může aplikace zkontrolovat schopnost aplikace přistupovat ke Siri zavoláním SiriAuthorizationStatus metody INPreferences třídy.

Lokalizace a Siri

Na zařízení s iOSem může uživatel vybrat jazyk pro Siri, který se liší od výchozího systému. Při práci s lokalizovanými daty bude aplikace muset použít SiriLanguageCode metodu INPreferences třídy k získání kódu jazyka ze Siri. Příklad:

var language = INPreferences.SiriLanguageCode();

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

Přidání slovníku specifického pro uživatele

Slovník specifický pro uživatele bude poskytovat slova nebo fráze, které jsou jedinečné pro jednotlivé uživatele aplikace. Ty budou poskytovány za běhu z hlavní aplikace (nikoli rozšíření aplikací) jako seřazená sada termínů seřazená v nejvýznamnější prioritě využití pro uživatele s nejdůležitějšími termíny na začátku seznamu.

Slovník specifický pro uživatele musí patřit do jedné z následujících kategorií:

  • Jména kontaktů (která nejsou spravována architekturou Kontakty).
  • Značky fotek.
  • Názvy fotoalbum.
  • Názvy cvičení.

Při výběru terminologie, která se má zaregistrovat jako vlastní slovník, zvolte jenom termíny, které by někdo nepochopil, když aplikaci nezná. Nikdy nezaregistrujte běžné termíny, jako je "Moje cvičení" nebo "Moje album". Aplikace MonkeyChat například zaregistruje přezdívky přidružené ke každému kontaktu v adresáři uživatele.

Aplikace poskytuje slovník specifický pro uživatele voláním SetVocabularyStrings metody INVocabulary třídy a předáním NSOrderedSet kolekce z hlavní aplikace. Aplikace by měla nejprve volat metodu RemoveAllVocabularyStrings , aby před přidáním nových termínů odebrala všechny existující termíny. Příklad:

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

S tímto kódem se může volat takto:

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

Důležité

Siri považuje vlastní slovní zásobu za rady a bude co nejvíce začlenit terminologii. Prostor pro vlastní slovní zásobu je ale omezený, takže je důležité zaregistrovat pouze terminologii, která by mohla být matoucí, a proto zachovat celkový počet registrovaných termínů na minimum.

Další informace najdete v referenčních informacích ke slovníku specifickému pro uživatele a k zadání vlastního slovníku společnosti Apple.

Přidání slovníku specifického pro aplikaci

Slovník specifický pro aplikaci definuje konkrétní slova a fráze, které budou známy všem uživatelům aplikace, jako jsou typy vozidel nebo názvy cvičení. Vzhledem k tomu, že jsou součástí aplikace, jsou definovány v souboru jako AppIntentVocabulary.plist součást hlavní sady aplikací. Kromě toho by se tato slova a fráze měly lokalizovat.

Termíny slovníku specifické pro aplikaci musí patřit do jedné z následujících kategorií:

  • Možnosti jízdy.
  • Názvy cvičení.

Soubor slovníku specifický pro aplikaci obsahuje dva klíče kořenové úrovně:

  • ParameterVocabulariesPovinné – Definuje vlastní termíny a parametry záměru aplikace, na které se vztahují.
  • IntentPhrasesVolitelné – obsahuje ukázkové fráze používající vlastní termíny definované v objektu ParameterVocabularies.

Každá položka v poli ParameterVocabularies musí určovat řetězec ID, termín a záměr, na který se termín vztahuje. Kromě toho se jeden termín může vztahovat na více záměrů.

Úplný seznampřijatelných souborů a požadované struktuře souborů najdete v referenční dokumentaci k formátu souboru appu společnosti Apple.

Pokud chcete do projektu aplikace přidat AppIntentVocabulary.plist soubor, postupujte takto:

  1. Klikněte pravým tlačítkem na název projektu v Průzkumník řešení a vyberte Přidat>nový soubor...>iOS:

    Přidání seznamu vlastností

  2. Poklikáním na AppIntentVocabulary.plist soubor v Průzkumník řešení ho otevřete pro úpravy.

  3. Klikněte na tlačítko + pro přidání klíče, nastavte název na ParameterVocabularies hodnotu a typ naArray:

    Nastavte název na ParameterVocabularies a typ na Pole.

  4. Rozbalte ParameterVocabularies tlačítko a klikněte na + tlačítko a nastavte typ naDictionary:

    Nastavení typu na slovník

  5. Klikněte na tlačítko + pro přidání nového klíče, nastavte název a ParameterNames typ naArray:

    Nastavte název na ParameterNames a type na Array.

  6. Kliknutím na tlačítko + přidáte nový klíč s typem String a hodnotou jako jeden z dostupných názvů parametrů. Příklad: INStartWorkoutIntent.workoutName

    Klíč INStartWorkoutIntent.workoutName

  7. ParameterVocabulary Přidejte klíč ke klíči ParameterVocabularies pomocí typu Array:

    Přidání klíče ParameterVocabulary do klíče ParameterVocabularies s typem pole

  8. Přidejte nový klíč s typem Dictionary:

    Přidejte nový klíč s typem slovníku v Visual Studio pro Mac.

  9. VocabularyItemIdentifier Přidejte klíč s typem String a zadejte jedinečné ID termínu:

    Přidejte klíč SlovníkItemIdentifier s typem řetězce a zadejte jedinečné ID.

  10. VocabularyItemSynonyms Přidejte klíč s typem Array:

    Přidání klíče VocabularyItemSynonyms s typem pole

  11. Přidejte nový klíč s typem Dictionary:

    Přidejte další nový klíč s typem slovníku v Visual Studio pro Mac.

  12. VocabularyItemPhrase Přidejte klíč s typem String a termínem, který aplikace definuje:

    Přidejte klíč SlovníkItemPhrase s typem řetězce a termínem, který aplikace definuje.

  13. VocabularyItemPronunciation Přidejte klíč s typem String a fonetickou výslovností termínu:

    Přidejte klíč SlovníkItemPronunciation s typem řetězce a fonetickou výslovností termínu.

  14. VocabularyItemExamples Přidejte klíč s typem Array:

    Přidání klíče VocabularyItemExamples s typem pole

  15. Přidejte několik String klíčů s příkladem použití termínu:

    Přidejte několik řetězcových klíčů s příkladem použití termínu v Visual Studio pro Mac.

  16. Opakujte výše uvedené kroky pro všechny ostatní vlastní termíny, které aplikace potřebuje definovat.

  17. Sbalte ParameterVocabularies klíč.

  18. IntentPhrases Přidejte klíč s typem Array:

    Přidání klíče IntentPhrases s typem pole

  19. Přidejte nový klíč s typem Dictionary:

    Přidejte další nový klíč s typem slovníku v Visual Studio pro Mac.

  20. IntentName Přidejte klíč s typem String a záměrem pro příklad:

    Přidejte klíč IntentName s typem řetězce a záměru v příkladu.

  21. IntentExamples Přidejte klíč s typem Array:

    Přidání klíče IntentExamples s typem pole

  22. Přidejte několik String klíčů s příkladem použití termínu:

    Přidejte několik dalších řetězcových klíčů s příkladem použití termínu v Visual Studio pro Mac.

  23. Opakujte výše uvedené kroky pro všechny záměry, které aplikace potřebuje, aby poskytovala ukázkové použití.

Důležité

Během vývoje bude aplikace AppIntentVocabulary.plist Siri zaregistrovaná v testovacích zařízeních a může trvat nějakou dobu, než Siri zahrne vlastní slovní zásobu. V důsledku toho bude tester muset několik minut počkat, než se pokusí otestovat slovník specifický pro aplikaci, když se aktualizuje.

Další informace najdete v referenčních informacích ke slovníku specifické pro aplikaci a k zadání vlastních odkazů na slovní zásobu společnosti Apple.

Přidání rozšíření záměrů

Teď, když je aplikace připravená na přijetí SiriKitu, bude muset vývojář do řešení přidat jedno (nebo více) rozšíření záměrů, aby zvládl záměry požadované pro integraci Siri.

Pro každé požadované rozšíření záměrů postupujte takto:

  • Přidejte projekt rozšíření Intents do řešení aplikace Xamarin.iOS.
  • Nakonfigurujte soubor s příponou Info.plist Intents.
  • Upravte hlavní třídu Intents Extension.

Další informace najdete v našich referenčních informacích k rozšíření Záměry a o vytváření rozšíření Záměry společnosti Apple.

Vytvoření rozšíření

Pokud chcete do řešení přidat rozšíření Intents, postupujte takto:

  1. Pravým tlačítkem myši klikněte na název řešení v oblasti řešení a vyberte Přidat>nový projekt....

  2. V dialogovém okně vyberte rozšíření záměru rozšíření rozšíření>pro iOS>a klikněte na tlačítko Další:

    Vybrat rozšíření záměru

  3. Potom zadejte název rozšíření záměru a klikněte na tlačítko Další :

    Zadejte název rozšíření záměru.

  4. Nakonec kliknutím na tlačítko Vytvořit přidejte rozšíření záměru do řešení aplikací:

    Přidejte rozšíření záměru do řešení aplikací.

  5. V Průzkumník řešení klikněte pravým tlačítkem myši na složku Reference nově vytvořeného rozšíření záměru. Zkontrolujte název projektu společné sdílené knihovny kódu (kterou aplikace vytvořila výše) a klikněte na tlačítko OK :

    Vyberte název společného projektu sdílené knihovny kódu.

Opakujte tento postup pro počet rozšíření záměrů (na základě návrhu výše uvedené části Aplikace pro rozšíření ), kterou bude aplikace vyžadovat.

Konfigurace souboru Info.plist

Pro každou z rozšíření záměrů, která byla přidána do řešení aplikace, musí být nakonfigurovaná v Info.plist souborech pro práci s aplikací.

Stejně jako jakékoli typické rozšíření aplikace bude mít aplikace stávající klíče NSExtension a NSExtensionAttributes. Pro rozšíření Intents existují dva nové atributy, které je potřeba nakonfigurovat:

Dva nové atributy, které je potřeba nakonfigurovat

  • IntentsSupported – Vyžaduje se a skládá se z pole názvů tříd záměru, které aplikace chce podporovat z rozšíření záměru.
  • IntentsRestrictedWhileLocked – je volitelným klíčem aplikace k určení chování zamykací obrazovky rozšíření. Skládá se z pole názvů tříd záměru, které chce aplikace vyžadovat, aby se uživatel přihlásil k použití z rozšíření záměru.

Pokud chcete nakonfigurovat soubor rozšíření Info.plist záměru, poklikejte na něj v Průzkumník řešení ho otevřete pro úpravy. Potom přepněte do zobrazení Zdroj a potom rozbalte klávesy NSExtension NSExtensionAttributes v editoru:

IntentsSupported Rozbalte klíč a přidejte název libovolné třídy záměru, která toto rozšíření bude podporovat. Například aplikace MonkeyChat podporuje INSendMessageIntent:

Pokud aplikace volitelně vyžaduje, aby se uživatel přihlásil k zařízení, aby používal daný záměr, rozbalte IntentRestrictedWhileLocked klíč a přidejte názvy tříd záměrů, které mají omezený přístup. V příkladu aplikace MonkeyChat musí být uživatel přihlášen, aby mohl odeslat chatovou zprávu, takže jsme přidali INSendMessageIntent:

Úplný seznam dostupných domén záměru najdete v referenčních informacích k doménám záměru společnosti Apple.

Konfigurace hlavní třídy

Dále bude muset vývojář nakonfigurovat hlavní třídu, která funguje jako hlavní vstupní bod rozšíření záměru do Siri. Musí se jednat o podtřídu, která INExtension odpovídá delegátu IINIntentHandler . Příklad:

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

Existuje jedna solitární metoda, kterou musí aplikace implementovat v hlavní třídě Intent Extension, metodu GetHandler . Tato metoda se předá SiriKit záměru a aplikace musí vrátit obslužnou rutinu záměru, která odpovídá typu daného záměru.

Vzhledem k tomu, že ukázková aplikace MonkeyChat zpracovává pouze jeden záměr, vrací se sama v GetHandler metodě. Pokud rozšíření zpracovalo více než jeden záměr, vývojář přidá třídu pro každý typ záměru a vrátí sem instanci na Intent základě předaného metodě.

Zpracování fáze řešení

Fáze řešení je místo, kde rozšíření záměru objasní a ověří parametry předávané ze Siri a byly nastaveny prostřednictvím konverzace uživatele.

Pro každý parametr, který se odešle ze Siri, existuje Resolve metoda. Aplikace bude muset implementovat tuto metodu pro každý parametr, který může aplikace potřebovat, aby aplikace mohla získat správnou odpověď od uživatele.

V případě ukázkové aplikace MonkeyChat bude rozšíření záměru vyžadovat, aby zprávu poslal jeden nebo více příjemců. Pro každého příjemce v seznamu bude rozšíření muset provést hledání kontaktů, které může mít následující výsledek:

  • Najde se přesně jeden odpovídající kontakt.
  • Byly nalezeny dva nebo více shodných kontaktů.
  • Nebyly nalezeny žádné odpovídající kontakty.

MonkeyChat navíc vyžaduje obsah textu zprávy. Pokud uživatel tuto možnost nezadá, siri musí uživatele vyzvat k zadání obsahu.

Rozšíření záměru bude muset řádně zpracovat každý z těchto případů.

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

Další informace najdete v referenčních informacích k fázi řešení a v referenčních informacích k záměrům řešení a zpracování.

Zpracování fáze Potvrzení

Fáze potvrzení je místo, kde rozšíření záměru zkontroluje, že obsahuje všechny informace pro splnění žádosti uživatele. Aplikace chce odeslat potvrzení spolu se všemi podpůrnými podrobnostmi o tom, co se chystá Siri, aby bylo možné potvrdit uživatelem, že se jedná o zamýšlenou akci.

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

Další informace najdete v naší referenční dokumentaci k potvrzení fáze.

Zpracování záměru

Toto je bod, kdy rozšíření záměru ve skutečnosti provádí úlohu, aby splnila požadavek uživatele a předala výsledky zpět Siri, aby bylo možné uživatele informovat.

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

Další informace najdete v našich referenčních informacích k fázi zpracování.

Přidání rozšíření uživatelského rozhraní Záměry

Volitelné rozšíření uživatelského rozhraní Intents představuje příležitost přenést uživatelské rozhraní a branding aplikace do prostředí Siri a zajistit uživatelům, aby se cítili připojeni k aplikaci. S tímto rozšířením může aplikace do přepisu přenést značku i vizuál a další informace.

Příklad výstupu rozšíření uživatelského rozhraní Intents

Stejně jako rozšíření Intents provede vývojář následující krok pro rozšíření uživatelského rozhraní Intents:

  • Přidejte projekt rozšíření uživatelského rozhraní Intents do řešení aplikace Xamarin.iOS.
  • Nakonfigurujte soubor s příponou Info.plist uživatelského rozhraní Intents.
  • Upravte hlavní třídu Rozšíření uživatelského rozhraní Intents.

Další informace najdete v referenčních informacích k rozšíření uživatelského rozhraní Intents a společnosti Apple, která poskytuje referenční informace k vlastnímu rozhraní.

Vytvoření rozšíření

Pokud chcete do řešení přidat rozšíření uživatelského rozhraní Intents, postupujte takto:

  1. Pravým tlačítkem myši klikněte na název řešení v oblasti řešení a vyberte Přidat>nový projekt....

  2. V dialogovém okně vyberte rozšíření uživatelského rozhraní záměru rozšíření rozšíření>pro iOS>a klikněte na tlačítko Další:

    Výběr rozšíření uživatelského rozhraní záměru

  3. Potom zadejte název rozšíření záměru a klikněte na tlačítko Další :

    Do Visual Studio pro Mac zadejte název rozšíření záměru.

  4. Nakonec kliknutím na tlačítko Vytvořit přidejte rozšíření záměru do řešení aplikací:

    Přidejte rozšíření záměru do řešení aplikací v Visual Studio pro Mac.

  5. V Průzkumník řešení klikněte pravým tlačítkem myši na složku Reference nově vytvořeného rozšíření záměru. Zkontrolujte název projektu společné sdílené knihovny kódu (kterou aplikace vytvořila výše) a klikněte na tlačítko OK :

    V Visual Studio pro Mac vyberte název projektu společné sdílené knihovny kódu.

Konfigurace souboru Info.plist

Nakonfigurujte soubor rozšíření Info.plist uživatelského rozhraní Intents tak, aby fungoval s aplikací.

Stejně jako jakékoli typické rozšíření aplikace bude mít aplikace stávající klíče NSExtension a NSExtensionAttributes. Pro rozšíření Intents existuje jeden nový atribut, který musí být nakonfigurován:

Jeden nový atribut, který musí být nakonfigurován

IntentsSupported je povinný a skládá se z pole názvů třídy záměru, které aplikace chce podporovat z rozšíření záměru.

Pokud chcete nakonfigurovat soubor rozšíření Info.plist uživatelského rozhraní záměru, poklikejte na něj v Průzkumník řešení ho otevřete pro úpravy. Potom přepněte do zobrazení Zdroj a potom rozbalte klávesy NSExtension NSExtensionAttributes v editoru:

Klíče NSExtension a NSExtensionAttributes v editoru.

IntentsSupported Rozbalte klíč a přidejte název libovolné třídy záměru, která toto rozšíření bude podporovat. Například aplikace MonkeyChat podporuje INSendMessageIntent:

Úplný seznam dostupných domén záměru najdete v referenčních informacích k doménám záměru společnosti Apple.

Konfigurace hlavní třídy

Nakonfigurujte hlavní třídu, která funguje jako hlavní vstupní bod rozšíření uživatelského rozhraní záměru do Siri. Musí se jednat o podtřídu, která UIViewController odpovídá IINUIHostedViewController rozhraní. Příklad:

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 předá INInteraction instanci Configure třídy metodě UIViewController instance uvnitř rozšíření uživatelského rozhraní záměru.

Objekt INInteraction poskytuje pro rozšíření tři klíčové informace:

  1. Objekt Intent, který se zpracovává.
  2. Objekt Intent Response z Confirm a Handle metod rozšíření Intent.
  3. Stav interakce, který definuje stav interakce mezi aplikací a Siri.

Instance UIViewController je hlavní třídou pro interakci se Siri a protože dědí z UIViewController, má přístup ke všem funkcím UIKit.

Když Siri volá metodu Configure UIViewController , která se předává v kontextu zobrazení s oznámením, že kontroler zobrazení bude buď hostovaný na kartě Siri Snippit nebo Mapy.

Siri také předá obslužnou rutinu dokončení, kterou aplikace potřebuje po dokončení konfigurace aplikace vrátit požadovanou velikost zobrazení.

Návrh uživatelského rozhraní v iOS Designeru

Rozložení uživatelského rozhraní rozšíření Intents UI v iOS Designeru Poklikáním na soubor přípony MainInterface.storyboard v Průzkumník řešení ho otevřete pro úpravy. Přetažením všech požadovaných prvků uživatelského rozhraní sestavte uživatelské rozhraní a uložte změny.

Důležité

I když je možné přidat interaktivní prvky, jako UIButtons je rozšíření uživatelského rozhraní UIViewControllerzáměru nebo UITextFields rozšíření záměru, jsou přísně zakázané, protože uživatelské rozhraní záměru není interaktivní a uživatel s nimi nebude moct pracovat.

Připojení uživatelského rozhraní

S uživatelským rozhraním rozšíření Intents UI vytvořeným v iOS Designeru upravte podtřídu UIViewController a přepište metodu Configure následujícím způsobem:

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

Přepsání výchozího uživatelského rozhraní Siri

Rozšíření uživatelského rozhraní Záměry se vždy zobrazí spolu s jiným obsahem Siri, jako je ikona aplikace a název v horní části uživatelského rozhraní nebo na základě tlačítek Záměr (například Odeslat nebo Zrušit), se můžou zobrazit v dolní části.

Aplikace může ve výchozím nastavení nahradit informace, které se uživateli zobrazují ve výchozím nastavení, například zasílání zpráv nebo map, kde může aplikace nahradit výchozí prostředí přizpůsobené aplikaci.

Pokud rozšíření záměrů uživatelského rozhraní potřebuje přepsat prvky výchozího uživatelského rozhraní Siri, UIViewController bude podtřída muset implementovat IINUIHostedViewSiriProviding rozhraní a přihlásit se k zobrazení konkrétního prvku rozhraní.

Do podtřídy přidejte následující kód UIViewController , který Siri oznámí, že rozšíření uživatelského rozhraní záměru už zobrazuje obsah zprávy:

public bool DisplaysMessage {
    get {return true;}
}

Důležité informace

Apple navrhuje, aby vývojář při návrhu a implementaci rozšíření uživatelského rozhraní záměru zohlednil následující aspekty:

  • Uvědomte si využití paměti – vzhledem k tomu, že rozšíření uživatelského rozhraní záměru jsou dočasná a zobrazují se jenom na krátkou dobu, má systém přísnější omezení paměti, než se používá v plné aplikaci.
  • Zvažte minimální a maximální velikosti zobrazení – Zajistěte, aby rozšíření uživatelského rozhraní záměru vypadala dobře na všech typech, velikostech a orientaci zařízení s iOSem. Kromě toho nemusí být možné udělit požadovanou velikost, kterou aplikace odesílá zpět do Siri.
  • Používejte flexibilní a adaptivní rozložení – opět zajistěte, aby uživatelské rozhraní vypadalo skvěle na každém zařízení.

Shrnutí

Tento článek se zabýval SiriKitem a ukázal, jak se dá přidat do aplikací Xamarin.iOS, aby poskytoval služby, které jsou přístupné pro uživatele pomocí Siri a aplikace Mapy na zařízení s iOSem.