Klávesové zkratky Siri v Xamarin.iOS

V iOSu 10 představil Apple SiriKit, který umožňuje vytvářet zprávy, volání VoIP, platby, cvičení, jízdu rezervace a aplikace pro vyhledávání fotek, které komunikují se Sirim.

V iOSu 11 získala SiriKit podporu pro více typů aplikací a větší flexibilitu pro přizpůsobení uživatelského rozhraní.

iOS 12 přidává zástupce Siri, což umožňuje všem typům aplikací zpřístupnit jejich funkce Siri. Siri se naučí, kdy jsou některé úkoly založené na aplikacích pro uživatele nejrelevantní a používají tyto znalosti k návrhu potenciálních akcí prostřednictvím zástupců. Klepnutím na zástupce nebo vyvoláním hlasového příkazu otevřete aplikaci nebo spustíte úlohu na pozadí.

Klávesové zkratky by se měly použít ke zrychlení schopnosti uživatele provádět běžnou úlohu – v mnoha případech bez nutnosti otevřít danou aplikaci.

Ukázková aplikace: Polévka Chef

Pokud chcete lépe porozumět zástupcům Siri, podívejte se na ukázkovou aplikaci Polévka Chef. Polévkový chef umožňuje uživatelům zadávat objednávky z imaginární polévkové restaurace, zobrazit si historii objednávek a definovat fráze, které se mají použít při objednávání polévky pomocí interakce se Siri.

Tip

Před testováním nástroje Soup Chef na simulátoru nebo zařízení s iOSem 12 povolte následující dvě nastavení, která jsou užitečná při ladění klávesových zkratek:

  • V aplikaci Nastavení povolte klávesové zkratky zobrazení pro vývojáře>.
  • V aplikaci Nastavení povolte vývojářské > dary na zamykací obrazovce.

Tato nastavení ladění usnadňují vyhledání nedávno vytvořených (místo předpovídaných) zkratek na zamykací obrazovce iOS a na obrazovce hledání.

Použití ukázkové aplikace:

  • Nainstalujte a spusťte ukázkovou aplikaci Soup Chef na simulátoru nebo zařízení s iOSem 12.
  • Kliknutím na + tlačítko v pravém horním rohu vytvořte novou objednávku.
  • Vyberte typ polévky, zadejte množství a možnosti a klepněte na Zadat objednávku.
  • Na obrazovce Historie objednávek klepněte na nově vytvořenou objednávku a zobrazte její podrobnosti.
  • V dolní části obrazovky s podrobnostmi objednávky klepněte na Přidat do Siri.
  • Nahrajte hlasovou frázi, kterou chcete přidružit k objednávce, a klepněte na Hotovo.
  • Pomocí hlasové fráze, kterou jste nahráli, minimalizujte chef polévky, vyvolání Siri a opětovné umístění objednávky.
  • Po dokončení objednávky Siri znovu otevřete Aplikaci Polévk Chef a všimněte si, že nová objednávka je uvedená na obrazovce Historie objednávek.

Ukázková aplikace ukazuje, jak:

Info.plist a Entitlements.plist

Než se podrobněji ponoříte do kódu Chef polévky, podívejte se na své soubory Info.plist a Entitlements.plist .

Info.plist

Soubor Info.plist v projektu SoupChef definuje identifikátor svazku jako com.xamarin.SoupChef. Tento identifikátor sady se použije jako předpona pro identifikátory sady rozšíření záměrů a záměrů uživatelského rozhraní popisovaných dále v tomto dokumentu.

Soubor Info.plist obsahuje také následující položku:

<key>NSUserActivityTypes</key>
<array>
    <string>OrderSoupIntent</string>
    <string>com.xamarin.SoupChef.viewMenu</string>
</array>

Tento NSUserActivityTypes pár klíč/hodnota označuje, že Polévka Chef ví, jak zpracovat , OrderSoupIntenta NSUserActivityActivityType "com.xamarin.SoupChef.viewMenu".

Aktivity a vlastní záměry předané samotné aplikaci na rozdíl od jeho rozšíření se zpracovávají v AppDelegate metodě ( UIApplicationDelegate metodou ContinueUserActivity ).

Entitlements.plist

Soubor Entitlements.plist v projektu SoupChef obsahuje následující položky:

<key>com.apple.security.application-groups</key>
<array>
    <string>group.com.xamarin.SoupChef</string>
</array>
<key>com.apple.developer.siri</key>
<true/>

Tato konfigurace označuje, že aplikace používá skupinu aplikací "group.com.xamarin.SoupChef". Rozšíření aplikace SoupChefIntents používá stejnou skupinu aplikací, která umožňuje sdílení dvou projektů. NSUserDefaults Dat.

Klíč com.apple.developer.siri označuje, že aplikace komunikuje se Sirim.

Poznámka:

Konfigurace sestavení projektu SoupChef nastaví vlastní nároky na Entitlements.plist.

Otevření aplikace pomocí zástupce NSUserActivity

Pokud chcete vytvořit zástupce, který otevře aplikaci pro zobrazení konkrétního obsahu, vytvořte ho NSUserActivity a připojte ho k ovladači zobrazení pro obrazovku, kterou chcete otevřít.

