Atalhos da Siri — como implementá-los?

Publicados: 2020-01-16

Os atalhos da Siri, um novo recurso apresentado na WWDC do ano passado, oferecem a capacidade de executar determinadas funcionalidades do aplicativo em segundo plano. Não precisamos ligar o aplicativo para usar essas funcionalidades no aplicativo, podemos simplesmente dizer para a Siri, por exemplo, “Hora do Hambúrguer” e o sistema sabe para qual aplicativo esse atalho está atribuído e pede um hambúrguer para nós.

O que são atalhos da Siri?

  • Uma maneira conveniente de realizar tarefas na tela de bloqueio ou na área de pesquisa.
  • Atalhos também podem ser adicionados ao Siri para executar com uma frase de voz no iOS, HomePod e watchOS.
  • Os desenvolvedores adicionam ganchos de atalho em seus aplicativos que permitem que a Siri se conecte a esses atalhos.
  • Usando modelos de aprendizado de máquina de seu comportamento para analisar funções comuns que você executa e sugerir atalhos automaticamente.
  • iOS 12+

Neste artigo, vamos nos concentrar na implementação do atalho de pedidos, um dos aplicativos mais populares dos Atalhos da Siri. Vamos criar um aplicativo simples que permitirá que você peça hambúrgueres

Como podemos criar atalhos da Siri?

Processo de criação de atalhos da Siri
  1. No início, temos que pensar na funcionalidade que o usuário realmente deseja facilitar em nosso aplicativo . Essa deve ser uma funcionalidade que o usuário executa com frequência e exige que o usuário entre na aplicação e passe um longo caminho nela. Os atalhos permitirão encurtar esse caminho para executar a funcionalidade.
  2. Na próxima etapa, você precisa doar um atalho. O que isto significa? Devemos passar a informação ao sistema sobre o fato de termos feito um pedido, por exemplo, um hambúrguer com bacon. Fornecemos essas informações ao sistema e posteriormente a Siri pode nos sugerir em um horário específico para fazer esse pedido específico.
  3. A última coisa a fazer é manipular este atalho, que acontece quando o usuário informa à Siri o comando definido anteriormente , por exemplo, “Hora do hambúrguer”, ou no caso em que o usuário pressiona o atalho sugerido pela Siri na tela de bloqueio.

Ok, talvez nós vamos escrever algum código? Quais são nossas possibilidades como desenvolvedores?

NSUserActivity & Intents - exemplos de atalhos da Siri

NSUserActivity — Criaremos um atalho que nos permitirá abrir a tela para fazer um novo pedido

  1. Adicione a chave ao Info.plist
 <key>NSUserActivityTypes</key>
<matriz>
	<string>com.miquido.SiriShotcutDemo.make-order</string>
</array>

2. Doe o atalho quando o usuário entrar na tela

 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 = "Faça um pedido"
orderActivity.suggestedInvocationPhrase = "Hora do hambúrguer"

let atributos = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem como String)
attribute.contentDescription = "Hambúrgueres deliciosos!"
attribute.thumbnailData = UIImage(named: "logo")?.pngData()
orderActivity.contentAttributeSet = atributos
userActivity = orderActivity

3. No AppDelegate , você deve implementar o delegado continueUserActivity que, após obter esse tipo específico, redirecionará para a tela fornecida

 func application(_ application: UIapplication,
                 continuar userActivity: NSUserActivity,
                 restoreHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == "com.miquido.SiriShotcutDemo.make-order" {
        // trata o aplicativo aberto na tela do pedido
        retornar verdadeiro
    } 
    retorna falso
} 
Processo de implementação de atalhos da Siri para pedir um hambúrguer

Intenções — Implementaremos um atalho para fazer pedidos

Dica profissional antes da implementação:
As intenções aparecem quando o usuário faz algo sistematicamente. No entanto, quando você quiser testar essa funcionalidade para receber sempre uma sugestão da Siri, você deve habilitar duas opções — “ Exibir atalhos recentes ” e “ Exibir doações na tela de bloqueio ” em Configurações -> Desenvolvedor.

As opções: Exibir atalhos recentes e exibir doações na tela de bloqueio
  1. Crie um arquivo de definição de intenção. A melhor maneira é adicioná-lo a um framework separado no meu projeto, ele estará em OrderKit .
Ícone do arquivo de definição de intenção do SiriKit

2. Selecione uma categoria, neste caso “Ordem”. Neste arquivo temos que escolher os parâmetros que passaremos ao sistema e criar combinações destes parâmetros.

