Condividi tramite


Aggiornamenti di SiriKit in iOS 11

SiriKit è stato introdotto in iOS 10, con un certo numero di domini di servizio (tra cui allenamenti, prenotazione di corse e chiamate). Vedere la sezione SiriKit per i concetti relativi a SiriKit e come implementare SiriKit nell'app.

Demo dell'elenco attività di Siri

SiriKit in iOS 11 aggiunge questi domini finalità nuovi e aggiornati:

  • Elenchi e note - Nuovo! Fornisce un'API per le app per elaborare attività e note.
  • Codici visivi - Nuovo! Siri può visualizzare codici a matrice per condividere le informazioni di contatto o partecipare alle transazioni di pagamento.
  • Pagamenti : sono state aggiunte finalità di ricerca e trasferimento per le interazioni con pagamento.
  • Prenotazione delle corse : aggiunta delle finalità di annullamento del viaggio e feedback.

Le altre nuove funzionalità includono:

  • Nomi alternativi di app : fornisce alias che aiutano i clienti a indicare a Siri di scegliere come destinazione l'app offrendo nomi/pronunce alternative.
  • Avvio di allenamenti : fornisce la possibilità di avviare un allenamento in background.

Alcune di queste funzionalità sono illustrate di seguito. Per altri dettagli sugli altri, vedere la documentazione di SiriKit di Apple.

Elenchi e note

Il nuovo dominio elenchi e note fornisce un'API per le app per elaborare attività e note tramite richieste vocali di Siri.

Attività

  • Avere un titolo e uno stato di completamento.
  • Facoltativamente, includere una scadenza e una località.

Note

  • Avere un titolo e un campo di contenuto.

Sia le attività che le note possono essere organizzate in gruppi.

Come elaborare una richiesta SiriKit

Elaborare una richiesta SiriKit seguendo questa procedura:

  1. Resolve: convalidare i parametri e richiedere altre informazioni all'utente (se necessario).
  2. Conferma: convalida finale e verifica che la richiesta possa essere elaborata.
  3. Handle : eseguire l'operazione (aggiornamento dei dati o esecuzione di operazioni di rete).

I primi due passaggi sono facoltativi (anche se incoraggiati) e il passaggio finale è obbligatorio. Nella sezione SiriKit sono disponibili istruzioni più dettagliate.

Metodi Resolve e Confirm

Questi metodi facoltativi consentono al codice di eseguire la convalida, selezionare le impostazioni predefinite o richiedere informazioni aggiuntive all'utente.

Ad esempio, per l'interfaccia IINCreateTaskListIntent , il metodo obbligatorio è HandleCreateTaskList. Esistono quattro metodi facoltativi che forniscono un maggiore controllo sull'interazione con Siri:

  • ResolveTitle : convalida il titolo, imposta un titolo predefinito (se appropriato) o segnala che i dati non sono necessari.
  • ResolveTaskTitles : convalida l'elenco delle attività pronunciate dall'utente.
  • ResolveGroupName : convalida il nome del gruppo, sceglie un gruppo predefinito o segnala che i dati non sono necessari.
  • ConfirmCreateTaskList : convalida che il codice possa eseguire l'operazione richiesta, ma non lo esegue (solo i metodi devono modificare i Handle* dati).

Gestire la finalità

Esistono sei finalità negli elenchi e nel dominio delle note, tre per le attività e tre per le note. I metodi che è necessario implementare per gestire queste finalità sono:

  • Per le attività:
    • HandleAddTasks
    • HandleCreateTaskList
    • HandleSetTaskAttribute
  • Per le note:
    • HandleCreateNote
    • HandleAppendToNote
    • HandleSearchForNotebookItems

Ogni metodo ha un tipo di finalità specifico passato, che contiene tutte le informazioni analizzate da Siri dalla richiesta dell'utente (ed eventualmente aggiornato nei Resolve* metodi e Confirm* ). L'app deve analizzare i dati forniti, quindi eseguire alcune azioni per archiviare o elaborare in altro modo i dati e restituire un risultato che Siri parla e mostra all'utente.