Nastavení NSUserActivity

Na obrazovce SoupMenuViewController nabídky vytvoří NSUserActivity vlastnost kontroleru UserActivity zobrazení a přiřadí ji:

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    UserActivity = NSUserActivityHelper.ViewMenuActivity;
}

UserActivity Nastavení vlastnosti daruje aktivitu Siri. Z tohoto daru siri získá informace o tom, kdy a kde je tato aktivita relevantní pro uživatele, a učí se ji lépe navrhovat v budoucnu.

NSUserActivityHelper je užitková třída, která je součástí řešení SoupChef v knihovně tříd SoupKit . NSUserActivity Vytvoří a nastaví různé vlastnosti související se Siri a vyhledáváním:

public static string ViewMenuActivityType = "com.xamarin.SoupChef.viewMenu";

public static NSUserActivity ViewMenuActivity {
    get
    {
        var userActivity = new NSUserActivity(ViewMenuActivityType)
        {
            Title = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_LUNCH_TITLE", "View menu activity title"),
            EligibleForSearch = true,
            EligibleForPrediction = true
        };

        var attributes = new CSSearchableItemAttributeSet(NSUserActivityHelper.SearchableItemContentType)
        {
            ThumbnailData = UIImage.FromBundle("tomato").AsPNG(),
            Keywords = ViewMenuSearchableKeywords,
            DisplayName = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_LUNCH_TITLE", "View menu activity title"),
            ContentDescription = NSBundleHelper.SoupKitBundle.GetLocalizedString("VIEW_MENU_CONTENT_DESCRIPTION", "View menu content description")
        };
        userActivity.ContentAttributeSet = attributes;

        var phrase = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_LUNCH_SUGGESTED_PHRASE", "Voice shortcut suggested phrase");
        userActivity.SuggestedInvocationPhrase = phrase;
        return userActivity;
    }
}

Všimněte si zejména následujících funkcí:

  • true Nastavení EligibleForPrediction označující, že Siri může tuto aktivitu předpovědět a zobrazit ji jako zástupce.
  • Toto ContentAttributeSet pole je standard CSSearchableItemAttributeSet používaný k zahrnutí do výsledků hledání v iOSu NSUserActivity .
  • SuggestedInvocationPhrase je fráze, kterou Siri doporučí uživateli jako potenciální volbu při přiřazování fráze zástupce.

Zpracování zástupce NSUserActivity

Aby bylo potřeba zpracovat NSUserActivity zástupce vyvolaného uživatelem, musí aplikace pro iOS přepsat ContinueUserActivity metodu AppDelegate třídy, která reaguje na ActivityType základě pole předaného NSUserActivity objektu:

public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
    // ...
    else if (userActivity.ActivityType == NSUserActivityHelper.ViewMenuActivityType)
    {
        HandleUserActivity();
        return true;
    }
    // ...
}

Tato metoda volá HandleUserActivity, který najdegue na obrazovce nabídky a vyvolá ji:

void HandleUserActivity()
{
    var rootViewController = Window?.RootViewController as UINavigationController;
    var orderHistoryViewController = rootViewController?.ViewControllers?.FirstOrDefault() as OrderHistoryTableViewController;
    if (orderHistoryViewController is null)
    {
        Console.WriteLine("Failed to access OrderHistoryTableViewController.");
        return;
    }
    var segue = OrderHistoryTableViewController.SegueIdentifiers.SoupMenu;
    orderHistoryViewController.PerformSegue(segue, null);
}

Přiřazení fráze k NSUserActivity

Pokud chcete přiřadit frázi k aplikaci NSUserActivitypro iOS Nastavení a zvolte Siri &Search > My Shortcuts. Pak vyberte zástupce (v tomto případě "Oběd objednávky") a nahrajte frázi.

Vyvolání Siri a použití této fráze otevře chef polévky na obrazovce nabídky.

Použití zástupce vlastního záměru k provedení úkolu

Definování vlastního záměru

Pokud chcete poskytnout zástupce, který uživateli umožní rychle dokončit konkrétní úlohu související s vaší aplikací, vytvořte vlastní záměr. Vlastní záměr představuje úkol, který může uživatel chtít dokončit, parametry relevantní pro daný úkol a potenciální odpovědi vyplývající z provádění úkolu. V závislosti na tom, jak je definovaný vlastní záměr, může jeho vyvolání otevřít aplikaci nebo spustit úlohu na pozadí.

K vytvoření vlastních záměrů použijte Xcode 10. V úložišti SoupChef se vlastní záměr definuje v projektu OrderSoupIntentCodeGenObjective-C. Otevřete tento projekt a výběrem souboru Intents.intentdefinition v Navigátoruprojektu zobrazte záměr OrderSoup.

