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

The MonkeyChat icon

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:

Extending the App with SiriKit diagram

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

    Add a new project

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

    Select Class Library

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

    Enter MonkeyChatCommon for the Name

  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:

    Check the MonkeyChatCommon project

  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:

    The DataModels and Processors folders in the Solution Explorer

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.siriPřidejte vlastnost, nastavte typ na Boolean hodnotu a hodnotu naYes:

    Add the com.apple.developer.siri Property

  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 :

    Select the Entitlements.plist file in the Custom Entitlements field

  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 :

    Select SiriKit

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

    Select Accounts

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

    Download All Profiles

  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:

    The Bundle Identifier

  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:

    Select the Signing Identity and Provisioning Profile

  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":

The NSSiriUsageDescription in the Info.plist editor

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 zpočátku 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:

    Add a property list

  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 typnaArray:

    Set the Name to ParameterVocabularies and the Type to Array

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

    Set the Type to Dictionary

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

    Set the Name to ParameterNames and the Type to Array

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

    The INStartWorkoutIntent.workoutName key

  7. ParameterVocabulary Přidejte klíč ke klíči ParameterVocabulariespomocí typuArray:

    Add the ParameterVocabulary key to the ParameterVocabularies key with the Type of Array

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

    Add a new key with the Type of Dictionary in Visual Studio for Mac.

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

    Add the VocabularyItemIdentifier key with the Type of String and specify a unique ID

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

    Add the VocabularyItemSynonyms key with the Type of Array

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

    Add another new key with the Type of Dictionary in Visual Studio for Mac.

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

    Add the VocabularyItemPhrase key with the Type of String and the term the app are defining

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

    Add the VocabularyItemPronunciation key with the Type of String and the phonetic pronunciation of the term

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

    Add the VocabularyItemExamples key with the Type of Array

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

    Add a few String keys with example uses of the term in Visual Studio for 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:

    Add the IntentPhrases key with the Type of Array

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

    Add an additional new key with the Type of Dictionary in Visual Studio for Mac.

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

    Add the IntentName key with the Type of String and Intent for the example

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

    Add the IntentExamples key with the Type of Array

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

    Add a few additional String keys with example uses of the term in Visual Studio for 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ší:

    Select Intent Extension

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

    Enter a Name for the Intent Extension.

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

    Add the Intent Extension to the apps solution.

  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 :

    Select the name of the common shared code library project.

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:

The two new attributes that must be configured

  • 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 NSExtensionNSExtensionAttributes 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.

An example Intents UI Extension output

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ší:

    Select Intent UI Extension

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

    Enter a Name for the Intent Extension in Visual Studio for Mac.

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

    Add the Intent Extension to the apps solution in Visual Studio for 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 :

    Select the name of the common shared code library project in Visual Studio for Mac.

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:

The one new attribute that must be configured

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 NSExtensionNSExtensionAttributes v editoru:

The NSExtension and NSExtensionAttributes keys in the editor.

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á Configure metoduUIViewController, která se předává v kontextu zobrazení s oznámením, že kontroler zobrazení bude buď hostovaný v Siri Snippit, nebo Mapy karta.

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.storyboardv 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 a poskytovat služby, které jsou přístupné pro uživatele pomocí Siri a aplikace Mapy na zařízení s iOSem.