Atalhos da Siri — como implementá-los?
Publicados: 2020-01-16Os 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?

- 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.
- 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.
- 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 — Criaremos um atalho que nos permitirá abrir a tela para fazer um novo pedido
- 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 }

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.

- 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
.

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.


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



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

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")) } }

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