Všimněte si těchto funkcí:

  • Záměr má kategoriipořadí. Existují různé předem definované kategorie, které lze použít pro vlastní záměry; vyberte ten, který nejvíce odpovídá úkolu, který váš vlastní záměr povolí. Vzhledem k tomu, že toto řešení je aplikace pro objednávání polévky, OrderSoupIntent používá Order.
  • Zaškrtávací políčko Potvrzení označuje, jestli siri musí před provedením úkolu požádat o potvrzení. U záměru Objednat polévku v nástroji Polévka Chef je tato možnost povolená, protože uživatel provádí nákup.
  • Oddíl Parametrysouboru .intentdefinition definuje parametry relevantní pro zástupce. Aby bylo možné objednat polévku, musí chef znát typ polévky, jeho množství a všechny přidružené možnosti. Každý parametr má typ; parametr, který nelze reprezentovat předdefinovaným typem, je nastaven jako Vlastní.
  • Rozhraní Klávesové zkratky popisuje různé kombinace parametrů, které může Siri použít při navrhování zástupce. Přidružené oddíly Nadpis a Podnadpis umožňují definovat zprávy, které Siri použije při prezentování navrhovaného zástupce uživateli.
  • U libovolného zástupce, který lze spustit bez otevření aplikace pro další interakci uživatele, je třeba zaškrtnout políčko Podporuje provádění na pozadí.

Definování vlastních odpovědí záměru

Položka Odpovědi vnořená pod záměrem OrderSoup představuje potenciální odpovědi, které jsou výsledkem objednávky polévky.

V definici odpovědi záměru OrderSoup si všimněte následujících funkcí:

  • Vlastnosti odpovědi lze použít k přizpůsobení zprávy předané uživateli. Odpověď záměru OrderSoup obsahuje vlastnosti polévky a waitTime .
  • Šablony odpovědí určují různé zprávy o úspěchu a selhání, které lze použít k označení stavu po dokončení úkolu záměru.
  • U odpovědí, které označují úspěch, by mělo být zaškrtnuté políčko Úspěch .
  • Odpověď Na úspěch OrderSoupIntent používá polévkua vlastnosti waitTime k poskytnutí přátelské a užitečné zprávy popisující, kdy bude objednávka polévky připravena.

Generování kódu pro vlastní záměr

Sestavení projektu Xcode obsahujícího tuto vlastní definici záměru způsobí, že Xcode vygeneruje kód, který lze použít k programové interakci s vlastním záměrem a jeho odpověďmi.

Pokud chcete zobrazit tento vygenerovaný kód:

  • Otevřete AppDelegate.m.
  • Přidejte import do souboru hlaviček vlastního záměru: #import "OrderSoupIntent.h"
  • V libovolné metodě třídy přidejte odkaz na OrderSoupIntent.
  • Klikněte pravým tlačítkem myši OrderSoupIntent a zvolte Přejít na definici.
  • Klikněte pravým tlačítkem myši na nově otevřený soubor OrderSoupIntent.h a vyberte Zobrazit ve Finderu.
  • Tato akce otevře okno Finderu, které obsahuje soubor .h a .m obsahující vygenerovaný kód.

Tento vygenerovaný kód zahrnuje:

  • OrderSoupIntent – Třída, která představuje vlastní záměr.
  • OrderSoupIntentHandling – Protokol, který definuje metody, které se použijí k potvrzení, že se má záměr provést, a metodu, která ji skutečně provede.
  • OrderSoupIntentResponseCode – Výčet, který definuje různé stavy odpovědí.
  • OrderSoupIntentResponse – třída, která představuje odpověď na spuštění záměru.

Vytvoření vazby k vlastnímu záměru

Pokud chcete použít kód vygenerovaný Xcode v aplikaci Xamarin.iOS, vytvořte pro něj vazbu jazyka C#.

Vytvoření statické knihovny a definic vazeb jazyka C#

V úložišti SoupChef se podívejte do složky OrderSoupIntentStaticLib a otevřete projekt OrderSoupIntentStaticLib.xcodeproj Xcode.

Tento projekt Statické knihovny Cocoa Touch obsahuje soubory OrderSoupIntent.h a OrderSoupIntent.m generované Xcode.

Konfigurace nastavení sestavení projektu statické knihovny

V navigátoru projektu Xcode vyberte projekt nejvyšší úrovně, OrderSoupIntentStaticLib a přejděte na Build Phases > Compile Sources. Všimněte si, že OrderSoupIntent.m (který importuje OrderSoupIntent.h) je zde uveden. V části Odkaz Binary With Libraries si všimněte, že jsou zahrnuty intents.framework a Foundation.framework . S těmito nastaveními se architektura správně sestaví.

Sestavení statické knihovny a generování definic vazeb jazyka C#

Pokud chcete vytvořit statickou knihovnu a vygenerovat pro ni definice vazeb jazyka C#, postupujte takto:

  • Nainstalujte Objective Sharpie, nástroj použitý ke generování definic vazeb ze souborů .h a .m vytvořených pomocí Xcode.

  • Nakonfigurujte systém tak, aby používal nástroje příkazového řádku Xcode 10:

    Upozorňující

    Aktualizace vybraných nástrojů příkazového řádku má vliv na všechny nainstalované verze Xcode ve vašem systému. Až budete hotovi pomocí ukázkové aplikace Polévka Chef, nezapomeňte toto nastavení vrátit k původní konfiguraci.

    • V Xcode zvolte umístění předvoleb > Xcode > a nastavte nástroje příkazového řádku na nejnovější instalaci Xcode 10, která je dostupná ve vašem systému.
  • V terminálu cd přejděte do adresáře OrderSoupIntentStaticLib .

  • Typ make, který sestaví:

    • Statická knihovna libOrderSoupIntentStaticLib.a
    • V výstupním adresáři bo definice vazeb jazyka C#:
      • ApiDefinitions.cs
      • StructsAndEnums.cs

