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:
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:
Tady jsou některé z nich:
- 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.
- 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.
- 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ě:
Spusťte Visual Studio pro Mac a otevřete aplikaci MonkeyChat.
Klikněte pravým tlačítkem na název řešení v oblasti řešení a vyberte Přidat>nový projekt...:
Vyberte knihovnu tříd knihovny>pro iOS>a klikněte na tlačítko Další:
Zadejte
MonkeyChatCommon
název a klikněte na tlačítko Vytvořit: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:
V Průzkumník řešení přetáhněte společný sdílený kód z hlavní aplikace do nativní knihovny.
V případě MonkeyChat přetáhněte složky DataModels a Processors z hlavní aplikace do nativní knihovny:
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ě:
Poklikáním na
Entitlements.plist
soubor v Průzkumník řešení ho otevřete pro úpravy.Přepněte na kartu Zdroj.
com.apple.developer.siri
Přidejte vlastnost, nastavte typ naBoolean
hodnotu a hodnotu naYes
:Uložte změny souboru.
Poklikáním na soubor projektu v Průzkumník řešení ho otevřete pro úpravy.
Vyberte podepisování balíčků iOS a ujistěte se, že
Entitlements.plist
je soubor vybraný v poli Vlastní nároky :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:
Ve webovém prohlížeči přejděte na https://developer.apple.com svůj účet a přihlaste se k ho.
Klikněte na Certifikáty, identifikátory a profily.
Vyberte Zřizovací profily a vyberte ID aplikací a klikněte na + tlačítko.
Zadejte název nového profilu.
Zadejte ID sady podle doporučení společnosti Apple k pojmenování.
Přejděte dolů do části App Services , vyberte SiriKit a klikněte na tlačítko Pokračovat :
Ověřte všechna nastavení a pak odešlete ID aplikace.
Vyberte Vývoj zřizovacích profilů>, klikněte na + tlačítko, vyberte Apple ID a pak klikněte na Pokračovat.
Klikněte na Vybrat vše a potom klikněte na Pokračovat.
Znovu klikněte na Vybrat vše a potom klikněte na Pokračovat.
Zadejte název profilu pomocí návrhů pojmenování společnosti Apple a potom klikněte na Pokračovat.
Spusťte Xcode.
V nabídce Xcode vyberte Předvolby...
Vyberte Účty a potom klikněte na tlačítko Zobrazit podrobnosti...
Klikněte na tlačítko Stáhnout všechny profily v levém dolním rohu:
Ujistěte se, že je ve Xcode nainstalovaný profil zřizování, který jste vytvořili výše.
Otevřete projekt a přidejte podporu SiriKitu do Visual Studio pro Mac.
Poklikejte na
Info.plist
soubor v Průzkumník řešení.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:
V Průzkumník řešení vyberte projekt.
Klikněte pravým tlačítkem myši na projekt a vyberte Možnosti.
Vyberte podepisování balíčků pro iOS, vyberte profil podpisové identity a zřizovací profil vytvořený výše:
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":
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ě:
ParameterVocabularies
Povinné – Definuje vlastní termíny a parametry záměru aplikace, na které se vztahují.IntentPhrases
Volitelné – obsahuje ukázkové fráze používající vlastní termíny definované v objektuParameterVocabularies
.
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:
Klikněte pravým tlačítkem na název projektu v Průzkumník řešení a vyberte Přidat>nový soubor...>iOS:
Poklikáním na
AppIntentVocabulary.plist
soubor v Průzkumník řešení ho otevřete pro úpravy.Klikněte na tlačítko + pro přidání klíče, nastavte název na
ParameterVocabularies
hodnotu a typ naArray
:Rozbalte
ParameterVocabularies
tlačítko a klikněte na + tlačítko a nastavte typ naDictionary
:Klikněte na tlačítko + pro přidání nového klíče, nastavte název a
ParameterNames
typ naArray
: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
ParameterVocabulary
Přidejte klíč ke klíčiParameterVocabularies
pomocí typuArray
:Přidejte nový klíč s typem
Dictionary
:VocabularyItemIdentifier
Přidejte klíč s typemString
a zadejte jedinečné ID termínu:VocabularyItemSynonyms
Přidejte klíč s typemArray
:Přidejte nový klíč s typem
Dictionary
:VocabularyItemPhrase
Přidejte klíč s typemString
a termínem, který aplikace definuje:VocabularyItemPronunciation
Přidejte klíč s typemString
a fonetickou výslovností termínu:VocabularyItemExamples
Přidejte klíč s typemArray
:Přidejte několik
String
klíčů s příkladem použití termínu:Opakujte výše uvedené kroky pro všechny ostatní vlastní termíny, které aplikace potřebuje definovat.
Sbalte
ParameterVocabularies
klíč.IntentPhrases
Přidejte klíč s typemArray
:Přidejte nový klíč s typem
Dictionary
:IntentName
Přidejte klíč s typemString
a záměrem pro příklad:IntentExamples
Přidejte klíč s typemArray
:Přidejte několik
String
klíčů s příkladem použití termínu: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:
Pravým tlačítkem myši klikněte na název řešení v oblasti řešení a vyberte Přidat>nový projekt....
V dialogovém okně vyberte rozšíření záměru rozšíření rozšíření>pro iOS>a klikněte na tlačítko Další:
Potom zadejte název rozšíření záměru a klikněte na tlačítko Další :
Nakonec kliknutím na tlačítko Vytvořit přidejte rozšíření záměru do řešení aplikací:
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 :
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:
- 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.
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:
Pravým tlačítkem myši klikněte na název řešení v oblasti řešení a vyberte Přidat>nový projekt....
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ší:
Potom zadejte název rozšíření záměru a klikněte na tlačítko Další :
Nakonec kliknutím na tlačítko Vytvořit přidejte rozšíření záměru do řešení aplikací:
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 :
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:
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:
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:
- Objekt Intent, který se zpracovává.
- Objekt Intent Response z
Confirm
aHandle
metod rozšíření Intent. - 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í UIViewController
zá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.