Codici di risposta

I metodi obbligatori Handle* e facoltativi Confirm* indicano un codice di risposta impostando un valore sull'oggetto passato al gestore di completamento. Le risposte provengono dall'enumerazione INCreateTaskListIntentResponseCode :

  • Ready : restituisce durante la fase di conferma (ad esempio, da un Confirm* metodo, ma non da un Handle* metodo).
  • InProgress : usato per le attività a esecuzione prolungata, ad esempio un'operazione di rete/server.
  • Success : risponde con i dettagli dell'operazione riuscita (solo da un Handle* metodo).
  • Failure : indica che si è verificato un errore e non è stato possibile completare l'operazione.
  • RequiringAppLaunch : non può essere elaborato dalla finalità, ma l'operazione è possibile nell'app.
  • Unspecified - Non usare: il messaggio di errore verrà visualizzato all'utente.

Altre informazioni su questi metodi e risposte sono disponibili negli elenchi e nella documentazione delle note di SiriKit di Apple.

Implementazione di elenchi e note

Prima di tutto, per aggiungere il supporto di SiriKit, seguire questa procedura per l'app iOS:

  1. Tick SiriKit in Entitlements.plist.
  2. Aggiungere la chiave Privacy – Siri Usage Description (Descrizione utilizzo Siri) a Info.plist insieme a un messaggio per i clienti.
  3. Chiamare il INPreferences.RequestSiriAuthorization metodo nell'app per richiedere all'utente di consentire le interazioni con Siri.
  4. Aggiungere SiriKit all'ID app nel portale per sviluppatori e ricreare i profili di provisioning per includere il nuovo diritto.

Aggiungere quindi un nuovo progetto di estensione all'app per gestire le richieste Siri:

  1. Fare clic con il pulsante destro del mouse sulla soluzione e scegliere Aggiungi > nuovo progetto....
  2. Scegliere il modello Estensione finalità estensione > iOS>.
  3. Verranno aggiunti due nuovi progetti: Finalità e IntentUI. La personalizzazione dell'interfaccia utente è facoltativa, quindi l'esempio include solo il codice nel progetto finalità .

Il progetto di estensione è il percorso in cui verranno elaborate tutte le richieste SiriKit. Come estensione separata, non ha automaticamente alcun modo per comunicare con la tua app principale, in genere viene risolta implementando l'archiviazione file condivisa usando i gruppi di app.

Configurare IntentHandler

La IntentHandler classe è il punto di ingresso per le richieste Siri: ogni finalità viene passata al GetHandler metodo , che restituisce un oggetto in grado di gestire la richiesta.

Il codice seguente illustra una semplice implementazione:

[Register("IntentHandler")]
public partial class IntentHandler : INExtension, IINNotebookDomainHandling
{
  protected IntentHandler(IntPtr handle) : base(handle)
  {}
  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;
  }
  // add intent handlers here!
}

La classe deve ereditare da INExtensione perché l'esempio gestisce gli elenchi e le finalità delle note, implementa IINNotebookDomainHandlinganche .

Nota

  • Esiste una convenzione in .NET per le interfacce con il prefisso maiuscolo I, a cui Xamarin è conforme quando si associano protocolli da iOS SDK.
  • Xamarin mantiene anche i nomi dei tipi da iOS e Apple usa i primi due caratteri nei nomi dei tipi per riflettere il framework a cui appartiene un tipo.
  • Per il framework, i Intents tipi sono preceduti da IN* (ad esempio INExtension) ma non da interfacce.
  • Segue anche che i protocolli (che diventano interfacce in C#) finiscono con due Is, ad esempio IINAddTasksIntentHandling.

Gestione delle finalità

Ogni finalità (Aggiungi attività, Imposta attributo attività e così via) viene implementata in un singolo metodo simile a quello illustrato di seguito. Il metodo deve eseguire tre funzioni principali:

  1. Elaborare la finalità : i dati analizzati da Siri vengono resi disponibili in un intent oggetto specifico del tipo di finalità. L'app potrebbe aver convalidato i dati usando metodi facoltativi Resolve* .
  2. Convalidare e aggiornare l'archivio dati: salvare i dati nel file system (usando gruppi di app in modo che l'app iOS principale possa accedervi) o tramite una richiesta di rete.
  3. Fornire risposta : usare il completion gestore per inviare una risposta a Siri per leggere/visualizzare all'utente:
public void HandleCreateTaskList(INCreateTaskListIntent intent, Action<INCreateTaskListIntentResponse> completion)
{
  var list = TaskList.FromIntent(intent);
  // TODO: have to create the list and tasks... in your app data store
  var response = new INCreateTaskListIntentResponse(INCreateTaskListIntentResponseCode.Success, null)
  {
    CreatedTaskList = list
  };
  completion(response);
}

Si noti che null viene passato come secondo parametro alla risposta. Si tratta del parametro dell'attività utente e, quando non viene specificato, verrà usato un valore predefinito. Puoi impostare un tipo di attività personalizzato purché l'app iOS la supporti tramite la NSUserActivityTypes chiave in Info.plist. È quindi possibile gestire questo caso quando l'app viene aperta ed eseguire operazioni specifiche, ad esempio l'apertura a un controller di visualizzazione pertinente e il caricamento dei dati dall'operazione Siri.

Nell'esempio viene inoltre hardcodedato il Success risultato, ma in scenari reali è necessario aggiungere una segnalazione degli errori corretta.

Frasi di test

Le frasi di test seguenti devono funzionare nell'app di esempio:

  • "Fare una lista di generi alimentari con mele, banane e pere in TasksNotes"
  • "Aggiungi attività WWDC in TasksNotes"
  • "Add task WWDC to training list in TasksNotes"
  • "Mark attend WWDC as complete in TasksNotes"
  • "In TasksNotes mi ricorda di acquistare un iphone quando vado a casa"
  • "Contrassegna l'acquisto di iPhone come completato in TasksNotes"
  • "Ricordami di lasciare casa alle 8:00 in TasksNotes"

Creare un nuovo esempio di elenco Impostare l'attività come esempio completo

Nota

Il simulatore iOS 11 supporta i test con Siri (a differenza delle versioni precedenti).

Se si esegue il test su dispositivi reali, non dimenticare di configurare l'ID app e i profili di provisioning per il supporto di SiriKit.

Nomi alternativi

Questa nuova funzionalità di iOS 11 significa che è possibile configurare nomi alternativi per l'app per consentire agli utenti di attivarlo correttamente con Siri. Aggiungere le chiavi seguenti al file Info.plist del progetto di app iOS:

Info.plist che mostra chiavi e valori alternativi del nome dell'app

Con i nomi alternativi delle app impostate, le frasi seguenti funzioneranno anche per l'app di esempio (denominata in realtà TasksNotes):

  • "Fare una lista di generi alimentari con mele, banane e pere in MonkeyNotes"
  • "Aggiungi attività WWDC in MonkeyTodo"

Risoluzione dei problemi

Alcuni errori che potrebbero verificarsi durante l'esecuzione dell'esempio o l'aggiunta di SiriKit alle proprie applicazioni:

NSInternalInconsistencyException

Objective-C eccezione generata. Nome: NSInternalInconsistencyException Reason: Use of the class <INPreferences: 0x60400082ff00> from an app richiede il diritto com.apple.developer.siri. È stata abilitata la funzionalità Siri nel progetto Xcode?

  • SiriKit è selezionata in Entitlements.plist.

  • Entitlements.plist è configurato in Project Options > Build > iOS Bundle Signing (Firma bundle iOS build iOS).

    Opzioni del progetto che mostrano i diritti impostati correttamente

  • (per la distribuzione del dispositivo) L'ID app ha SiriKit abilitato e scaricato il profilo di provisioning.