Projekt OrderSoupIntentBindings , který spoléhá na tuto statickou knihovnu a definice přidružených vazeb, tyto položky sestaví automaticky. Ruční spuštěním výše uvedeného procesu ale zajistíte, že se sestaví podle očekávání.

Další informace o vytvoření statické knihovny a použití Objective Sharpie k vytvoření definic vazeb jazyka C# najdete v návodu k vytvoření vazby knihovny pro iOSObjective-C.

Vytvoření knihovny vazeb

Se vytvořenou statickou knihovnou a definicemi vazeb jazyka C# je zbývající část potřebná k využití kódu souvisejícího se záměrem v Xcode v projektu Xamarin.iOS jako knihovna vazeb.

V úložišti Polévk Chef otevřete soubor SoupChef.sln. Mimo jiné toto řešení obsahuje OrderSoupIntentBinding, knihovnu vazeb pro statickou knihovnu vygenerovanou dříve.

Všimněte si zejména, že tento projekt zahrnuje:

  • ApiDefinitions.cs – soubor vygenerovaný dříve Objective Sharpie a přidaný do tohoto projektu. Akce sestavení tohoto souboru je nastavená na ObjcBindingApiDefinition.

  • StructsAndEnums.cs – Jiný soubor vygenerovaný dříve Objective Sharpie a přidán do tohoto projektu. Akce sestavení tohoto souboru je nastavená na ObjcBindingCoreSource.

  • Nativní odkaz na libOrderSoupIntentStaticLib.a, statickou knihovnu vytvořenou dříve. Aktualizujte nativní referenční vlastnosti a zadejte následující hodnoty:

    1. Architektury = Foundation Intents
    2. Smart Link = On
    3. Vynucení zatížení = On
    4. Druh = Static

Poznámka:

ApiDefinitions.cs i StructsAndEnums.cs obsahují atributy, jako [Watch (5,0), iOS (12,0)]je . Tyto atributy vygenerované Objective Sharpie byly okomentovány, protože nejsou pro tento projekt nezbytné.

Další informace o vytvoření knihovny vazeb jazyka C# najdete v návodu k vytvoření vazby knihovny pro iOSObjective-C.

Všimněte si, že projekt SoupChef obsahuje odkaz na OrderSoupIntentBinding, což znamená, že teď může přistupovat, v jazyce C#, třídách, rozhraních a výčtech, které obsahuje:

  • OrderSoupIntent
  • OrderSoupIntentHandling
  • OrderSoupIntentResponse
  • OrderSoupIntenseResponseCode

Vytvoření architektury Swift

Nativní kód definice záměru je ve výchozím nastavení generován Xcode pomocí jazyka vašeho nativního projektu. Pokud definujete soubor Intents.intentdefinition v projektu Swift, Xcode vygeneruje jeden soubor Swift se všemi požadovanými třídami, které můžete použít k vytvoření architektury Swift.

Tip

V nastavení sestavení Xcode můžete vybrat požadovaný jazyk pro vygenerovaný kód záměru. Přejděte na cíl > sestavení záměru Nastavení > kompilátor definice záměru – Generování kódu a vyberte Swift nebo Objective-C. Můžete ho také nechat automaticky tak, aby odpovídal vašemu cílovému jazyku.

Proces vytvoření architektury Swift je podobný tomu, který jsme popsali dříve:

  1. Vytvořte nový projekt architektury Swift.
  2. Zkopírujte automaticky vygenerovaný soubor Swift s kódem záměru do tohoto projektu. Tento soubor najdete, jak je popsáno zde.
  3. Objective-C Povolte přemostění hlavičky, takže architektura se automaticky vygeneruje s požadovaným souborem Objective-C hlavičky sharpie.

Po sestavení architektury postupujte podle stejných kroků popsaných výše a vytvořte vazbu Xamarinu. Další informace o vytvoření vazby pro architekturu Swift najdete tady.

Přidání definičního souboru záměru do řešení

V řešení C# SoupChef obsahuje projekt SoupKit kód sdílený mezi aplikací a jeho rozšířeními. Soubor Intents.intentdefinition byl umístěn v adresáři Base.lproj sady SoupKit a má akcisestavení obsahu. Proces sestavení zkopíruje tento soubor do sady aplikace Polévk Chef, kde je potřeba, aby aplikace fungovala správně.

Darování záměru

Aby Siri navrhla zástupce, musí nejprve pochopit, kdy je zástupce relevantní.

Pokud chcete Siri dát tomuto porozumění, chef polévky daruje záměr Siri pokaždé, když uživatel umístí objednávku polévky. Na základě tohoto daru – kdy byl darován, kde byl darován, parametry, které obsahuje – Siri zjistí, kdy navrhnout zástupce v budoucnu.

PolévkaChef používá SoupOrderDataManager třídu k umístění darů. Když zavoláte k zadání objednávky polévky pro uživatele, PlaceOrder metoda zase zavolá DonateInteraction:

void DonateInteraction(Order order)
{
    var interaction = new INInteraction(order.Intent, null);
    interaction.Identifier = order.Identifier.ToString();
    interaction.DonateInteraction((error) =>
    {
        // ...
    });
}

Po načtení záměru se zabalí do objektu INInteraction. Je INInteraction dáno Identifier které odpovídá jedinečnému ID objednávky (bude užitečné později při odstraňování darů záměrů, které již nejsou platné). Pak se interakce daruje Siri.

Volání getter načte order.IntentOrderSoupIntent , který představuje pořadí nastavením jeho Quantity, Soup, Optionsa obrázek a vyvolání fráze použít jako návrh, když uživatel zaznamená frázi pro Siri, která se má přidružit k záměru:

public OrderSoupIntent Intent
{
    get
    {
        var orderSoupIntent = new OrderSoupIntent();
        orderSoupIntent.Quantity = new NSNumber(Quantity);
        orderSoupIntent.Soup = new INObject(MenuItem.ItemNameKey, MenuItem.LocalizedString);

        var image = UIImage.FromBundle(MenuItem.IconImageName);
        if (!(image is null))
        {
            var data = image.AsPNG();
            orderSoupIntent.SetImage(INImage.FromData(data), "soup");
        }

        orderSoupIntent.Options = MenuItemOptions
            .ToArray<MenuItemOption>()
            .Select<MenuItemOption, INObject>(arg => new INObject(arg.Value, arg.LocalizedString))
            .ToArray<INObject>();

        var comment = "Suggested phrase for ordering a specific soup";
        var phrase = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_SOUP_SUGGESTED_PHRASE", comment);
        orderSoupIntent.SuggestedInvocationPhrase = String.Format(phrase, MenuItem.LocalizedString);

        return orderSoupIntent;
    }
}

Odebrání neplatných darů

Je důležité odebrat dary, které už nejsou platné, aby Siri nevytváněl neužitečné nebo matoucí návrhy zástupců.

V nástroji Polévka Chef se dá obrazovka Konfigurovat nabídku použít k označení položky nabídky jako nedostupné. Siri by už neměl navrhovat zástupce pro objednání nedostupné položky nabídky, takže RemoveDonation metoda SoupMenuManager odstranění darů pro položky nabídky, které už nejsou k dispozici. Aplikace tuto funkci implementuje takto:

  • Vyhledání objednávek přidružených k položce nabídky nyní není k dispozici.
  • Uchopte jejich identifikátory.
  • Odstranění interakcí se stejnými identifikátory
void RemoveDonation(MenuItem menuItem)
{
    if (!menuItem.IsAvailable)
    {
        Order[] orderHistory = OrderManager?.OrderHistory.ToArray<Order>();
        if (orderHistory is null)
        {
            return;
        }

        string[] orderIdentifiersToRemove = orderHistory
            .Where<Order>((order) => order.MenuItem.ItemNameKey == menuItem.ItemNameKey)
            .Select<Order, string>((order) => order.Identifier.ToString())
            .ToArray<string>();

        INInteraction.DeleteInteractions(orderIdentifiersToRemove, (error) =>
        {
            if (!(error is null))
            {
                Console.WriteLine($"Failed to delete interactions with error {error.ToString()}");
            }
            else
            {
                Console.WriteLine("Successfully deleted interactions");
            }
        });
    }
}

Ověření úspěšných darů

Řešení zahrnuje více projektů a konkrétní konfiguraci. V některých případech může dojít k chybovému ukončení aplikace kvůli neúplné konfiguraci, v jiných případech může bezobslužně selhat darovat interakci. Je důležité ověřit úspěšné dary a nastavení pro vývojáře pro iOS s ním pomůže. Přejděte na Nastavení > Vývojář a povolte následující možnosti pro vývojáře, abyste viděli nedávné dary a klávesové zkratky:

  • Zobrazit poslední klávesové zkratky
  • Zobrazení darů na zamykací obrazovce

Po povolení se každý úspěšný dar zobrazí na zamykací obrazovce a pod možnostmi návrhů Siri. Pokud se po spuštění aplikace tam nezobrazují dary, projděte si následující případy řešení potíží:

  1. Aplikaci se nepodaří vytvořit OrderSoupIntent s následující chybou:

    Nelze vytvořit nativní instanci typu NativeLibrary.OrderSoupIntent: nativní třída nebyla načtena.

    Tato chyba znamená, že Xamarin nemůže načíst nativní třídu prostřednictvím vazby Xamarin. Pokud chcete tento problém vyřešit, ověřte, že nativní knihovna obsahuje požadovaný kód, odkazovaný projektem vazby a jsou nastaveny správné příznaky, jak je popsáno zde, nastavte Force Load příznak na On.

  2. Aplikaci se nepodaří inicializovat načtenou nativní instanci třídy záměru s následující chybou:

    Nelze inicializovat instanci typu NativeLibrary.OrderSoupIntent: nativní init metoda vrátila hodnotu nil.

    Problém souvisí s chybějícím definičním souborem záměru. Aplikace Xamarin by měla obsahovat původní definiční soubor záměru Content s typem, jak je popsáno zde.

  3. Aplikace vytvoří záměr a zavolá metodu darování bez chybového ukončení, ale výstup konzoly zobrazí upozornění na neznámý typ záměru a neprovádí se žádný dar:

    Nelze darovat interakci s OrderSoupIntent, který nemá žádné platné typy zástupců.

    Aby bylo možné problém vyřešit, musí být záměr správně definovaný v seznamu plist, musí být oprávnění Siri povolená a vybrána pro aktuální konfiguraci sestavení prostřednictvím nastavení projektu.

    Soubor info.plist aplikace:

    <key>NSUserActivityTypes</key>
    <array>
        <string>ScheduleMeetingIntent</string>
    </array>
    

    Soubor Entitlements.plist aplikace s funkcí Siri:

    <key>com.apple.developer.siri</key>
    <true/>
    

    Pro konfiguraci cílového sestavení by se měly vybrat vlastní nároky. Přejděte do části Project settings > Build > iOS Bundle Signing and set Custom Entitlements to the Entitlements.plist file containing the required entitlements.

