Scorciatoie Siri: come implementarle?

Pubblicato: 2020-01-16

Le 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?

Processo di creazione di scorciatoie Siri
  1. 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à.
  2. 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.
  3. 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 & Intents - esempi di scorciatoie Siri

NSUserActivity: creeremo una scorciatoia che ci consentirà di avviare la schermata per effettuare un nuovo ordine

  1. 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
} 
Processo di implementazione delle scorciatoie Siri per ordinare un hamburger

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.

Le opzioni: Visualizza scorciatoie recenti e Visualizza donazioni su schermata di blocco
  1. Crea un file di definizione dell'intento. Il modo migliore è aggiungerlo a un framework separato nel mio progetto sarà in OrderKit .
Icona del file di definizione dell'intento SiriKit

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.

Intento personalizzato, parametri e tipi di scorciatoia
Definizione dell'ordine: crea un'intenzione personalizzata
Definizione dell'ordine: definire le risposte
Definizione dell'ordine: definire le risposte

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

Icona dell'estensione degli intenti
File -> Nuovo -> Destinazione... -> Estensione di intenti
Ecco come dovrebbe apparire l'appartenenza a Target per Order.intentdefinition

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

Creazione dell'interfaccia utente per l'intento
Creazione dell'interfaccia utente per il nostro intento

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"))
    }
    
} 
Siri Scorciatoia Demo

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