Intenção personalizada, parâmetros e tipos de atalho
Definição de pedido – Criar intenção personalizada
Definição do pedido — Defina as respostas
Definição do pedido — Defina as respostas

3. Crie um novo destino com uma extensão para intenções, selecione “Incluir extensão de interface do usuário” ao criá-lo.

Ícone de extensão de intents
Arquivo -> Novo -> Destino… -> Extensão de Intenções
É assim que a associação de destino deve ser para Order.intentdefinition

4. Crie uma UI para intenção no arquivo MainInterface.storyboard .

Como criar IU para a intent
Criando a interface do usuário para nossa intenção

5. Configure o estado ready e bem- success em IntentViewController .

 func configureView(para parâmetros: Set<INParameter>,
                       de interação: INInteraction,
                       InteractiveBehavior: INUIInteractiveBehavior,
                       contexto: INUIHostedViewContext,
                       conclusão: @escaping (Bool, Set<INParameter>, CGSize) -> Void) {
        
    guard deixe intenção = interação.intenção como? OrderIntent else {
        complete(false, Set(), .zero)
        Retorna
    }
    if interação.intentHandlingStatus == .ready {
        setup(com: intenção)
        waitTime.isHidden = true
        conclusão(true, parâmetros, tamanho desejado)
    } senão se interação.intentHandlingStatus == .success,
        deixe resposta = interação.intentResponse como? OrderIntentResponse {
        setup(com: intenção)
        waitTime.isHidden = false
        if let waitTimeText = response.waitTime {
            waitTime.text = "O pedido estará pronto em \(waitTimeText) minutos"
        }
        EverythingIsOkLabel.text = "Toque para mostrar os pedidos "
        conclusão(true, parâmetros, tamanho desejado)
    }

    conclusão(false, parâmetros, .zero)
}

configuração de função privada (com intenção: OrderIntent) {
    burgerNameLabel.text = intent.burgerName
    if deixe quantidade = intent.quantity?.stringValue {
        quantidadeLabel.text = "\(quantidade) unidades."
    }
    if let adições = intent.additions {
        adiçõesLabel.text = adições.elements.toString
    }
}

6. Após criar a UI, podemos ir para a doação de nossa intenção. Nesse caso, é melhor doar intenções ao fazer o pedido. Fornecemos ao sistema todas as informações que definimos anteriormente no arquivo Order.intentdefinition , ou seja, nome do hambúrguer, quantidade e acréscimos, e a frase proposta exibida no caso em que desejamos adicionar imediatamente esse atalho ao Siri ao fazer o pedido .

 função privada donateInteraction(para pedido: Pedido) {
    let interação = INInteraction(intent: order.intent, response: nil)
    
    interação.doar { (erro) em
        se erro != nil {
            // trata o erro
        } senão {
            print("Interação doada com sucesso")
        }
    }
} 
 Pedido de extensão pública {
    
    var intent: OrderIntent {
        deixe ordemIntenção = OrdemIntenção()
        orderIntent.burgerName = nome
        if deixe intValue = Int(quantidade) {
            orderIntent.quantity = NSNumber(valor: intValue)
        }
        orderIntent.suggestedInvocationPhrase = "Hora do hambúrguer"
        
        orderIntent.additions = adições.map { opção -> INObject in
            return INObject(identificador: opção.rawValue,
                            exibição: opção.rawValue)
        }
        pedido de devoluçãoIntenção
    }
    
}

7. Agora podemos lidar com a situação que vai acontecer no caso em que o usuário recebe a sugestão de um atalho e clica nele e caso o usuário chame o atalho pela Siri.

 classe pública OrderIntentHandler: NSObject, OrderIntentHandling {
    
    public func confirm(intenção: OrderIntent,
                        conclusão: @escaping (OrderIntentResponse) -> Void) {
        conclusão(OrderIntentResponse(código: OrderIntentResponseCode.ready, userActivity: nil))
    }
    
    public func handle(intent: OrderIntent, 
                       conclusão: @escaping (OrderIntentResponse) -> Void) {
        guard let burgerName = intent.burgerName else {
            conclusão(OrderIntentResponse(código: .failure, userActivity: nil))
            Retorna
        }
        
        Defaults.save(pedido: Pedido(de: intenção))
        conclusão(OrderIntentResponse.success(burgerName: burgerName, waitTime: "5"))
    }
    
} 
Demonstração do atalho da Siri

Isso é tudo, tudo funciona

Você pode conferir todo o projeto no meu GitHub aqui

Fontes:

  • 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