Vytvoření rozšíření Intents

Kód, který se spustí, když Siri vyvolá záměr, se umístí do rozšíření Intents, které se dá přidat jako nový projekt do stejného řešení jako existující aplikace Xamarin.iOS, jako je například Polévka Chef. V roztoku SoupChef se rozšíření nazývá SoupChefIntents.

SoupChefIntents – Info.plist a Entitlements.plist

PolévkaChefIntents – Info.plist

Info.plist v projektu SoupChefIntents definuje identifikátor svazku jako com.xamarin.SoupChef.SoupChefIntents.

Soubor Info.plist obsahuje také následující položku:

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>IntentsRestrictedWhileLocked</key>
        <array/>
        <key>IntentsSupported</key>
        <array>
            <string>OrderSoupIntent</string>
        </array>
        <key>IntentsRestrictedWhileProtectedDataUnavailable</key>
        <array/>
    </dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.intents-service</string>
    <key>NSExtensionPrincipalClass</key>
    <string>IntentHandler</string>
</dict>

Ve výše uvedeném souboru Info.plist:

  • IntentsRestrictedWhileLocked zobrazuje záměry, které se mají zpracovat, když je zařízení odemknuté.
  • IntentsSupported zobrazí seznam záměrů zpracovaných tímto rozšířením.
  • NSExtensionPointIdentifier určuje typ rozšíření aplikace. Další informace najdete v dokumentaci společnosti Apple.
  • NSExtensionPrincipalClass určuje třídu, která se má použít ke zpracování záměrů podporovaných tímto rozšířením.
SoupChefIntents – Entitlements.plist

Oprávnění.plist v projektu SoupChefIntentsfunkci Skupiny aplikací. Tato funkce je nakonfigurovaná tak, aby používala stejnou skupinu aplikací jako projekt SoupChef :

<key>com.apple.security.application-groups</key>
<array>
    <string>group.com.xamarin.SoupChef</string>
</array>

Chef polévky udržuje data s NSUserDefaults. Aby bylo možné sdílet data mezi aplikací a rozšířením aplikace, odkazují ve svých souborech Entitlements.plist na stejnou skupinu aplikací.

Poznámka:

Konfigurace sestavení projektu SoupChefIntents nastaví vlastní nároky na Entitlements.plist.

Zpracování úlohy OrderSoupIntent na pozadí

Rozšíření Intents provádí nezbytné úlohy na pozadí pro zástupce na základě vlastního záměru.

Siri volá metodu IntentHandler třídy (definovanou v souboru Info.plist jako ) NSExtensionPrincipalClassk získání instance třídy, která rozšiřuje OrderSoupIntentHandling, který lze použít ke zpracování OrderSoupIntent:GetHandler

[Register("IntentHandler")]
public class IntentHandler : INExtension
{
    public override NSObject GetHandler(INIntent intent)
    {
        if (intent is OrderSoupIntent)
        {
            return new OrderSoupIntentHandler();
        }
        throw new Exception("Unhandled intent type: ${intent}");
    }

    protected IntentHandler(IntPtr handle) : base(handle) { }
}

OrderSoupIntentHandler, definovaný v projektu SoupKit sdíleného kódu, implementuje dvě důležité metody:

  • ConfirmOrderSoup – Potvrdí, zda má být úkol přidružený k záměru skutečně proveden.
  • HandleOrderSoup – Umístí objednávku polévky a odpoví uživateli zavoláním obslužné rutiny předané dokončení.

Zpracování ObjednávkySoupIntent, která otevře aplikaci

Aplikace musí správně zpracovávat záměry, které se nespouštějí na pozadí. Tyto záměry se zpracovávají stejným způsobem jako NSUserActivity klávesové zkratky v ContinueUserActivity metodě AppDelegate:

public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
    var intent = userActivity.GetInteraction()?.Intent as OrderSoupIntent;
    if (!(intent is null))
    {
        HandleIntent(intent);
        return true;
    }
    // ...
}  

Poskytnutí uživatelského rozhraní pro vlastní záměr

Rozšíření uživatelského rozhraní Intents poskytuje vlastní uživatelské rozhraní pro rozšíření Intents. V řešení SoupChef je PolévkChefIntentsUI rozšíření Intents UI, které poskytuje rozhraní pro SoupChefIntents.

