Scorciatoie Siri: come implementarle?
Pubblicato: 2020-01-16Le scorciatoie Siri, una nuova funzionalità presentata al WWDC dello scorso anno, offrono la possibilità di eseguire determinate funzionalità dell'applicazione in background. Non è necessario attivare l'applicazione per utilizzare queste funzionalità nell'applicazione, possiamo semplicemente dire a Siri, ad esempio "Burger Time" e il sistema sa a quale applicazione è assegnata questa scorciatoia e ordina un hamburger per noi.
Cosa sono le scorciatoie di Siri?
- Un modo conveniente per eseguire attività dalla schermata di blocco o dall'area di ricerca.
- È anche possibile aggiungere scorciatoie a Siri per l'esecuzione con una frase vocale su iOS, HomePod e watchOS.
- Gli sviluppatori aggiungono collegamenti alle loro app che consentono a Siri di connettersi a questi collegamenti.
- Utilizzo di modelli di apprendimento automatico del tuo comportamento per analizzare le funzioni comuni che esegui e suggerire scorciatoie automaticamente.
- iOS 12+
In questo articolo, ci concentreremo sull'implementazione del collegamento all'ordine, una delle applicazioni più popolari di Siri Shortcuts. Creeremo una semplice applicazione che ti permetterà di ordinare hamburger
Come possiamo creare scorciatoie Siri?

- All'inizio, dobbiamo pensare alle funzionalità che l'utente vuole davvero rendere più semplice nella nostra applicazione . Questa dovrebbe essere una funzionalità che l'utente esegue frequentemente e richiede all'utente di accedere all'applicazione e di passare un lungo percorso al suo interno. I collegamenti consentiranno di abbreviare questo percorso per eseguire la funzionalità.
- Nel passaggio successivo, devi donare una scorciatoia. Cosa significa questo? Dobbiamo trasmettere le informazioni al sistema sul fatto che abbiamo effettuato un ordine, ad esempio un hamburger con pancetta. Forniamo queste informazioni al sistema e successivamente Siri può suggerirci in un momento specifico di effettuare questo specifico ordine.
- L'ultima cosa da fare è gestire questa scorciatoia, che si verifica quando l'utente comunica a Siri il comando definito in precedenza , ad esempio "Tempo dell'hamburger", o nel caso in cui l'utente preme la scorciatoia suggerita da Siri nella schermata di blocco.
Ok, forse scriviamo del codice? Quali sono le nostre possibilità come sviluppatori?