SoupChefIntentsUI – Info.plist a Entitlements.plist

SoupChefIntentsUI – Info.plist

Info.plist v projektu SoupChefIntentsUI definuje identifikátor svazku jako com.xamarin.SoupChef.SoupChefIntentsui.

Soubor Info.plist obsahuje také následující položku:

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>IntentsSupported</key>
        <array>
            <string>OrderSoupIntent</string>
        </array>
        <!-- ... -->
    </dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.intents-ui-service</string>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
</dict>

Ve výše uvedeném souboru Info.plist:

  • IntentsSupported označuje, že toto OrderSoupIntent rozšíření uživatelského rozhraní Intents zpracovává.
  • NSExtensionPointIdentifier určuje typ rozšíření aplikace. Další informace najdete v dokumentaci společnosti Apple.
  • NSExtensionMainStoryboard určuje scénář, který definuje primární rozhraní tohoto rozšíření.

SoupChefIntentsUI – Nároky.plist

Projekt SoupChefIntentsUI nepotřebuje soubor Entitlements.plist .

Vytvoření uživatelského rozhraní

Vzhledem k tomu, Info.plist pro SoupChefIntentsUI nastaví NSExtensionMainStoryboard klíč na MainInterface, MainInterace.storyboard soubor definuje rozhraní pro rozšíření Intents UI.

V této scénáře existuje jeden kontroler zobrazení typu IntentViewController. Odkazuje na dvě zobrazení:

  • invoiceView, typu InvoiceView
  • confirmationView, typu ConfirmOrderView

Poznámka:

Rozhraní pro invoiceView a confirmationView jsou definována v Main.storyboard jako sekundární zobrazení. Visual Studio pro Mac a Visual Studio 2017 neposkytují podporu pro zobrazení nebo úpravu sekundárních zobrazení. Uděláte to tak, že otevřete Main.storyboard v Tvůrci rozhraní Xcode.

IntentViewController implementuje IINUIHostedViewControlling slouží k poskytování vlastního rozhraní při práci se záměry Siri. ConfigureView metoda se volá k přizpůsobení rozhraní, zobrazení potvrzení nebo faktury v závislosti na tom, zda je interakce potvrzena (INIntentHandlingStatus.Ready) nebo byla úspěšně provedena (INIntentHandlingStatus.Success):

[Export("configureViewForParameters:ofInteraction:interactiveBehavior:context:completion:")]
public void ConfigureView(
    NSSet<INParameter> parameters,
    INInteraction interaction,
    INUIInteractiveBehavior interactiveBehavior,
    INUIHostedViewContext context,
    INUIHostedViewControllingConfigureViewHandler completion)
{
    // ...
    if (interaction.IntentHandlingStatus == INIntentHandlingStatus.Ready)
    {
        desiredSize = DisplayInvoice(order, intent);
    }
    else if(interaction.IntentHandlingStatus == INIntentHandlingStatus.Success)
    {
        var response = interaction.IntentResponse as OrderSoupIntentResponse;
        if (!(response is null))
        {
            desiredSize = DisplayOrderConfirmation(order, intent, response);
        }
    }
    completion(true, parameters, desiredSize);
}

Tip

Další informace o metodě najdete v ConfigureView prezentaci WWDC 2017 společnosti Apple, co je nového v SiriKitu.

Vytvoření hlasové zkratky

Polévka Chef poskytuje rozhraní pro přiřazení hlasové zkratky ke každé objednávce, což umožňuje objednat polévku pomocí Siri. Ve skutečnosti rozhraní používané k záznamu a přiřazování hlasových zkratek poskytuje iOS a vyžaduje malý vlastní kód.

Když OrderDetailViewControlleruživatel klepne na řádek Přidat do Siri tabulky, RowSelected zobrazí metoda obrazovku pro přidání nebo úpravu hlasové zkratky:

public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
    // ...
    else if (TableConfiguration.Sections[indexPath.Section].Type == OrderDetailTableConfiguration.SectionType.VoiceShortcut)
    {
        INVoiceShortcut existingShortcut = VoiceShortcutDataManager?.VoiceShortcutForOrder(Order);
        if (!(existingShortcut is null))
        {
            var editVoiceShortcutViewController = new INUIEditVoiceShortcutViewController(existingShortcut);
            editVoiceShortcutViewController.Delegate = this;
            PresentViewController(editVoiceShortcutViewController, true, null);
        }
        else
        {
            // Since the app isn't yet managing a voice shortcut for
            // this order, present the add view controller
            INShortcut newShortcut = new INShortcut(Order.Intent);
            if (!(newShortcut is null))
            {
                var addVoiceShortcutVC = new INUIAddVoiceShortcutViewController(newShortcut);
                addVoiceShortcutVC.Delegate = this;
                PresentViewController(addVoiceShortcutVC, true, null);
            }
        }
    }
}

Na základě toho, zda existuje existující hlasová zkratka pro aktuálně zobrazené pořadí, RowSelected zobrazí kontroler zobrazení typu INUIEditVoiceShortcutViewController nebo INUIAddVoiceShortcutViewController. V každém případě se OrderDetailViewController nastaví jako kontroler Delegatezobrazení , což je důvod, proč také implementuje IINUIAddVoiceShortcutViewControllerDelegate a IINUIEditVoiceShortcutViewControllerDelegate.