NSUserActivity: creeremo una scorciatoia che ci consentirà di avviare la schermata per effettuare un nuovo ordine
- Aggiungi la chiave a Info.plist
<key>NSUserActivityTypes</key> <array> <string>com.miquido.SiriShotcutDemo.make-order</string> </array>
2. Dona il collegamento quando l'utente entra nella schermata
let orderActivity = NSUserActivity(activityType: "com.miquido.SiriShotcutDemo.make-order") orderActivity.persistentIdentifier = NSUserActivityPersistentIdentifier("com.miquido.SiriShotcutDemo.make-order") orderActivity.isEligibleForSearch = true orderActivity.isEligibleForPrediction = true orderActivity.title = "Fai un ordine" orderActivity.suggestedInvocationPhrase = "Ora dell'hamburger" let attributi = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String) attributi.contentDescription = "Hamburger deliziosi!" attributi.thumbnailData = UIImage(denominato: "logo")?.pngData() orderActivity.contentAttributeSet = attributi userActivity = orderActivity
3. In AppDelegate
, devi implementare continueUserActivity
delegato che, dopo aver ottenuto questo particolare tipo, reindirizzerà alla schermata indicata
applicazione func(_ applicazione: UIApplication, continua userActivity: NSUserActivity, gestore ripristino: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { if userActivity.activityType == "com.miquido.SiriShotcutDemo.make-order" { // gestisce l'app aperta nella schermata dell'ordine restituisce vero } restituisce falso }

Intenzioni — Implementeremo una scorciatoia per effettuare ordini
Suggerimento professionale prima dell'implementazione:
Le intenzioni appaiono quando l'utente fa qualcosa in modo sistematico. Tuttavia, quando vuoi testare questa funzionalità in modo da ricevere sempre un suggerimento da Siri, devi abilitare due opzioni: " Visualizza scorciatoie recenti " e " Visualizza donazioni su blocco schermo " in Impostazioni -> Sviluppatore.

- Crea un file di definizione dell'intento. Il modo migliore è aggiungerlo a un framework separato nel mio progetto sarà in
OrderKit
.

2. Seleziona una categoria, in questo caso “Ordine”. In questo file dobbiamo scegliere i parametri che passeremo al sistema e creare combinazioni di questi parametri.


3. Crea un nuovo target con un'estensione per le intenzioni, seleziona "Includi estensione UI" durante la creazione.



Order.intentdefinition
4. Creare un'interfaccia utente per l'intento nel file MainInterface.storyboard
.

5. Configurare lo stato ready
e di success
in IntentViewController
.
func configureView(per parametri: Set<INParameter>, di interazione: INInteraction, Comportamento interattivo: INUIComportamento interattivo, contesto: INUIHostedViewContext, completamento: @escaping (Bool, Set<INParameter>, CGSize) -> Void) { guard let intent = interaction.intent as? OrderIntent altro { completamento(false, Set(), .zero) Restituzione } se interazione.intentHandlingStatus == .ready { configurazione (con: intento) waitTime.isHidden = vero completamento(true, parametri, dimensione desiderata) } altrimenti se interaction.intentHandlingStatus == .success, let response = interaction.intentResponse as? OrderIntentResponse { configurazione (con: intento) waitTime.isHidden = falso se lascia waitTimeText = response.waitTime { waitTime.text = "L'ordine sarà pronto tra \(waitTimeText) minuti" } EverythingIsOkLabel.text = "Tocca per mostrare gli ordini " completamento(true, parametri, dimensione desiderata) } completamento(false, parametri, .zero) } configurazione della funzione privata (con intento: OrderIntent) { burgerNameLabel.text = intent.burgerName if let quantità = intent.quantity?.stringValue { quantitàLabel.text = "\(quantità) pz." } if let addizioni = intent.additions { addizioniLabel.text = addizioni.elementi.toString } }
6. Dopo aver creato l'interfaccia utente, possiamo andare alla donazione di nostra intenzione. In questo caso, è meglio donare intenzioni al momento dell'ordine. Forniamo tutte le informazioni al sistema che abbiamo precedentemente definito nel file Order.intentdefinition
, ovvero nome dell'hamburger, quantità e aggiunte, e la frase proposta visualizzata nel caso in cui vorremmo aggiungere immediatamente questa scorciatoia a Siri al momento dell'ordine .
private func donateInteraction(per ordine: Ordine) { let interaction = INInteraction(intent: order.intent, response: nil) interazioni.donate { (errore) in se errore != nullo { // gestisce l'errore } altro { print("Interazione donata con successo") } } }
estensione pubblica Ordina { var intent: OrderIntent { let orderIntent = OrderIntent() orderIntent.burgerName = nome if let intValue = Int(quantity) { orderIntent.quantity = NSNumber(valore: intValue) } orderIntent.suggestedInvocationPhrase = "Ora dell'hamburger" orderIntent.additions = addizioni.map { opzione -> INObject in restituisce INObject(identificatore: opzione.rawValue, display: opzione.rawValue) } ordine di resoIntent } }
7. Ora possiamo gestire la situazione cosa accadrà nel caso in cui l'utente riceve il suggerimento di una scorciatoia e fa clic su di essa e nel caso in cui l'utente chiami la scorciatoia da Siri.
classe pubblica OrderIntentHandler: NSObject, OrderIntentHandling { conferma della funzione pubblica (intento: OrderIntent, completamento: @escaping (OrderIntentResponse) -> Void) { completamento(OrderIntentResponse(codice: OrderIntentResponseCode.ready, userActivity: nil)) } handle di funzione pubblica (intento: OrderIntent, completamento: @escaping (OrderIntentResponse) -> Void) { guard let burgerName = intent.burgerName else { completamento(OrderIntentResponse(code: .failure, userActivity: nil)) Restituzione } Defaults.save(order: Order(from: intent)) completamento(OrderIntentResponse.success(burgerName: burgerName, waitTime: "5")) } }

Questo è tutto, tutto funziona
Puoi controllare l'intero progetto sul mio GitHub qui
Fonti:
- https://developer.apple.com/videos/play/wwdc2018/211/
- https://developer.apple.com/videos/play/wwdc2018/214/
- https://developer.apple.com/documentation/sirikit/donating_shortcuts
- https://developer.apple.com/design/human-interface-guidelines/sirikit/overview/siri-shortcuts/
- https://www.raywenderlich.com/6462-siri-shortcuts-tutorial-in-ios-12