Testování na zařízení

Pokud chcete spustit polévkový chef na zařízení, postupujte podle pokynů v této části. Přečtěte si také poznámku o automatickém zřizování.

Skupina aplikací, ID aplikací, zřizovací profily

V části Certifikáty, ID a profily portálu Apple Developer Portal proveďte následující kroky:

  • Vytvořte skupinu aplikací pro sdílení dat mezi aplikací Soup Chef a jejími rozšířeními. Příklad: group.com.yourcompanyname.SoupChef

  • Vytvořte tři ID aplikací: jednu pro samotnou aplikaci, jednu pro rozšíření Intents a jednu pro rozšíření uživatelského rozhraní Intents. Příklad:

    • Aplikace: com.yourcompanyname.SoupChef

      • K tomuto ID aplikace přiřaďte možnosti SiriKitu a skupin aplikací.
    • Rozšíření Intents: com.yourcompanyname.SoupChef.Intents

      • K tomuto ID aplikace přiřaďte funkci Skupiny aplikací.
    • Rozšíření uživatelského rozhraní Intents: com.yourcompanyname.SoupChef.Intentsui

      • Toto ID aplikace nepotřebuje žádné speciální funkce.
  • Po vytvoření výše uvedených ID aplikací upravte funkci Skupiny aplikací přiřazenou aplikaci a rozšíření Intents (Záměry) a určete konkrétní skupinu aplikací vytvořenou dříve.

  • Vytvořte tři nové zřizovací profily vývoje, jeden pro každou z nových ID aplikací.

  • Stáhněte si tyto zřizovací profily a poklikejte na každý z nich a nainstalujte ho. Pokud Visual Studio pro Mac nebo Visual Studio 2017 už běží, restartujte ho, abyste se ujistili, že zaregistruje nové zřizovací profily.

Úprava souboru Info.plist, Entitlements.plist a zdrojového kódu

V Visual Studio pro Mac nebo sadě Visual Studio 2017 proveďte následující kroky:

  • Aktualizujte různé soubory Info.plist v řešení. Nastavte aplikaci, rozšíření Intents a Intents UI Bundle Identifier na ID aplikací definovaných dříve:

    • Aplikace: com.yourcompanyname.SoupChef
    • Rozšíření Intents: com.yourcompanyname.SoupChef.Intents
    • Rozšíření uživatelského rozhraní Intents: com.yourcompanyname.SoupChef.Intentsui
  • Aktualizujte soubor Entitlements.plist pro projekt SoupChef:

    • U možnosti Skupiny aplikací nastavte skupinu na novou skupinu aplikací vytvořenou dříve (v předchozím příkladu byla group.com.yourcompanyname.SoupChef).
    • Ujistěte se, že je SiriKit povolený.
  • Aktualizujte soubor Entitlements.plist pro projekt SoupChefIntents:

    • U možnosti Skupiny aplikací nastavte skupinu na novou skupinu aplikací vytvořenou dříve (v předchozím příkladu byla group.com.yourcompanyname.SoupChef).
  • Nakonec otevřete NSUserDefaultsHelper.cs. Nastavte proměnnou AppGroup na hodnotu nové skupiny aplikací (například ji nastavte na group.com.yourcompanyname.SoupChef).

Konfigurace nastavení sestavení

V Visual Studio pro Mac nebo sadě Visual Studio 2017:

  • Otevřete možnosti/vlastnosti projektu SoupChef . Na kartě Podepisování sady prostředků pro iOS nastavte podpisovou identitu na automatický a zřizovací profil pro nový zřizovací profil specifický pro aplikaci, který jste vytvořili dříve.

  • Otevřete možnosti/vlastnosti projektu SoupChefIntents . Na kartě Podepisování sady prostředků pro iOS nastavte podpisovou identitu na automatický a zřizovací profil pro nový zřizovací profil specifický pro záměry, který jste vytvořili dříve.

  • Otevřete možnosti/vlastnosti projektu SoupChefIntentsUI . Na kartě Podepisování sady prostředků pro iOS nastavte podpisovou identitu na automatický a zřizovací profil na nový zřizovací profil uživatelského rozhraní záměrů, který jste vytvořili dříve.

Po provedení těchto změn se aplikace spustí na zařízení s iOSem.

Automatické zřizování

Automatické zřizování můžete použít k provádění mnoha těchto úloh zřizování přímo v integrovaném vývojovém prostředí (IDE). Automatické zřizování ale nenastavuje skupiny aplikací. Budete muset ručně nakonfigurovat soubory Entitlements.plist s názvem skupiny aplikací, kterou chcete použít, přejděte na Portál pro vývojáře Apple a vytvořte skupinu aplikací, přiřaďte tuto skupinu aplikací každému ID aplikace vytvořenému automatickým zřizováním, vygenerujte znovu zřizovací profily (aplikace, rozšíření Intents, Intents UI) tak, aby zahrnovala nově vytvořenou skupinu aplikací. a stáhněte a nainstalujte je.